Chapter 2-2 A Simple One-Pass Compiler. 2 Syntax-directed translation Syntax-directed definition...

Preview:

Citation preview

Chapter 2-2

A Simple One-Pass Compiler

2

Syntax-directed translation

Syntax-directed definition translation of a construct in terms of attributes associated with its syntactic components– Syntactic structure :: context-free grammar

– Grammar symbol :: a set of attributes and with each production, a set of semantic rules for computing values of the attributes associated with the symbols appearing in the production

Translation input-output mapping Annotated parse tree a parse tree showing the attribute

values at each node

3

Synthesized Attributes

An attribute is said to be synthesized if its value at a parse-tree node is determined from attribute values at the children of node

예제 설명

4

PRODUCTION SEMANTIC RULE

expr expr1 + term

expr expr1 - term

expr term

term 0

term 1

. . .

term 9

expr.t := expr1.t || term.t || ‘+’

expr.t := expr1.t || term.t || ‘-’

expr.t := term.t

term.t := ‘0’

term.t := ‘1’

. . .

term.t := ‘9’

Syntax-directed definition for infix to postfix translation.

5

expr.t = 95 - 2 +

term.t = 2

+ 2-

term.t = 5expr.t = 9

term.t = 9

9 5

expr.t = 95 -

Attribute values at nodes in a parse tree.

6

Depth first traversals

Robot positioning ::– seq seq instr | begin

instr east | north | west | south Depth-first traversals Translation Schemes

– Context-free grammar in which program fragments called semantic actions are embedded

Emitting a Translation

7

Annotated parse tree for begin west south.

seq.x = -1seq.y = -1

instr.dx = 0instr.dy = -1

seq.x = -1seq.y = 0

seq.x = 0seq.y = 0

instr.dx = -1instr.dy = 0 south

westbegin

8

Syntax-directed definition of the robot’s position.

PRODUCTION SEMANTIC RULES

seq begin seq.x := 0

seq.y := 0

seq seq1 instr seq.x := seq.x1 + instr.dx

seq.y := seq.y1 + instr.dy

instr eastinstr.dx := 1

instr.dy := 0

instr northinstr.dx := 0

instr.dy := 1

instr westinstr.dx := -1

instr.dy := 0

instr southinstr.dx := 0

instr.dy := -1

9

expr expr1 + term

expr expr1 - term

expr term

term 0

term 1

. . .

term 9

{ print (‘+’) }

{ print (‘-’) }

{ print (‘0’) }

{ print (‘1’) }

{ print (‘9’) }

Actions translating expressions into postfix notation.

10

Actions translating 9-5+2 into 95-2+

expr

{print('+')}

term

{print('2')}

+

expr

{print('- ')}

term

{print('5')}

-

expr

term

{print('9')}9

2

5

11

Top-down parsing

Lookahead … the current token being scanned

Array[ num dotdot num ] of integer– 과정 설명

12

(2.8)

type simple

| id

| array [ simple ] of typ

e

Simple integer

| char

| num dotdot num

13

(a) type type

Array [ simple ] of type type

(c) Array [ simple ] of type

num dotdot num type

(d) Array [ simple ] of type

num dotdot num simple

type

(e) Array [ simple ] of type

num dotdot num simple integer

Steps in the top-down construction of a parse tree

14

Predictive parsing

First– 예제로 설명– ∈-production

Designing a Predictive Parser Left Recursion

– expr expr + term– 일반화

15

expr term rest

rest + term { print(‘+’) } rest | - term { print(‘-’) } rest |

term 0 { print (‘0’) }

term 1 { print (‘1’) }

. . .

term 9 { print (‘9’) }

(2.14)

16

Translation of 9 – 5 + 2 into 95 – 2 +.

expr

term rest

9 {print(‘9’)} - term {print(‘-’)} rest

5 {print(‘5’)} + term {print(‘+’)} rest

2 {print(‘2’)}

17

expr(){

term(); rest();}

rest(){

if(lookahead == ‘+’) {match(‘+’); term(); putchar(‘+’); rest();

}else if (lookahead == ‘-’) {

match(‘-’); term(); putchar(‘-’); rest();}else;

} term(){

if (isdigit(lookahead)) {putchar(lookahead); match(lookahead);

}else error;

}

Fig. 2. 22. Functions for the nonterminals expr, rest, and term.

18

Replacement for functions expr and rest of Fig. 2.22.

expr(){

term();while(1)

if(lookahead == ‘+’) {match(‘+’); term(); putchar(‘+’);

}else if (lookahead == ‘-’) {

match(‘-’); term(); putchar(‘-’);}else break;

}

19

Implementing the interactions in Fig. 2. 25.

uses getchar() return token to read character to caller

pushes back c using ungetc(c, stdin)

sets global variable to attribute val

ue

lexan() lexical analyzer

tokenval

20

Symbol table and array for storing strings.

ARRAY symtable

attributes

0

1

2

3

4

lexptr token

ARRAY lexemes

d i v EOS m o d EOS c o u n t EOS i EOS

div

mod

id

id

21

Code layout for conditional and while statements.

label test

code for expr

gofalse out

code for stmt1

goto test

label out

WHILEIF

stmt if expr then stmt1 { out := newlable; stmt.t := expr.t || ‘gofalse’ out || stmt1.t || ‘label’ out

code for expr

gofalse out

code for stmt1

label out

(2.18)

22

Fig. 4.15. Parsing table M for grammar (4.11)

NONTER-MINAL

INPUT SYMBOL

id + * ( ) $

E

E'

T

T'

F

E TE'

T FT'

F id

E' +TE'

T' T' *FT'

E TE'

T FT'

F (E)

E'

T'

E'

T'

Recommended