Top Banner
Compiler Lecture Note, Intermediate Code Generation PL Lab, DongGuk University 컴컴컴컴 컴컴 10 컴컴 컴컴 컴컴
56

PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Dec 14, 2015

Download

Documents

Ashley York
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

컴파일러 입문

제 10 장

중간 코드 생성

Page 2: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

Contents

• Introduction

• Syntax-Directed

Translation

• Code Generation

• U-Code Translator

Page 3: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• Formal Specification– lexical structure : regular expression– syntactic structure : context-free grammar– the remaining phases of compilation : no such notations

but, we use a syntax-directed translation scheme which is a method associating semantic rules(or actions) with production.

• SDTS ::= cfg + semantic actions– cfg 의 production rule 에 있는 grammar symbol 을 이용하여

직접 semantic action 을 기술하는 방법 .– AST generation – Attribute grammar

Introduction

Page 4: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• Intermediate code generation– the phase that generates an explicit intermediate

code of the source program.– after syntax and semantic analysis. A Model for Intermediate code generation

• Our implementations:– Source program : Mini Pascal– Intermediate Representation : Abstract

Syntax Tree (AST)– Intermediate code : U-Code– Execution : U-Code Interpreter

Source Program

Scanner

Parser IntermediateRepresentation

Intermediate

Code Generation

Page 5: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• Implementation Model

– scanner : shift action of parser– parser : main program (LR parser)– SDT : reduce action of parser (AST generation)– ICG : Intermediate code generation by traversing

AST.※ Semantic Analysis 와 Intermediate Code Generation 을

효율적으로 처리하기 위해서 AST 의 design 은 매우 중요 .

Source Program Scanner

Parser

SDT AST ICG Ucode UcodeInterpreter

data

result

Page 6: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ Syntax-Directed Translation Scheme(SDTS)::= a production rule + semantic action(no widely-accepted

formalism)

▶ A Model of SDTS

whenever a reduction takes place, the semantic rule corresponding to the applied syntactic rule is activated.

Syntax-Directed Translation

SourceProgram

ScannerParser(Main)

get_token

token

Parsingtable

call semantic

: Semantic Actions

Result

Page 7: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ Advantages of SDT Providing a method describing semantic rules and that

description is independent of any particular implementation.

Easy to modify - new productions and semantic actions can be added without disturbing the existing ones.

▶ Disadvantages of SDT 파싱중에 error 가 일어난 경우 이제까지 행한 semantic action 이 모두

무의미해 진다 . input 에 대해 one pass 이면서 syntax-directed 하게 처리하기 때문에 어떤

경우에는 정보가 부족하여 후에 필요한 정보가 나타났을 때 backpatchingbackpatching 등 복잡하게 처리해야 한다 .

Solution Syntax-directed 한 방법으로는 의미 분석과 코드 생성시에 필요한 정보만을 구성하고 다음 단계에서 그것을 이용하여 의미 분석과 코드 생성을 한다 .

Page 8: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

Description of Semantic Actions

▶ SDTS(Syntax-Directed Translation Scheme)::= production rules + semantic actions

▶ Description of Semantic Actions(1) Conventional PL.(2) Meta Language - Formal Semantic Language(FSL)

SemanticDescription

Preprocessor table

SDTInput Output

Page 9: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ Semantic Description using the Attributes of Grammar Symbol

::= We associate information with a programming language construct by attaching attributes to the grammar symbols representing the construct. Values for attributes are computed by "semantic rules" associated with the grammar productions.

▶ An attribute of symbol::= A value associated with a grammar symbol. Each

grammar symbol has an associated set of attributes. An attribute can represent anything we choose: a string, a number, a type, a memory location, or whatever.

ex)

Production Semantic Rules

L -> E \n print(E.val)E -> E1 + T E.val := E1.val + T.val

E -> T E.val := T.valT -> T1 * F T.val := T1.val * F.val

T -> F T.val := F.valF -> ( E ) F.val := E.valF -> digit F.val := digit.lexval

Page 10: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ Synthesized attribute::= the value of the attribute of the nonterminal on the left

side of the production is defined as a function of the grammar symbols on the right side.

ex) A XYZ A := F(X,Y,Z)

▶ Inherited attribute::= the value of the attribute of a nonterminal on the

