본문 바로가기
프로그래밍언어론

[프로그래밍언어론] 18. 파이썬으로 CRT 구현

by 파스텔코랄 2023. 10. 11.
이전 강좌의 동적 범위 규칙 중 하나인 Central Referencing Table(CRT)를 파이썬을 통해 구현해보자.

 


 

우리가 구현하고자하는 그림이다.

  1. 큰 블록에 작은 블록이 포함되어 있고 A, B, C, D의 관계는 그림과 같다.
    • A > B, C
    • C > D
  2. 각 블록은 x, y, v, w 중 1~2개의 값을 가진다.
    • hidden stack을 이용하여 값을 저장 및 로드한다.
  3. 최종적으로 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

결과가 일치한 것을 확인할 수 있다.

댓글