1 / 21

AST Generation

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.

Download Presentation

AST 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. AST Generation Programming Language Concepts Lecture 9 Prepared by Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida

  2. Replacing Recursion with Iteration • Not all the nonterminals are needed. • The recursion in SL, X, Y and Z can be replaced with iteration.

  3. Replacing Recursion with Iteration (cont’d) SL→S Z Z→S Z →} SL proc S; {S → begin SL end → id := E; case Next_Token of T_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 call to SL. Replaces recursion on Z.

  4. Replacing Recursion with Iteration (cont’d) proc E; {E → TY Y → +TY → } T; while Next_Token = T_+ do Read (T_+); T; od end; Replaces recursion on Y.

  5. Replacing Recursion with Iteration (cont’d) proc T; {T → PX X → *T → } P; if Next_Token = T_* then Read (T_*); T; end; Replaces call to X.

  6. Replacing Recursion with Iteration (cont’d) proc P;{P → (E) → id } case Next_Token of T_(: Read (T_(); E; Read (T_)); T_id: Read (T_id); otherwise Error; end end;

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

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

  9. 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); od end

  10. 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) elseWrite (T → P); end;

  11. Construction of Derivation Tree for the Original Grammar (Bottom Up) (cont’d) proc P;{(1)P → (E) (2)P →(E) → id → id } // SAME AS BEFORE end;

  12. Input String: begin id := (id + id) * id; end Output: Example P → id T → P E → T P → id T → P E → E+T P → (E) P → id T → P T → P*T E → T S → id:=E; SL→ S S → begin SL end

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

  14. 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); od end; Left branching in tree!

  15. 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!

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

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

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

  19. AST Generation Programming Language Concepts Lecture 9 Prepared by Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida

More Related