right side of the production is defined in terms of an attribute of the nonterminal on the left.

ex) A XYZ Y.val := 2 * X.val

※ Synthesized attribute is more natural than inherited attribute for

mapping most programming language constructs into intermediate code.

Page 11: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

Implementation of SDT

▶ Designing steps Input design - language construct 에 대한 grammar

를 cfg 를 이용하여 design. Scanner, Parser 의 작성 . Semantic Specification - conventional PL.

---> SDT Translator 의 완성 - interconnection.

▶ Examples : 1. Desk Calculator 2. Conversion infix into postfix

3. Construction of AST

Page 12: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

1. Desk Calculator(1) Input design

0. S -> E $1. E -> E + E2. E -> E * E3. E -> ( E )4. E -> num

(2) Parsing table

Page 13: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

(3) Semantic Specification

(4) Implementation of Desk Calculator

– Parsing stack : Symbol stack + State stack + Value stack

– Value stack : holding the values of the corresponding attribute.

Production Semantic Rules

L -> E $ print E.valE -> E1 + E2 E.val := E1.val + E2.valE -> E1 * E2 E.val := E1.val * E2.val

E -> ( E1) E.val := E1.valE -> num E.val := num.lexval

Page 14: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

– the code fragments do not show how variable top is managed.– lexval : token value – the code fragments are executed before a reduction takes pl

ace.

Production Code Fragment

S -> E $ print (val[top])E -> E + E val[top-2] := val[top-2] + val[top]E -> E * EE -> (E) val[top-2] := val[top-1]

E -> num val[top] := num.lexval

val[top-2] := val[top-2] * val[top]

Page 15: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

ex) 23 * 5 + 4 $

state input symbol value parse (0 23 * 5 + 4$, , , )s3 ----> (0 3 , * 5 + 4$, num , , )

r4 ----> (0 1 , * 5 + 4$, E , 23 , 4 )s5 ----> (0 1 5 , 5 + 4$, E * , 23_ , 4 )s3 ----> (0 1 5 3 , + 4$, E * num , 23__ , 4 )r4 ----> (0 1 5 8 , + 4$, E * E , 23_5 , 4 4 )r2 ----> (0 1 , + 4$, E , 115 , 4 4 2 )s4 ----> (0 1 4 , 4$, E + , 115_ , 4 4 2 )s3 ----> (0 1 4 3 , $, E + num , 115__ , 4 4 2 )r4 ----> (0 1 4 7 , $, E + E , 115_4 , 4 4 2 4 )r1 ----> (0 1 , $, E , 119 , 4 4 2 4 1 ) ----> accept

Page 16: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

2. Conversion infix into postfix

Production Code Fragment

E -> E + E print ‘+’

E -> E * E print ‘*’

E -> E / E print ‘/’

E -> (E)

E -> a print ‘a’

a + (a + a) * a a a a + a * +

Page 17: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

3. Construction of AST

▶AST is a condensed form of parse tree useful for representing language constructs.

ex) a := b + 1;

ex) if a > b then x := a else x := b;

:=

a +

b 1

if

>

a b

:= :=

x a x b

Page 18: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ Functions to create the nodes of AST for expressions with binary operators. Each function returns a pointer to a newly created node.1. mktree(op,left,right) creates an operator node with label op and two

fields containing pointers to left and right.2. mknode(a) creates a terminal node for a and returns the node pointer.

▶ Semantic Specification

Production Semantic Rules

E -> E1 + T E.nptr := mktree(‘+’, E1.nptr, T.nptr)

E -> E1 - T E.nptr := mktree(‘-’, E1.nptr, T.nptr)

E -> T E.nptr := T.nptr

T -> (E) T.nptr := E.nptr

T -> a T.nptr := mknode(a)

– The synthesized attribute nptr for E and T keeps track of the pointers returned by the function calls.

Page 19: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ AST for a - 4 + c

+

- id

id num 4

to entry for a

to entry for c

Page 20: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

Programming Assignment #4

• Implement a syntax-directed translator producing an AST

for MiniPascal program.

– MiniPascal Program : Perfect.pas(Text pp.427-428)

– The Output form of AST using printtree() : Text pp.428-430

scannerMini-Pascal Programs

parser

SDT AST

Page 21: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• AST design– Grammar form : production rule [ => node_name ] ;

