Replicated

중간 코드 생성 본문

학부/오토마타와 컴파일러

중간 코드 생성

라구넹 2025. 12. 6. 15:50

1. 구문 지시적 번역에 의해 구문 분석 과정에서 중간 코드를 생성하는 방법

2. 파스 트리 또는 구문 트리와 같은 중간 표현을 생성한 후 이로부터 중간 코드를 생성하는 방법

 

구문 지시적 번역 방법의 경우

- 소스 프로그램에 구문 에러가 발생하면 에러 발생 전까지 수행한 중간 코드 생성이 무의미해져 시간 낭비 초래 

- 셍성 규칙의 감축 순서에 따라 중간 코드를 생성하여 구현이 복잡

- 구문 에러가 없는 경우 오히려 빠르게 중간 코드를 생성할 수 있다는 것이 장점

 

소스 프로그램에 대해 중간 표현을 생성한 후 중간 코드를 생성하는 방법

- 중간 코드 생성에 필요한 의미 정보만을 파스 트리 또는 구문 트리에 저장하고 있어 소스 생성기의 구현이 매우 용이

- 컴파일러의 크기가 커지고 컴파일 시간이 길어짐

 

논리식

- 논리식은 논리값을 계산하거나 if 또는 while 문에서 조건식을 계산하는데 사용

- and, or, not과 같은 논리 연산자와 부울 변수이거나 관계식으로 표현되는 피연산자로 구성

- 만약 언어의 정의에 의해 논리식의 한 부분을 검사하지 않아도 된다면 컴파일러는 논리적 계산에서 하나의 표현식만을 계산하게 함으로써 최적화할 수 있음

 

or와 and가 왼쪽 결합이고 우선순위는 or가 가장 낮고 and, not 순으로 높을 때

A or B and not C 에 대한 3-주소 코드

T1 = not C

T2 = B and T1

T3 =  A or T2

 

관계식 A < B는 조건문 if A < B then 1 else 0 와 일치하므로 3-주소 코드로 변환 시

1. if A < B GOTO 4

2. T = 0

3. GOTO 5

4. T = 1

5.

 

A < B or C

1. if A < B GOTO 4

2. T1 = 0

3. GOTO 5

4. T1 = 1

5. T2 = T1 or C

 

 

주석 파스 트리와 quadruple 코드 만들기

A < B or C < D and F < G

에 대한 주석 파스트리, 백패칭을 이용한 quadruple 코드로 만들기

* 백패칭은 논리 연산으로 인한 점프할 주소를 나중에 채우는 기법

 

* M.quad = {102}는 논리 연산 시점에 쿼드러플 번호가 102라는 것

-> 나중에 백패칭 시 이 번호를 이용해 E1이 false일 때 E2로 점프하도록 채워넣음

 

처음 문장 번호를 100번으로 가정 시 논리식의 구문 분석은

1. A < B로부터 E -> id1 relop id2의 의미 분석에 의해 E.t = makelist(next quad)를 수행

- nextquad = {100}이므로 E.t = {100}

- E.f = makelist(nextquad + 2) 이므로 E.f = {101}

100 if A < B GOTO _
101 GOTO _

또한, M.quad = {102} 

 

2. 두번째 구문 분석은 C < D, M.quad = {102}이므로

- E.t = {102}, E.f = {103}, M.quad = {104}

102 if C < D GOTO _
103 GOTO _

 

 

3. 세번째 구문 분석은 F < G, M.quad = {104}이니 E.t = {104}, E.f = {105}

104 if F < G GOTO _
105 GOTO _

 

나열 시

100 if A < B GOTO _
101 GOTO _
102 if C < D GOTO _
103 GOTO _
104 if F < G GOTO _
105 GOTO _

4. 다음 순서는 C < D and F < G인데, E -> E1 and M E2 의미 분석 규칙에 의해

backpatch(E1.t, M.quad)
E.t = E2.t
E.f = merge(E1.f, E2.f)

- backpatch(E1.t, M.quad) 실행

- E1.t의 목적지를 M.quad로 하라는 뜻

- 102 if C < D GOTO 104

- E.t = {104}, E.f = {103, 105}

100 if A < B GOTO _
101 GOTO _
102 if C < D GOTO 104
103 GOTO _
104 if F < G GOTO _
105 GOTO _

 

5. 다음 순서는 A < B or M E   (or이라 중간 스킵되서 이렇게 표기됨)

- E -> E1 or M E2 의미 분석 규칙에 의하면

- backpatch(E1.t, M.quad), E1.f = {101}, M.quad = {102}

- 101 GOTO 102

- E.f = {103, 105}, E.t = {101, 104} 이니 E2f = {103, 105}

100 if A < B GOTO _
101 GOTO 102
102 if C < D GOTO 104
103 GOTO _
104 if F < G GOTO _
105 GOTO _

결국 이렇게 됨