Computer Science/컴파일러개론(Compiler)

[컴개/CI] IR Translation to 3-addr Code(Statement/Nested Expressions)

gxxgsta 2023. 12. 14. 15:39
반응형
SMALL

Statement Expressions

우리는 앞서 t = [[a + b]]와 같이 임시 변수에 결과값을 넣는 경우 expression, v = a+b와 같이 명령만 실행하는 경우 statement라고 명명했다.

 

이때 statement는 결과값이 없는데, statement가 결과값을 갖도록 확장할 수 있다.

결과값을 가질 수 있는 경우는 아래와 같다.

- Block statements
- If-then-else
- Assignment statements

 

위와 같이 statement가 결과값을 갖게 하면 융통성이 생기게 된다.

 

3-주소 Translation 규칙: Statement Expression

위 예제에서 e값을 받아 t1에 넣고, e가 거짓인 경우 분기한 후 s를 실행한다.

이때 statement를 experience로 바꾸는 방법은 statement의 계산 값을 결과값으로 넣는 부분만 추가되었다고 생각하면 된다.

 

위 예제는 앞서 우리가 들었던 if then 예제와 차이점이 존재하는데,

이전에는 t1에 e의 evaluation 값을 넣은 후 t2에 t1을 뒤집어서 대입하고

t2 값이 참이면(t1 값이 거짓이면)분기를 수행하여 else문을 실행하였다.

 

그러나 위의 예제에서는 t1을 뒤집지 않고 참이면 Lthen으로 분기하고 거짓인 경우 바로 아래의 명령어를 수행한다. 이때, 앞선 예제와 같이 [[s2]]가 끝난 후 [[s1]]이 수행되지 않도록 동일하게 Lend로 분기한다.

 

앞선 if then 구현과의 차이점을 알아보자.

앞선 구현은 s1, s2로 코드 상의 순서를 맞춰주기 위해 else인 경우, 즉 e가 거짓인 경우 분기하였다. e가 거짓일 때 분기하게 하기 위해서는  t1을 뒤집어 주는 명령이 필요했는데, 현재 구현에서는 t1을 뒤집어 줄 필요가 없으므로 명령어가 하나 줄어들었다. 따라서 더욱 효율적인 코드를 만들어냈다.

 

 

statement가 여러 개 연달아 있는 경우, 가장 마지막의 값을 결과값으로 둔다.

 

 

변수 v에 저장된 값이 결과값에 들어간다.

즉, t = v 명령어만 추가한다.

 

따라서 statement를 experience로 바꾸는 방법은 't ='만 넣어주면 된다.

 

3-주소 Translation 규칙: Nested Expressions

지금까지 우리가 학습 했던 것은 3-addr code로 변환할 때, 하나의 명령어에 대해 실행하였다. 하지만 지금은 nested된 expr을 변환하는 과정을 학습해보자.

 

 

expr에 대해 변환할 때에 가장 처음 해야 할 일은 최상위, 즉 가장 큰 뼈대가 되는 것이 뭔지 알아야 한다. 즉, AST에서의 최상위 노드를 찾아야 한다.

 

위 예제에서 최상위 노드는 곱셈이며 결국 위 예제는 어떠한 두 덩어리를 곱한 모양새이다.

따라서 최종 결과값은 t = t3 + t6이 되며, 각각 t3 = t1 - t2, t6 = t4 + t5가 된다.

이때, t 뒤에 존재하는 숫자는 아무런 의미가 없으며 순서가 섞여도 상관없다.

 

 여담으로 코드를 3-addr code로 변환할 때 [[ ]]가 존재하면 안 되며, [[ ]]가 없어질 때까지 재귀적으로 진행해야 한다.

 

 

중첩 statement에 대해서도 동일하다.

위 예제에서 가장 큰 뼈대는 if c then이 된다.

따라서 c가 참이면 then 뒤의 문구를 실행하면 되는데,

then 뒤의 문구도 마찬가지로 if d then문이다.

앞서 진행한 과정을 반복하니 그 안에서도 a에 b를 할당하는 statement가 존재한다.

 

3-주소 Translation 규칙 - 추가 팁

LIR로 변환하다 보면 t1 = v, t = t1와 같은 형태가 자주 등장한다.

이때 t = v로 바로 대입하는 경우 몇 가지를 소개하겠다.

 

e이 변수거나 상수일 때

[[e]]는 e이다.

 

binary operations: t = [[e1 OP e2]]

- e1이 변수거나 상수일 때: t1 = [[e2]], t = e1 OP t1

- e2가 변수거나 상수일 때: t1 = [[e1]], t = t1 OP e2

 

unaryoperations의 e1이 변수거나 상수일 때

t = [[OP e1]] = OP e1

 

임의로 도입하면 헷갈리거나 틀리는 경우 많다. 위의 경우만 허용 가능하다고 생각하고 연습문제 풀이하는 것이 좋다.

반응형
LIST