이전 강좌의 동적 범위 규칙 중 하나인 Central Referencing Table(CRT)를 파이썬을 통해 구현해보자.
우리가 구현하고자하는 그림이다.
- 큰 블록에 작은 블록이 포함되어 있고 A, B, C, D의 관계는 그림과 같다.
- A > B, C
- C > D
- 각 블록은 x, y, v, w 중 1~2개의 값을 가진다.
- hidden stack을 이용하여 값을 저장 및 로드한다.
- 최종적으로 A의 x, B의 y, D의 w가 활성화 되어있다.
코드 구현
#Static information of declared names in block.
names = {
"A": ["x", "y"],
"B": ["x", "v"],
"C": ["w", "y"],
"D": ["w"]
}
#Initialize CRT with static name info.
def init_crt(crt):
for vars in names.values():
for v in vars:
if v not in crt:
crt[v] = [0, ""]
def display(crt, hstack):
print("CRT")
for e in crt.items():
var, flag, ref = e[0], e[1][0], e[1][1]
print(var, flag, ref)
print("Hidden Stack")
for e in reversed(hstack):
var, ref = e
print(var, ref)
print()
def block_enter(block, crt, hstack):
for i, e in enumerate(names[block]): # block의 var 확인
if crt[e][0] == 1: # flag가 1이라면
hstack.append([e, crt[e][1]]) # hstack에 저장
crt[e][0] = 1 # block의 flag를 1로 저장
crt[e][1] = block + str(i+1) # block의 ref에 block 이름 저장
display(crt, hstack)
def block_exit(block, crt, hstack):
for e in names[block]: # 해당 block에서 추가했던
crt[e][0] = 0 # flag를 0으로 초기화
for i, h in enumerate(hstack): # hstack에 있으면서
if crt[h[0]][0] == 0: # flag가 0인 var이면
crt[h[0]][0] = 1 # block의 flag를 1로 저장
crt[h[0]][1] = h[1] # block의 ref에 block 이름 저장
del hstack[i] # hstack에서 삭제
#Call sequence.
crt = dict()
hstack = []
init_crt(crt)
block_enter("A", crt, hstack)
block_enter("B", crt, hstack)
block_exit("B", crt, hstack)
block_enter("C", crt, hstack)
block_enter("D", crt, hstack)
block_exit("D", crt, hstack)
block_exit("C", crt, hstack)
block_exit("A", crt, hstack)
display(crt, hstack)
실행 결과
CRT
x 1 A1
y 1 A2
v 0
w 0
Hidden Stack
CRT
x 1 B1
y 1 A2
v 1 B2
w 0
Hidden Stack
x A1
CRT
x 1 A1
y 1 C2
v 0 B2
w 1 C1
Hidden Stack
y A2
CRT
x 1 A1
y 1 C2
v 0 B2
w 1 D1
Hidden Stack
w C1
y A2
CRT
x 0 A1
y 0 A2
v 0 B2
w 0 C1
Hidden Stack
결과가 일치한 것을 확인할 수 있다.
'프로그래밍언어론' 카테고리의 다른 글
[프로그래밍언어론] 20. 명령문(Statements) (0) | 2023.10.11 |
---|---|
[프로그래밍언어론] 19. 표현식(Expression) (0) | 2023.10.11 |
[프로그래밍언어론] 17. 범위 규칙 구현(Scope Rule Implementation) (0) | 2023.10.11 |
[프로그래밍언어론] 16. 동적 관리(Dynamic Management) (0) | 2023.10.11 |
[프로그래밍언어론] 15. 정적 관리(Static Management) (0) | 2023.10.11 |