Note : => node name 의 생략 시에는 부 트리를 구성하지 않음 .

A -> => node_name ;

• MiniPascal GrammarMINI_PASCAL -> 'program' IDENT ';' BLOCK '. ' =>

PROGRAM; BLOCK -> DCL COMPOUND_ST => BLOCK;DCL -> CONST_DCL VAR_DCL PROC_DCL => DCL;

Text pp. 419-421

node_name

1 2 n...

Page 22: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• Data Structures– A node form of AST

– NODE structure struct tokentype {

int tokennumber; /* 토큰 번호 */char * tokenvalue; /* 토큰의 값 */

}; typedef struct nodetype {

struct tokentype token; /* 토큰 종류 */enum {terminal, nonterm} noderep;/* 노드의 종류 */struct nodetype *son; /* 왼쪽 링크 */struct nodetype *brother; /* 오른쪽

링크 */} NODE;

– Nonterminal node names :enum nodename { NOTREE, PROGRAM, BLOCK, DCL, ..., ARRAY_VAL};

sontoken

tokennumber tokenvaluenoderep brother

son node

next brother node

Page 23: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• Shift action of parsing :– if the token is meaningful, then call buildnode. NODE *buildnode(struct tokentype token) { NODE *ptr; ptr = (NODE *) malloc (sizeof(NODE)); if (!ptr) { printf(“ build node malloc error\n”); exit(1); } ptr -> token = token; ptr -> noderep = terminal; ptr -> son = NULL; ptr -> brother = NULL; return ptr; }

• Reduce action of parsing :– if the production rule is meaningful 1. build subtree

linking brothers making a subtree

else 2. only linking brothers

Page 24: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• Printing the information about AST– int printnode(NODE *t, int indent) : print a node

information– int printtree(NODE *t, int indent) : print an AST

void printnode(NODE *t, int indent){ extern FILE *ast; int i;

for (i=1; i<=indent; i++) fprintf(ast," ");if (t->noderep == terminal) {

fprintf(ast," Terminal: ");fprintf(ast,"%s",t->token.value);

}if (t->noderep == nonterm) {

i = (int) (t->token.number);fprintf(ast," Nonterminal: %s", ASTname[i]);

}}

void printtree(NODE *t, int indent){ NODE * p = t;

while (p != NULL) {printnode(p, indent);if (p->noderep == nonterm) printtree(p->son,indent+5);p = p->brother;

}}

Page 25: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ A Model for ICG

Source language : Mini Pascal Intermediate Representation : Abstract Syntax

Tree(AST)Intermediate code : UcodeExecution : Ucode Interpreter

Mini-Pascal Programs scanner

parser

SDT AST ICG Ucode UcodeInterpreter

data

executionresult

Code Generation

Page 26: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ Three Parts of MiniPascal

• Heading part : program name• Declaration part : description of data structures• Statement part : specifying the actions

• Production rules :(MiniPascal)

MINI_PASCAL -> 'program' IDENT ';' BLOCK '.’ BLOCK -> DCL COMPOUND_ST

DCL -> CONST_DCL VAR_DCL PROC_DCL;

STATEMENT -> ASSIGNMENT_ST; -> CALL_ST;-> COMPOUND_ST; -> IF_ST; -> WHILE_ST; -> ;

Page 27: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ Code Generating Routines

The basic structure of ICG void codegen(NODE *pt)

