slide2

Similar documents
SIGPLwinterschool2012

2009 대수능 한국근현대사 해설.hwp



PowerPoint 프레젠테이션

1

본 발명은 중공코어 프리캐스트 슬래브 및 그 시공방법에 관한 것으로, 자세하게는 중공코어로 형성된 프리캐스트 슬래브 에 온돌을 일체로 구성한 슬래브 구조 및 그 시공방법에 관한 것이다. 이를 위한 온돌 일체형 중공코어 프리캐스트 슬래브는, 공장에서 제작되는 중공코어 프

03장.스택.key

2힉년미술

2014밝고고운동요부르기-수정3

2005프로그램표지

HW5 Exercise 1 (60pts) M interpreter with a simple type system M. M. M.., M (simple type system). M, M. M., M.

ENE414 프로그래밍언어론강의노트 1 1 문법, 핵심구문나무, 인터프리터 한양대학교 ERICA캠퍼스컴퓨터공학과도경구 2012년 1학기 (version 0.35) 1 c David A. Schmidt, 도경구 (2012). 본문서는 Kansas State Univers

OCaml

텀블러514

PowerPoint 프레젠테이션

C++-¿Ïº®Çؼ³10Àå

K&R2 Reference Manual 번역본

많이 이용하는 라면,햄버그,과자,탄산음료등은 무서운 병을 유발하고 비만의 원인 식품 이다. 8,등겨에 흘려 보낸 영양을 되 찾을 수 있다. 도정과정에서 등겨에 흘려 보낸 영양 많은 쌀눈과 쌀껍질의 영양을 등겨를 물에 우러나게하여 장시간 물에 담가 두어 영양을 되 찾는다

Microsoft Word - FunctionCall

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

chap 5: Trees

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap6 [호환 모드]

13주-14주proc.PDF

046~64

Homework 3 SNU , 2011 가을이광근 Program Due: 10/10, 24:00 Essay Due: 10/12, 15:30 이번숙제의목적은 : 수업시간에살펴본, 상식적인명령형언어의정확한정의를이해하고그실행기를구현해보기. 상식적인수준에서디자인

Microsoft PowerPoint - semantics

Modern Javascript

Week5

