You are on page 1of 21

AST Generation

Programming Language Principles Lecture 6

Prepared by

Manuel E. Bermdez, Ph.D.


Associate Professor University of Florida

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 (contd)


proc S; {S begin SL end id := E; SL S Z SL Z S Z case Next_Token of T_begin : Read(T_begin); repeat Replaces S; until Next_Token {T_begin,T_id}; call Read(T_end); to SL. T_id : Read(T_id); Read (T_:=); E; Replaces Read (T_;); recursion otherwise Error; end on Z. end;

Replacing Recursion with Iteration (contd)


proc E; {E TY Y +TY } Replaces recursion on Y.

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

Replacing Recursion with Iteration (contd)


proc T; {T PX X *T }

P; if Next_Token = T_* then Read (T_*); T; end;

Replaces call to X.

Replacing Recursion with Iteration (contd)


proc P;{P (E) id } case Next_Token of T_(: 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

case Next_Token of

begin SL end (2)S id := E; SL SZ SL Z SZ

begin SL end id := E; SL S S }

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) (contd)

T_id :

end end;

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

Construction of Derivation Tree for the Original Grammar (Bottom Up) (contd)
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); od end

Construction of Derivation Tree for the Original Grammar (Bottom Up) (contd)
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) (contd)
proc P;{(1)P (E) (2)P (E) id id }

//
end;

SAME AS BEFORE

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

P T E P T E P P T

id P T id P E+T (E) id P

T P*T E T S id:=E; SL S S 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 of T_begin : Read(T_begin); S; Build Tree (x,n) N:=1; pops n trees from while Next_Token in {T_begin,T_id} do S; the stack, builds an N:=N+1; x node as their od parent, and pushes Read(T_end); the resulting tree. Build Tree ('block',N); T_id : Read(T_id); Assume this Read (T_:=); E; builds a node. Read (T_;); Build Tree ('assign',2); otherwise Error end end;

Generating the Abstract Syntax Tree, Bottom Up, for the Original Grammar (contd)
proc E; {E E+T '+' T }
T; while Next_Token = T_+ do Read (T_+) T; Build Tree ('+',2); od end; Left branching in tree!

Generating the Abstract Syntax Tree, Bottom Up, for the Original Grammar (contd)
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 (contd)
proc P;{P (E) id } // SAME AS BEFORE, // i.e.,no trees built end;

Example
Input String: begin id1 := (id2 + id3) * id4; end Sequence of events: id1 id2 id3 id4 BT('*',2) BT('assign',2) BT('block',1)

BT('+',2)

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
Programming Language Principles Lecture 6

Prepared by

Manuel E. Bermdez, Ph.D.


Associate Professor University of Florida

You might also like