{switch (pt->token.tokennumber) {

case PROGRAM : { … } case BLOCK : { … }

…case ARRAY_VAL : ... default: printf(" Code

generation Error");}

} /* main program */…root = parser(); /* AST generated by SDT */codegen(root);codegen(root);...

Page 28: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

Heading part

① Grammar

MINI_PASCAL -> 'program' IDENT ';' BLOCK '.’ => PROGRAM;

BLOCK -> DCL COMPOUND_ST => BLOCK;

② AST

PROGRAM

IDENT BLOCK

DCL COMPOUND_STMT

root

Page 29: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

③ Code Segmentcase PROGRAM :

{/* 코드 생성에 필요한 초기화 작업 */codegen(pt->son->brother); /* BLOCK *//* 코드 생성한 후 마지막 처리 작업 */

}

• An Ucode program form :

sym(s) for global variables<name> proc

sym(s)… codes for procedureendopbgn... codes for main programendop

Page 30: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

Declaration Part

① Grammar

DCL -> CONST_DCL VAR_DCL PROC_DCL => DCL;

VAR_DCL -> 'var' VAR_DEFS ';’ => VAR_DCL; -> ;

VAR_DEFS -> VAR_DEF; -> VAR_DEFS ';' VAR_DEF;VAR_DEF -> VAR_LIST ':' TYPE => VAR_DEF;VAR_LIST -> IDENT_LIST => VAR_LIST;TYPE -> 'integer’ => INT_TYPE; -> 'array' '[' CONSTANT '..' CONSTANT ']' 'of’ 'integer’ =>

ARRAY_TYPE;

※ Mini-Pascal 에서 선언은 상수선언 , 변수선언 , 프로시저선언으로 구성 .※ 자료형은 정수형과 정수형 배열만 있음 .

Page 31: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

② AST

※ 변수선언은 여러 개의 변수정의로 이루어져 있으며 , 하나의 변수정의는 명칭들의 리스트와 그 명칭들이 갖는 형으로 되어 있다 .

DCL

CONST_DCL VAR_DCL

VAR_DEF

PROC_DCL

VAR_DEF VAR_DEF...

VAR_LIST TYPE_DENOTER

IDENT IDENT...

Page 32: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

③ Code Segment

case DCL: { offset = 0; } break;case VAR_DCL : {

NODE * q = pt->son;while (q != NULL) { codegen(q);

q = q->brother; } }

break;case VAR_DEF : {

NODE *id=pt->son->son, *tp=pt->son->brother;while (id != NULL){

enter(id->token.tokenvalue, tp->token.tokennumber, offset);

offset += typesize(tp->token.tokennumber);id = id->brother;

}}

※ 함수 enter(name, type, offset) 는 symbol table 에 명칭을 삽입한다 .

Page 33: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

Assignment Statement

① GrammarASSIGNMENT_ST -> LHS ':=' EXP =>

ASSIGN_STMT;LHS -> VARIABLE;VARIABLE -> IDENT;

-> IDENT '[' EXP ']' => INDEX;

② ASTASSIGN_STMT

IDENT <<expression>>

ASSIGN_STMT

INDEX <<expression>>

IDENT <<expression>>

Assignment Statement

Page 34: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

③ Code Segment

case ASSIGN_STMT: {NODE *lhs = pt->son, *rhs = pt->son->brother;if (lhs->noderep == nonterm) codegen(lhs); /* array variable */if (rhs->noderep == nonterm) codegen(rhs); /* 식에 대한 코드 생성*/

else rv_emit(rhs);if ((p = lookup(lhs->token.tokenvalue)) == NULL) error();

emit1("str", p);}

– lookup() : 심 볼 테 이 블 에 서 명 칭 을 찾 아 해 당 엔 트 리 를 가 리 키 는 포인터를 반환하는 함수 . 실패할 경우 NULL 을 복귀한다 .

– rv_emit() : 매개변수가 변수인가 상수인가에 따라 lod 와 ldc 로 구분하여 출력하는 함수이다 .

– emit1() : mnemonic 이름과 하나의 operand 를 출력한다 .

Page 35: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

Expression

① GrammarEXP -> EXP '+' TERM

=> ADD;-> EXP '-' TERM

=> SUB;-> TERM;

TERM -> TERM '*' FACTOR => MUL;

-> TERM 'div' FACTOR => DIV;

-> TERM 'mod' FACTOR=> MOD;

-> FACTOR; FACTOR-> '-' FACTOR => NEG;

-> VARIABLE; -> NUM;-> '(' EXP ')';

② AST

ASSIGN_STMT

IDENT EXP

Page 36: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

③ Code Segment

case ADD: case SUB: case MUL: case DIV: case MOD:{

NODE *lhs = pt->son, *rhs = pt->son->brother; if (lhs->noderep == nonterm) codegen(lhs); /* 좌 피 연 산 자 의 코드생성 */

else rv_emit(lhs);if (rhs->noderep == nonterm) codegen(rhs); /* 우 피 연 산 자 의 코드생성 */

else rv_emit(rhs); switch (pt->token.tokennumber) {

case ADD: emit0("add"); break;case SUB: emit0("sub"); break;case MUL: emit0("mult"); break;case DIV: emit0("divop"); break;case MOD: emit0("modop"); break;

}}

– emit0() : mnemonic 이름만 출력한다 .

Page 37: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

Example)init := 10;value := init + 20 * 2;

※ 여기서 , 일련 번호는 코드 생성 순서 .※ Ucode 의 계산순서는 postorder 와 일치하므로 postorder 로 운행한다 .

ASSIGN_STMT

init 10

ASSIGN_STMT

value ADD

init MUL

20 2

④ ⑤

Page 38: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

– 생성된 Ucode :

ldc 10 ①str 1 1 ; init ②lod 1 1 ; init ③ldc 20 ④ldc 2 ⑤mult ⑥add ⑦str 1 2 ; value ⑧

※ Ucode 에서 , 변수는 (base, offset) 형태로 addressing 한다 .

Page 39: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ Array variable

• In one-dimensional array,

location of i's element = Base + (i - Low) * Wwhere, Low : lower bound of array Base : start address of array

• Address of A[i] = i*W+(Base - Low * W),– 상수식 c = Base - Low * W

∴ A[i] = c + i*W

• Assume that the size of integer is 1. W = 1

Location of list[10] = ( 배열의 시작주소 ) + (10 - Low) * 1

Page 40: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

【예】다음은 미니 파스칼에서 배열의 선언과 배열의 참조를 나타낸다 .

program bubble;const

subscript = 20;var

list : array[5..subscript] of integer;…

begin…list[10] := 3; …end.

위 프로그램에서 list[10] := 3 에 해당하는 Ucode 는 다음과 같다 .

ldc 10ldc 5subldr 1 1 /* load the address of list */addldc 3sta

Page 41: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• Control Statement1. conditional statement --- if, case, switch2. iteration statement --- for, while, do-while, repeat-

until3. branch statement --- goto

▶ 논리식 (Logical expression)① Grammar

CONDITION -> EXP '=' EXP => EQ;-> EXP '<>' EXP => NE;-> EXP '>' EXP => GT;-> EXP '>=' EXP => GE;-> EXP '<' EXP => LT;-> EXP '<=' EXP => LE;

Control Statement

Page 42: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

② 관계식 a >= b + 1 에 대한 AST 와 U- 코드는 다음과 같다 .

– AST 형태 :

– Ucode :

lod a /* 1 1 */lod b /* 1 2 */loc 1addge

GE

a ADD

b 1

Page 43: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

▶ 제어문의 코드 생성

- if-then

CONDITION 코드STATEMENT 코드

tag :

if false thengoto tag

- if-then

CONDITION 코드STATEMENT 코드

if false thengoto tag1

goto tag2

STATEMENT 코드tag1 :

tag2 :

- while-do

CONDITION 코드STATEMENT 코드 if false then

goto tag1goto tag1

tag1 :

tag2 :

Page 44: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

① Grammar

IF_ST -> 'if' CONDITION 'then' STATEMENT => IF_STMT;

-> 'if' CONDITION 'then' STATEMENT'else' STATEMENT

=> IF_ELSE_ST;WHILE_ST -> 'while' CONDITION 'do' STATEMENT =>

WHILE_STMT;

② AST & Code SegmentIF_STMT

CONDITION STATEMENT

case IF_STMT : { char tag[5]; taggen(tag); /* label generation */ codegen(pt->son); /* CONDITION part */ emit2(“fjp”, tag); codegen(pt->son->brother); /* statement */ emit_label(tag);}

- if-then 구조

Page 45: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

IF_ELSE_STMT

CONDITION ST1

case IF_ELSE_STMT : { char tag1[5], tag2[5]; taggen(tag1); taggen(tag2); codegen(pt->son); /* CONDITION */ emit2(“fjp”, tag1); codegen(pt->son->brother); /* true part */ emit2(“ujp”, tag2); emit_label(tag1); /* false part*/ codegen(pt->son->brother->brother); emit_label(tag2);}

- if-then-else 구조

ST2

case WHILE_STMT : { char tag1[5], tag2[5]; taggen(tag1); taggen(tag2); emit_label(tag1); codegen(pt->son); /* CONDITION 코드 생성 */ emit2(“fjp”, tag2); codegen(pt->son->brother); /* loop body */ emit2(“ujp”, tag1); emit_label(tag2);}

WHILE_STMT

CONDITION

- while-do 구조

STATEMENT

Page 46: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

– 예제 : if a > great then great := a;

• AST 형태 :

• 생성된 Ucode :

IF_STMT

GT ASSIGN_STMT

a great great a

lod 1 1lod 1 2gt

lod 1 1str 1 2

fjp $$1

nop$$1

; a; great; a > great

; great := a

Page 47: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

– 예제 : while i <= 100 do begin sum := sum + i; i := i + 1

end;• AST 형태 :

WHILE_STMT

LE COMPOUND_STMT

i 100 ASSIGN_STMT ASSIGN_STMT

SUM

sum i

ADD i

i 1

ADD

Page 48: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• 생성된 Ucode :

$$1

lod ildc 100le

lod sumlod iaddstr sum

fjp $$2

nop

i < = 100

lod iloc 1addstr i

sum := sum + i;

i := i + 1

ujp $$1nop$$2

Page 49: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

procedure call statement

① Grammar

CALL_ST -> IDENT OPT_ACT_PARMS => CALL_STMT;OPT_ACT_PARMS -> '(' ACTUAL_PARAMS ')’ =>

ACTUAL_PARAM; -> ;

ACTUAL_PARAMS -> EXP ;-> ACTUAL_PARAMS ',' EXP ;

② AST CALL_STMT

IDENT ACTUAL_PARAM

EXP EXP ...

Procedure

Page 50: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

③ Code Segmentcase CALL_STMT : {

emit0("ldp");codegen(pt->son->brother); /* 실 매개 변수를 위한 코드 생성 */emit1("cal", pt->son->token.tokenvalue);

};

– 예제 : procedure swap (var x, y : integer);var …begin …end;begin /* main */ … swap( a, b ); …end.

swap proc …. … ret endop bgn … … ldp ldr a ldr b cal swap … endop

함수 호출을위한 Ucodeswap(a,b);

Page 51: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

procedure definition

① GrammarPROC_DEF -> PROC_HEAD BLOCK ';' =>

PROC_DEF; PROC_HEAD -> 'procedure' IDENT

OPT_FORM_PARM ;OPT_FORM_PARM -> '(' FORMAL_PARAMS ')' ';’

=> FORM_PARM;

-> ';' ;

② AST

PROC_DEF

IDENT FORM_PARAM

VAR_PARAM VALUE_PARAM

BLOCK

Page 52: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

③ Code Segment

case PROC_DEF : {block += 1;offset = 1;enter(pt->son->token.tokenvalue, PROC);emit3("proc", block, offset);codegen(pt->son->brother); /* 형식 매개 변수에 대한 코드 생성 */codegen(pt->son->brother->brother); /* Block 에 대 한 코드 생성 */emit0("ret");emit0("endop");

};

Page 53: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• Design and Implementation of Ucode Translator– scanner, parser, SDT, ICG

Ucode Translator

Mini-Pascal Programs scanner

parser

SDT AST ICG Ucode UcodeInterpreter

data

executionresult

Page 54: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• Execution sequence of perfect.pas

① MiniPascal program : Text pp.427-428

② The Output form of AST using printtree() : Text pp.428-430

③ Ucode that generated by code generator : Text pp.454-456

④ The execution of Ucode using Ucode Interpreter

ucodei perfect.uco

Result filename is perfect.lst

-- Assembling... -- Executing... -- Result Data

6 28 496

Page 55: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

Programming Assignment #5

• MiniPascal 언어에 대한 Ucode Translator 를 작성하시오 . 생성된 Ucode 는 Interpreter 를 사용하여 실행하시오 .

AST ICG UcodeUcode

Interpreter

data

executionresult

Page 56: PL Lab, DongGuk University Compiler Lecture Note, Intermediate Code Generation 컴파일러 입문 제 10 장 중간 코드 생성.

Compiler Lecture Note, Intermediate Code Generation

PL Lab, DongGuk University

• 예제 프로그램 :program perfect;const max = 500;var i, j, k, r, sum: integer;begin

i := 2;while i <= max do

begin sum := 0; k := i div 2;

j := 1; while j <= k do begin

r := i mod j;if r = 0 then sum := sum + j;j := j + 1

end; if i = sum then write(i);

i := i + 1end

end.