tree generation
DESCRIPTION
Tree Generation. Programming Language Principles Lecture 5. Prepared by Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida. String-To-Tree Transduction. Can obtain derivation or abstract syntax tree. Tree can be generated top-down, or bottom-up. - PowerPoint PPT PresentationTRANSCRIPT
Tree Generation
Prepared byManuel E. Bermúdez, Ph.D.
Associate ProfessorUniversity of Florida
Programming Language PrinciplesLecture 5
String-To-Tree Transduction
• Can obtain derivation or abstract syntax tree.
• Tree can be generated top-down, or bottom-up.
• We will show how to obtain1. Derivation tree top-down2. AST for the original grammar,
bottom-up.
Top-Down Generation of Derivation Tree• In each procedure, and for each
alternative, write out the appropriate production AS SOON AS IT IS KNOWN
Top-Down Generation of Derivation Tree (cont’d)proc S; {S → begin SL end
→ id := E; }case Next_Token of
T_begin : Write(S → begin SL end);
Read(T_begin);SL;Read(T_end);
Top-Down Generation of Derivation Tree (cont’d)
T_id : Write(S → id :=E;);
Read(T_id);Read (T_:=);E;Read (T_;);
otherwise Errorend
end;
Top-Down Generation of Derivation Tree (cont’d)proc SL; {SL → SZ}
Write(SL → SZ);S;Z;
end;
proc E; {E → TY}Write(E → TY);T;Y;
end;
Top-Down Generation of Derivation Tree (cont’d)proc Z; {Z → SZ
→ }case Next_Token of
T_begin, T_id: Write(Z → SZ); S; Z;
T_end: Write(Z → );otherwise Error;
endend;
Top-Down Generation of Derivation Tree (cont’d)proc Y; {Y → +TY
→ }if Next_Token = T_+ then
Write (Y → +TY);Read (T_+);T;Y;
else Write (Y → );end;
Top-Down Generation of Derivation Tree (cont’d)proc T; {T → PX}
Write (T → PX);P;X
end;
proc X;{X → *T → }
Top-Down Generation of Derivation Tree (cont’d)
if Next_Token = T_* thenWrite (X → *T);Read (T_*);T;
else Write (X → );end;
Top-Down Generation of Derivation Tree (cont’d)
proc P;{P → (E)→ id }
case Next_Token ofT_(: Write (P → (E));
Read (T_(); E; Read (T_)); T_id: Write (P → id); Read (T_id);otherwise Error;
end;
Notes
• The placement of the Write statements is obvious precisely because the grammar is LL(1).
• Can build the tree “as we go”, or have it built by a post-processor.
Example• Input String:
begin id := (id + id) * id; end• Output:
S → begin SL endSL → SZS → id :=E;E → TYT → PXP → (E)E → TYT → PXP → idX →
Y → +TYT → PXP → idX → Y → X → *TT → PXP → idX → Y → Z →
Bottom-up Generation of the Derivation Tree• We could have placed the write
statements at the END of each phrase, instead of the beginning. If we do, the tree will be generated bottom-up.
• In each procedure, and for each alternative, write out the production A AFTER is parsed.
Bottom-up Generation of the Derivation Tree (cont’d)proc S;{S → begin SL end
→ id := E; }case Next_Token ofT_begin: Read (T_begin);
SL;Read (T_end);
Write (S → begin SL end); T_id: Read (T_id); Read (T_:=);E;Read (T_;);Write (S → id:=E;);otherwise Error;
end;
Bottom-up Generation of the Derivation Tree (cont’d)proc SL; {SL → SZ}
S;Z;Write(SL → SZ);
end;
proc E; {E → TY}T;Y;Write(E → TY);
end;
Bottom-up Generation of the Derivation Tree (cont’d)proc Z; {Z → SZ
→ }case Next_Token of
T_begin, T_id: S; Z; Write(Z → SZ);
T_end: Write(Z → );otherwise Error;
endend;
Bottom-up Generation of the Derivation Tree (cont’d)
proc Y; {Y → +TY → }
if Next_Token = T_+ thenRead (T_+);T;Y;Write (Y → +TY);
else Write (Y → );end;
Bottom-up Generation of the Derivation Tree (cont’d)proc T; {T → PX }
P;X;Write (T → PX)
end;
proc X;{X → *T → }
if Next_Token = T_* thenRead (T_*);T;Write (X → *T);
else Write (X → );end
Bottom-up Generation of the Derivation Tree (cont’d)proc P;{P → (E)
→ id }case Next_Token of
T_(: Read (T_(); E; Read (T_));
Write (P → (E));T_id: Read (T_id);
Write (P → id);otherwise Error;
end;
Notes
• The placement of the Write statements is still obvious.
• The productions are emitted as procedures quit, not as they start.
Notes (cont’d)
• Productions emitted in reverse order, i.e., the sequence of productions must be used in reverse order to obtain a right-most derivation.
• Again, can built tree “as we go” (need stack of trees), or later.
Example• Input String: begin id := (id + id) * id; end• Output:
P → idX →T → PXP → idX →T → PXY → Y → +TYE → TYP → (E)
P → idX → T → PXX → *TT → PXY → E → TYS → id:=E; Z → SL → SZS → begin SL end
Tree Generation
Prepared byManuel E. Bermúdez, Ph.D.
Associate ProfessorUniversity of Florida
Programming Language PrinciplesLecture 5