Upload
russell-lloyd
View
87
Download
0
Embed Size (px)
DESCRIPTION
AST Generation. Programming Language Concepts Lecture 9. Prepared by Manuel E. Bermúdez, 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. - PowerPoint PPT Presentation
Citation preview
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.