Download - AST Generation

Transcript

AST Generation

Prepared by

Manuel E. Bermúdez, Ph.D.Associate ProfessorUniversity of Florida

Programming Language ConceptsLecture 9

Replacing Recursion with Iteration

• Not all the nonterminals are needed.

• The recursion in SL, X, Y and Z can be replaced with iteration.

Replacing Recursion with Iteration (cont’d)

proc S; {S → begin SL end→ id := E;

case Next_Token ofT_begin : Read(T_begin);

repeat S;until Next_Token {T_begin,T_id};Read(T_end);

T_id : Read(T_id);Read (T_:=);E;Read (T_;);

otherwise Error;end

end;Replaces recursion on Z.

Replaces call

to SL.

SLSL → S Z Z → S Z → }

Replacing Recursion with Iteration (cont’d)

proc E; {E → TYY → +TY → }

T;while Next_Token = T_+ do Read (T_+); T;

odend;

Replaces recursion on Y.

Replacing Recursion with Iteration (cont’d)

proc T; {T → PXX → *T → }

P;if Next_Token = T_*

then Read (T_*);T;

end;

Replaces call to X.

Replacing Recursion with Iteration (cont’d)

proc P;{P → (E)→ id }

case Next_Token ofT_(: Read (T_();

E; Read (T_));

T_id: Read (T_id);otherwise Error;end

end;

Construction of Derivation Tree for the Original Grammar (Bottom Up)

proc S; { (1)S → begin SL end (2)S → begin SL end → id := E; → id := E;

SL → SZ SL → SL S Z → SZ → S

→ }case Next_Token of

T_begin : Read(T_begin); S; Write (SL → S); while Next_Token in {T_begin,T_id} do

S;Write (SL → SL S);

od Read(T_end); Write (S → begin SL

end);

Construction of Derivation Tree for the Original Grammar (Bottom Up) (cont’d)

T_id : Read(T_id);Read (T_:=);E;Read (T_;);Write (S → id :=E ;);

otherwise Error;end

end;

Construction of Derivation Tree for the Original Grammar (Bottom Up) (cont’d)

proc E; {(1)E → TY (2) E → E+T Y → +TY → T → }

T;Write (E → T);while Next_Token = T_+ do

Read (T_+);T;Write (E → E+T);

odend

Construction of Derivation Tree for the Original Grammar (Bottom Up) (cont’d)proc T; {(1)T → PX (2) T → P*T

X → *T → P →

}P; if Next_Token = T_*

then Read (T_*);T;Write (T → P*T)

else Write (T → P);end;

Construction of Derivation Tree for the Original Grammar (Bottom Up) (cont’d)

proc P;{(1)P → (E) (2)P → (E) → id → id

}

// SAME AS BEFOREend;

Example

• Input String: begin id := (id + id) * id; end• Output:

P → idT → PE → TP → idT → PE → E+TP → (E)P → idT → P

T → P*TE → TS → id:=E;SL→ SS → begin SL end

Generating the Abstract Syntax Tree, Bottom Up, for the Original Grammar proc S; { S → begin S+ end 'block'

→ id := E; 'assign'var N:integer;

case Next_Token ofT_begin : Read(T_begin);

S;N:=1;while Next_Token in {T_begin,T_id} do

S;N:=N+1;

odRead(T_end);Build Tree ('block',N);

T_id : Read(T_id);Read (T_:=);E;Read (T_;);Build Tree ('assign',2);

otherwise Errorend

end;

Assume this builds a node.

Build Tree (‘x’,n) pops n trees from the stack, builds an ‘x’ node as their parent, and pushes the resulting tree.

Generating the Abstract Syntax Tree, Bottom Up, for the Original Grammar (cont’d)proc E; {E → E+T '+'

→ T }T;while Next_Token = T_+ do

Read (T_+)T;Build Tree ('+',2);

odend;

Left branching in tree!

Generating the Abstract Syntax Tree, Bottom Up, for the Original Grammar (cont’d)

proc T; {T → P*T '*' → P }

P;if Next_Token = T_*

then Read (T_*)T;Build Tree ('*',2);

end;

Right branching in tree!

Generating the Abstract Syntax Tree, Bottom Up, for the Original Grammar (cont’d)

proc P;{P → (E)→ id }

// SAME AS BEFORE, // i.e.,no trees builtend;

Example

• Input String: begin id1 := (id2 + id3) * id4; end

• Sequence of events:

id1

id2

id3

id4

BT('+',2)

BT('*',2)

BT('assign',2)

BT('block',1)

Summary

• Bottom-up or top-down tree construction.

• Original or modified grammar.• Derivation Tree or Abstract Syntax

Tree.

• Technique of choice (Hint: project)• Top-down, recursive descent parser.• Bottom-up tree construction for the

original grammar.

AST Generation

Prepared by

Manuel E. Bermúdez, Ph.D.Associate ProfessorUniversity of Florida

Programming Language ConceptsLecture 9