특허청구의 범위 청구항 1 앵커(20)를 이용한 옹벽 시공에 사용되는 옹벽패널에 있어서, 단위패널형태의 판 형태로 구성되며, 내부 중앙부가 후방 하부를 향해 기울어지도록 돌출 형성되어, 전면이 오 목하게 들어가고 후면이 돌출된 결속부(11)를 형성하되, 이 결속부(11

C프로-3장c03逞풚

Exercise (10pts) k-친수 일반적으로 k진수(k > 1)는 다음과 같이 표현한다. d0 dn 여기서 di {0,, k 1}. 그리고 d0 dn 은 크기가 d0 k dn k n 인 정수를 표현한다. 이것을 살짝 확장해서 k친수 를 다음과 같이 정의

T100MD+


Semantic Consistency in Information Exchange


Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

슬라이드 1

C# Programming Guide - Types

PL10

untitled

(72) 발명자 오인환 서울 노원구 중계로 195, 101동 803호 (중계동, 신 안동진아파트) 서혜리 서울 종로구 평창14길 23, (평창동) 한훈식 서울 강남구 언주로71길 25-5, 301호 (역삼동, 영 훈하이츠) 이 발명을 지원한 국가연구개발사업 과제고유번호

DBPIA-NURIMEDIA

6주차.key

Observational Determinism for Concurrent Program Security

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

untitled

기본자료형만으로이루어진인자를받아서함수를결과값으로반환하는고차함수 기본자료형과함수를인자와결과값에모두이용하는고차함수 다음절에서는여러가지예를통해서고차함수가어떤경우에유용한지를설명한다. 2 고차함수의 예??장에서대상체만바뀌고중간과정은동일한계산이반복될때함수를이용하면전체연산식을간 단

(72) 발명자 서진교 경기 용인시 수지구 풍덕천2동 1167 진산마을 삼성5차아파트526동 1004호 조필제 경기 용인시 풍덕천동 유스빌 401호 - 2 -

歯처리.PDF

5.스택(강의자료).key

SNU =10100 =minusby by1000 ÇÁto0.03exÇÁto0.03exÇÁ=10100 =minusby by1000 ·Îto0.03ex·Îto0.03ex·Î=10100 =minusby by1000 ±×to0.

Deok9_Exploit Technique

확률 및 분포

EBS직탐컴퓨터일반-06-OK

SNU =10100 =minusby by1000 ÇÁto0.03exÇÁto0.03exÇÁ=10100 =minusby by1000 ·Îto0.03ex·Îto0.03ex·Î=10100 =minusby by1000 ±×to0.

6.1 Addresses and Pointers Recall memory concepts from Ch2 ch6_testbasicpointer.c int x1=1, x2=7; double distance; int *p; int q=8; p = &q; name addre

chap10.PDF

(71) 출원인 나혜원 대구 달서구 도원동 1438 대곡사계절타운 나혜리 대구 달서구 도원동 1438 대곡사계절타운 (72) 발명자 나혜원 대구 달서구 도원동 1438 대곡사계절타운 나혜리 대구 달서구 도원동 1438 대

歯표지.PDF

歯PLSQL10.PDF

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

untitled

3ÆÄÆ®-14

0.1-6

특허청구의 범위 청구항 1 몸체(110)의 일측에는 테스트의 필요성에 따라 여타한 디젤 자동차(100)에서 분리시킨 상태의 분리형 커먼레일 인젝트(110)를 고정할 수 있는 분리형 인젝터 고정부(20)가 구비되고, 그 고정부(20)의 하측에는 분리형 커먼 레일 인젝터(

12-file.key

Homework 2 SNU , Fall 2015 Kwangkeun Yi due: 9/30, 24:00 Exercise 1 (10pts) k- 친수 일반적으로 k 진수 (k > 1) 는다음과같이표현한다. d 0 d n 여기서 d i {0,, k 1}. 그리

8장 문자열

휠세미나3 ver0.4

Javascript.pages

강의10

자바 프로그래밍

비긴쿡-자바 00앞부속

<C7D1B1E62DBACEB8B6C0FCB1B9BDC9C6F720C0DAB7E1C1FD2E687770>

Chapter 4. LISTS

PowerPoint 프레젠테이션

ÆÊÇ÷¿

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

PRO1_09E [읽기 전용]

rmi_박준용_final.PDF

02 C h a p t e r Java

알람음을 출력하는 이동통신 단말기에 있어서, 실시간 알람음을 출력하는 음향 출력 수단; 디지털 멀티미디어 방송(DMB: Digital Multimedia Broadcasting, 이하 'DMB'라 칭함) 신호를 수신하면 오디오 형태로 변 환하여 DMB의 음향을 전달하는

3장

( )EBS문제집-수리

Polly_with_Serverless_HOL_hyouk

MySQL-Ch10

G5통신3.PDF

untitled

Chap04(Signals and Sessions).PDF

Microsoft PowerPoint - Java7.pptx

商用

Press Arbitration Commission 62

PRO1_16E [읽기 전용]

hlogin2

Microsoft PowerPoint - a10.ppt [호환 모드]

λx.x (λz.λx.x z) (λx.x)(λz.(λx.x)z) (λz.(λx.x) z) Call-by Name. Normal Order. (λz.z)



Transcription:

Program P ::= CL CommandList CL ::= C C ; CL Command C ::= L = E while E : CL end print L Expression E ::= N ( E + E ) L &L LefthandSide L ::= I *L Variable I ::= <strings> Numeral N ::= <strings of digits> PTREE ::= CLIST CLIST ::= [ CTREE+ ] CTREE ::= ["=", LTREE, ETREE] ["while", ETREE, CLIST] ["print", LTREE] ETREE ::= NUM LTREE [ &, LTREE] [ +, ETREE, ETREE] LTREE ::= ID [ *, LTREE]

y = 5; z = 0; x = (6 + y) [["=", "y", "5"], ["=", "z", "0"], ["=", "x", [ +, 6, y ]] ] program interpclist interpctree interpetree interpltree environment namespace 0 1 2... memory

y = 5; z = 0; x = (6 + y) [["=", "y", "5"], ["=", "z", "0"], ["=", "x", [ +, 6, y ]] ] program interpclist interpctree interpetree interpltree y 0 environment namespace 0 1 2 5... memory

y = 5; z = 0; x = (6 + y) [["=", "y", "5"], ["=", "z", "0"], ["=", "x", [ +, 6, y ]] ] program interpclist interpctree interpetree interpltree y 0 z 1 environment namespace 0 1 2 5 0... memory

y = 5; z = 0; x = (6 + y) [["=", "y", "5"], ["=", "z", "0"], ["=", "x", [ +, 6, y ]] ] program interpclist interpctree interpetree interpltree y 0 z 1 x 2 environment namespace 0 1 2 5 0 11... memory

y = 4; z = &y; x = (7 + *z); *z = (y + 1) program [["=", "y", "4"], ["=", "z", ["&", "y"]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] interpclist interpctree interpetree interpltree environment namespace 0 1 2... memory

y = 4; z = &y; x = (7 + *z); *z = (y + 1) program [["=", "y", "4"], ["=", "z", ["&", "y"]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] interpclist interpctree interpetree interpltree y 0 environment namespace 0 1 2 4... memory

y = 4; z = &y; x = (7 + *z); *z = (y + 1) program [["=", "y", "4"], ["=", "z", ["&", "y"]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] interpclist interpctree interpetree interpltree y 0 z 1 environment namespace 0 1 2 4 0... memory

y = 4; z = &y; x = (7 + *z); *z = (y + 1) program [["=", "y", "4"], ["=", "z", ["&", "y"]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] interpclist interpctree interpetree interpltree y 0 z 1 x 2 environment namespace 0 1 2 4 0 11... memory

y = 4; z = &y; x = (7 + *z); *z = (y + 1) program [["=", "y", "4"], ["=", "z", ["&", "y"]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] interpclist interpctree interpetree interpltree y 0 z 1 x 2 environment namespace 0 1 2 5 0 11... memory

L = E

memory = [] # memory = [5,0,11] env = {} # env = { y =0, z =1, x =2} def interpc(program): # pre: program == PTREE ::= [ CTREE+ ] # post: memory == program () global env, memory env = {} memory = [] interpclist(program) print( final env =, env) print( final memory =, memory) def interpclist(program): # pre: program == CLIST ::= [ CTREE+ ] # post: memory == program () for command in program: interpctree(command)

def interpltree(x): # pre: x == LTREE ::= ID [ *, LTREE] # post: ans == x # returns: ans if isinstance(x,str): if x in env: ans = env[x] else: memory.append( err ) env[x] = len(memory) - 1 ans = env[x] else: y = interpltree(x[1]) ans = memory[y] return ans

def interpctree(c): # pre: c == CTREE ::= [ =, LTREE, ETREE] [ while, ETREE, CLIST] [ print, LTREE] # post: memory == c () op = c[0] if op == = : lval = interpltree(c[1]) rval = interpetree(c[2]) memory[lval] = rval elif op == while : expr = c[1] body = c[2] while (interpetree(expr)!= 0) interpclist(body) elif op == print : print(interpetree(c[1])) else: crash( invalid command )

def interpetree(e): # pre: e == ETREE ::= NUM LTREE [ &, LTREE] [OP, ETREE, ETREE] # post: val == e () # returns: val if isinstance(e,str) and e.isdigit(): val = int(e) elif isinstance(e,list) and e[0] == + :: val1 = interpetree(e[1]) val2 = interpetree(e[2]) val = val1 + val2 elif isinstance(e,list) and e[0] == & : val = interpltree(e[1]) else: x = interpltree(e) val = memory[x] return val

declare y : int; declare z : *int; y = 4; z = &y; declare x : int; x = (7 + *z) *z = (y + 1) declare x : int; x = 0; declare y : int; y = (6 + &x) declare x : int; x = 0; *x = 999

Program P ::= CL CommandList CL ::= C C ; CL Command C ::= L = E while E : CL end print L declare I : T Type T ::= int *T Expression E ::= N ( E1 + E2 ) L &L LefthandSide L ::= I *L Variable I ::= <strings> Numeral N ::= <strings of digits> PTREE ::= [ CTREE+ ] CTREE ::= ["=", LTREE, ETREE] ["while", ETREE, CLIST] ["print", LTREE] [ dec, ID, TYPE] TYPE ::= [ ptr *, int ] ETREE ::= NUM LTREE [ &, LTREE] [ +, ETREE, ETREE] LTREE ::= ID [ *, LTREE]

declare y : int; declare z : *int; y = 4; z = &y; declare x : int; x = (7 + *z) *z = (y + 1) program interpclist interpctree interpetree interpltree environment namespace [[ dec, y, [ int ]], [ dec, z, [ ptr, int ]], ["=", "y", "4"], ["=", "z", ["&", "y"]], [ dec, x, [ int ]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] 0 1 2... memory

declare y : int; declare z : *int; y = 4; z = &y; declare x : int; x = (7 + *z) *z = (y + 1) program interpclist interpctree interpetree interpltree y [ int ], 0 environment namespace [[ dec, y, [ int ]], [ dec, z, [ ptr, int ]], ["=", "y", "4"], ["=", "z", ["&", "y"]], [ dec, x, [ int ]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] 0 1 2... memory

declare y : int; declare z : *int; y = 4; z = &y; declare x : int; x = (7 + *z) *z = (y + 1) program interpclist interpctree interpetree interpltree y [ int ], 0 z [ ptr, int ], 1 environment namespace [[ dec, y, [ int ]], [ dec, z, [ ptr, int ]], ["=", "y", "4"], ["=", "z", ["&", "y"]], [ dec, x, [ int ]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] 0 1 2... memory

declare y : int; declare z : *int; y = 4; z = &y; declare x : int; x = (7 + *z) *z = (y + 1) program interpclist interpctree interpetree interpltree y [ int ], 0 z [ ptr, int ], 1 environment namespace [[ dec, y, [ int ]], [ dec, z, [ ptr, int ]], ["=", "y", "4"], ["=", "z", ["&", "y"]], [ dec, x, [ int ]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] 0 1 2 4... memory

declare y : int; declare z : *int; y = 4; z = &y; declare x : int; x = (7 + *z) *z = (y + 1) program interpclist interpctree interpetree interpltree y [ int ], 0 z [ ptr, int ], 1 environment namespace [[ dec, y, [ int ]], [ dec, z, [ ptr, int ]], ["=", "y", "4"], ["=", "z", ["&", "y"]], [ dec, x, [ int ]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] 0 1 2 4 0... memory

declare y : int; declare z : *int; y = 4; z = &y; declare x : int; x = (7 + *z) *z = (y + 1) program interpclist interpctree interpetree interpltree y [ int ], 0 z [ ptr, int ], 1 x [ int ], 2 environment namespace [[ dec, y, [ int ]], [ dec, z, [ ptr, int ]], ["=", "y", "4"], ["=", "z", ["&", "y"]], [ dec, x, [ int ]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] 0 1 2 4 0... memory

declare y : int; declare z : *int; y = 4; z = &y; declare x : int; x = (7 + *z) *z = (y + 1) program interpclist interpctree interpetree interpltree y [ int ], 0 z [ ptr, int ], 1 x [ int ], 2 environment namespace [[ dec, y, [ int ]], [ dec, z, [ ptr, int ]], ["=", "y", "4"], ["=", "z", ["&", "y"]], [ dec, x, [ int ]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] 0 1 2 4 0 11... memory

declare y : int; declare z : *int; y = 4; z = &y; declare x : int; x = (7 + *z) *z = (y + 1) program interpclist interpctree interpetree interpltree y [ int ], 0 z [ ptr, int ], 1 x [ int ], 2 environment namespace [[ dec, y, [ int ]], [ dec, z, [ ptr, int ]], ["=", "y", "4"], ["=", "z", ["&", "y"]], [ dec, x, [ int ]], ["=", "x", [ +, 7, [ *, z ]]], [ =, [ *, z ], [ +, y, 1 ]] ] 0 1 2 5 0 11... memory

memory = [] # memory = [5,0,11] env = {} # env = { y =([ int ],0), # z =([ ptr, int ],1), # x =([ int ],2)} def interpct(program): # pre: program == PTREE ::= [ CTREE+ ] # post: memory == program () global env, memory env = {} memory = [] interpclist(program) print( final namespace =, namespace) print( final memory =, memory) def interpclist(program): # pre: program == PTREE ::= [ CTREE+ ] # post: memory == program () for command in program: interpctree(command)

def interpltree(x): # pre: x == LTREE ::= ID [ *, LTREE] # post: ans == x (, ) # returns: ans if isinstance(x,str): if x in env: ans = env[x] else: crash( variable,x, undeclared ) else: datatype, loc = interpltree(x[1]) if datatype[0] == ptr : ans = (datatype[1:],memory[loc]) else: crash( variable not a pointer ) return ans

def interpctree(c): # pre: c == CTREE ::= [ =, LTREE, ETREE] [ while, ETREE, CLIST] [ print, LTREE] [ dec, ID, TYPE] TYPE ::= [ ptr *, int ] # post: memory == c () op = c[0] if op == = : type1,lval = interpltree(c[1]) type2,rval = interpetree(c[2]) if type1 == type2: memory[lval] = rval else: crash( incompatible types for assignment ) elif op == while : expr = c[1] body = c[2] type,val = interpetree(expr) while (val!= 0) interpclist(body) type,val = interpetree(expr) elif op == print : type,num = interpltree(c[1]) print(num) elif op == dec : x = c[1] if x in env : crash( variable,x, redeclared ) else: memory.append( err ) env[x] = (c[2],len(memory)-1) else: crash( invalid command )

def interpetree(e): # pre: e == ETREE ::= NUM LTREE [ &, LTREE] [ +, ETREE, ETREE] # post: ans == e (,) # returns: ans if isinstance(e,str) and e.isdigit(): ans = ([ int ],int(e)) elif isinstance(e,list) and e[0] == + :: type1,val1 = interpetree(e[1]) type2,val2 = interpetree(e[2]) if type1 == [ int ] and type2 == [ int ]: ans = ([ int ],val1 + val2) elif isinstance(e,list) and e[0] == & : type,val = interpltree(e[1]) ans = ([ ptr ]+type,val) else: type,loc = interpltree(e) ans = (type,memory[loc]) return ans

x = 7; y = new {f, g}; y.f = x; y.g = new {r}; y.g.r = y.f program interpclist interpctree interpetree interpltree α α heap

x = 7; y = new {f, g}; y.f = x; y.g = new {r}; y.g.r = y.f program interpclist interpctree interpetree interpltree α α x 7 heap

x = 7; y = new {f, g}; y.f = x; y.g = new {r}; y.g.r = y.f program interpclist interpctree interpetree interpltree α α x 7 y β heap β f g

x = 7; y = new {f, g}; y.f = x; y.g = new {r}; y.g.r = y.f program interpclist interpctree interpetree interpltree α α x 7 y β heap β f 7 g

x = 7; y = new {f, g}; y.f = x; y.g = new {r}; y.g.r = y.f program interpclist interpctree interpetree interpltree α α x 7 y β heap β f 7 g ɣ ɣ r

x = 7; y = new {f, g}; y.f = x; y.g = new {r}; y.g.r = y.f program interpclist interpctree interpetree interpltree α α x 7 y β heap β f 7 g ɣ ɣ r 7

Program CommandList Command Expression FieldNames LefthandSide Variable Numeral P ::= CL CL ::= C C ; CL C ::= L = E if E : CL1 else CL2 end print L E ::= N L ( E1 + E2 ) new { F } F ::= I I, F L ::= I L. I I ::= <string> N ::= <string of digits> PTREE ::= CLIST CLIST ::= [ CTREE+ ] CTREE ::= ["=", LTREE, ETREE] ["if", ETREE, CLIST, CLIST] ["print", LTREE] ETREE ::= NUM [ deref, LTREE] [ +, ETREE, ETREE] [ new, OB] OB ::= [ ID+ ] LTREE ::= ID [ dot, LTREE, ID ] ID ::= <string> NUM ::= <string of digits> a = new { f,g }; a.f = 3; a.g = (1 + a.f) [ ["=", ["a"], ["new", ["f","g"]]], ["=", [ dot, "a", "f"], "3"], ["=", [ dot, "a", "g"], ["+", "1", ["deref", [ dot,"a", "f"]]]] ]

L = E α heap x 7 y β β f 7 g ɣ ɣ r β

heap = {} # { ( = )+ } heap_count = 0 # x = 7; y = new {f,g,h}; y.g = 5; z = new {r}; z.r = (y.g + x); y.h = z heap h0 ns h0

heap = {} # { ( = )+ } heap_count = 0 # heap ns x = 7; y = new {f,g,h}; y.g = 5; z = new {r}; z.r = (y.g + x); y.h = z h0 x 7 h0

heap = {} # { ( = )+ } heap_count = 0 # heap ns x = 7; y = new {f,g,h}; y.g = 5; z = new {r}; z.r = (y.g + x); y.h = z h0 x 7 y h1 h0 h1 f nil g nil h nil

heap = {} # { ( = )+ } heap_count = 0 # heap ns x = 7; y = new {f,g,h}; y.g = 5; z = new {r}; z.r = (y.g + x); y.h = z h0 x 7 y h1 h0 h1 f nil g 5 h nil

heap = {} # { ( = )+ } heap_count = 0 # heap ns x = 7; y = new {f,g,h}; y.g = 5; z = new {r}; z.r = (y.g + x); y.h = z h0 x 7 y h1 z h2 h0 h1 f nil g 5 h nil h2 r nil

heap = {} # { ( = )+ } heap_count = 0 # heap ns x = 7; y = new {f,g,h}; y.g = 5; z = new {r}; z.r = (y.g + x); y.h = z h0 x 7 y h1 z h2 h0 h1 f nil g 5 h nil h2 r 12

heap = {} # { ( = )+ } heap_count = 0 # heap ns x = 7; y = new {f,g,h}; y.g = 5; z = new {r}; z.r = (y.g + x); y.h = r heap = { "h0": {"x":7, "y":"h1", "z":"h2"}, "h1": {"f":"nil", "g":5, h : h2 }, h0 h1 x 7 y h1 z h2 f nil g 5 h h2 h0 "h2": {"r":12} } heap_count = 3 h2 r 12

def cleartheheap(): global heap_count, heap heap_count = 0 heap = {} def allocatens(): global heap_count newhandle = h + str(heap_count) heap[newhandle] = {} heap_count = heap_count + 1 return newhandle def lookup(lval): ans = nil handle,fieldname = lval if handle in heap and fieldname in heap[handle] : ans = heap[handle][fieldname] else : crash( lookup error: lval =,str(lval)) return ans def store(lval,rval): handle, fieldname = lval if handle in heap : heap[handle][fieldname] = rval else: crash( store error: lval =,str(lval))

def interpret(program): # pre: program == PTREE ::= [ CTREE+ ] # post: memory == program () global ns cleartheheap() ns = allocatens() interpclist(program) print( final namespace =,namespace) print( final heap =,heap) def interpclist(program): # pre: program == PTREE ::= [ CTREE+ ] # post: memory == program () for command in program: interpctree(command)

def interpctree(c): # pre: c == CTREE ::= [ =, LTREE, ETREE] [ if, ETREE, CLIST, CLIST] [ print, LTREE] # post: heap == c () op = c[0] if op == = : lval = interpltree(c[1]) rval = interpetree(c[2]) store(lval,rval) elif op == if : test = interpetree(c[1]) if test!= 0: interpclist(c[2]) else: interpclist(c[3]) elif op == print : val = lookup(interpltree(c[1])) print(val) else: crash( invalid command )

def interpetree(e): # pre: e == ETREE ::= NUM [ deref, LTREE] [ +, ETREE, ETREE] [ new OBJ] OBJ ::= [ ID+ ] # post: ans == or or nil (+) # returns: ans ans = nil if isinstance(e,str) and e.isdigit(): ans = int(e) elif e[0] == + :: val1 = interpetree(e[1]) val2 = interpetree(e[2]) if isinstance(val1,int) and isinstance(val2,int): ans = val1 + val2 else: crash( addition error - non-int value used ) elif e[0] == deref : lval = interpltree(e[1]) ans = lookup(lval) elif e[0] == new : handle = allocatens() fields = e[1] for f in fields: store((handle,f), nil ) ans = handle else: crash( invalid expression ) return ans

def interpltree(ltree): # pre: x == LTREE ::= ID [ dot, LTREE, ID ] # post: ans == (,) # returns: ans if isinstance(ltree,str) : # ID ans = (ns,ltree) else: # [ dot, LTREE, ID ] lval = interpltree(ltree[1]) handle = lookup(lval) ans = (handle,ltree[2]) return ans

L y y.f y.h.r LTREE ["y"] [ dot, "y", "f"] [ dot, [ dot,"y", "h"], r ] ( h0, y ) ( h1, f ) ( h2, r ) heap h0 x 7 y h1 z h2 ns h0 h1 f nil g 5 h h2 h2 r 12