1 / 26

Tree Generation

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.

ron
Download Presentation

Tree Generation

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Tree Generation Programming Language Principles Lecture 5 Prepared by Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida

  2. 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 obtain • Derivation tree top-down • AST for the original grammar, bottom-up.

  3. Top-Down Generation of Derivation Tree • In each procedure, and for each alternative, write out the appropriate production AS SOON AS IT IS KNOWN

  4. 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);

  5. Top-Down Generation of Derivation Tree (cont’d) T_id : Write(S →id :=E;); Read(T_id); Read (T_:=); E; Read (T_;); otherwise Error end end;

  6. 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;

  7. 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; end end;

  8. Top-Down Generation of Derivation Tree (cont’d) proc Y; {Y → +TY → } if Next_Token = T_+ then Write (Y → +TY); Read (T_+); T; Y; elseWrite (Y → ); end;

  9. Top-Down Generation of Derivation Tree (cont’d) proc T; {T → PX} Write (T →PX); P; X end; proc X;{X → *T → }

  10. Top-Down Generation of Derivation Tree (cont’d) if Next_Token = T_* then Write (X → *T); Read (T_*); T; elseWrite (X → ); end;

  11. Top-Down Generation of Derivation Tree (cont’d) proc P;{P → (E) → id } case Next_Token of T_(: Write (P → (E)); Read (T_(); E; Read (T_)); T_id: Write (P → id); Read (T_id); otherwise Error; end;

  12. 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.

  13. Input String: begin id := (id + id) * id; end Output: Example S → begin SL end SL → SZ S → id :=E; E → TY T → PX P → (E) E → TY T → PX P → id X → Y → +TY T → PX P → id X → Y → X → *T T → PX P → id X → Y → Z →

  14. 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.

  15. Bottom-up Generation of the Derivation Tree (cont’d) proc S;{S → begin SL end → id := E; } case Next_Token of T_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;

  16. 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;

  17. 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; end end;

  18. Bottom-up Generation of the Derivation Tree (cont’d) proc Y; {Y → +TY → } if Next_Token = T_+ then Read (T_+); T; Y; Write (Y → +TY); elseWrite (Y → ); end;

  19. 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_* then Read (T_*); T; Write (X → *T); elseWrite (X → ); end

  20. 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;

  21. Notes • The placement of the Write statements is still obvious. • The productions are emitted as procedures quit, not as they start.

  22. 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.

  23. Input String: begin id := (id + id) * id; end Output: Example P → id X → T → PX P → id X → T → PX Y → Y → +TY E → TY P → (E) P → id X → T → PX X → *T T → PX Y → E → TY S → id:=E; Z → SL → SZ S → begin SL end

  24. Tree Generation Programming Language Principles Lecture 5 Prepared by Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida

More Related