Abstract Syntax Tree. 2 Compiler IC Program ic x86 executable exe Lexical Analysis Syntax Analysis Parsing ASTSymbol Table etc. Inter. Rep. (IR) Code.

Slides:



Advertisements
Similar presentations
Chapter 2-2 A Simple One-Pass Compiler
Advertisements

ANALYSIS OF PROG. LANG. PROGRAM ANALYSIS Instructors: Crista Lopes Copyright © Instructors. 1.
Compilation /15a Lecture 13 Compiling Object-Oriented Programs Noam Rinetzky 1.
Parsing & Scanning Lecture 2 COMP /25/2004 Derek Ruths Office: DH Rm #3010.
Abstract Syntax Mooly Sagiv html:// 1.
1 JavaCUP JavaCUP (Construct Useful Parser) is a parser generator Produce a parser written in java, itself is also written in Java; There are many parser.
Winter Compiler Construction T7 – semantic analysis part II type-checking Mooly Sagiv and Roman Manevich School of Computer Science Tel-Aviv.
Compilation Encapsulation Or: Why Every Component Should Just Do Its Damn Job.
Mooly Sagiv and Roman Manevich School of Computer Science
Compiler Construction LR(0) + Visitor Ran Shaham and Ohad Shacham School of Computer Science Tel-Aviv University.
Compiler Construction Abstract Syntax Tree Ran Shaham and Ohad Shacham School of Computer Science Tel-Aviv University.
1 Semantic Processing. 2 Contents Introduction Introduction A Simple Compiler A Simple Compiler Scanning – Theory and Practice Scanning – Theory and Practice.
Abstract Syntax Trees Compiler Baojian Hua
Chapter 2 Chang Chi-Chung Lexical Analyzer The tasks of the lexical analyzer:  Remove white space and comments  Encode constants as tokens.
Compiler Construction Semantic Analysis I Ran Shaham and Ohad Shacham School of Computer Science Tel-Aviv University.
Compiler Construction Abstract Syntax Tree Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University.
Chapter 2 Chang Chi-Chung Lexical Analyzer The tasks of the lexical analyzer:  Remove white space and comments  Encode constants as tokens.
Yu-Chen Kuo1 Chapter 2 A Simple One-Pass Compiler.
Compiler Construction Recap Ran Shaham and Ohad Shacham School of Computer Science Tel-Aviv University.
Compiler Construction Semantic Analysis II Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University.
Chapter 2 A Simple Compiler
Compiler Construction Semantic Analysis I Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University.
Compiler Construction Parsing II Ran Shaham and Ohad Shacham School of Computer Science Tel-Aviv University.
Compiler Construction Recap Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University.
Compiler Construction Parsing I Ran Shaham and Ohad Shacham School of Computer Science Tel-Aviv University.
Abstract Syntax Trees Lecture 14 Wed, Mar 3, 2004.
2.2 A Simple Syntax-Directed Translator Syntax-Directed Translation 2.4 Parsing 2.5 A Translator for Simple Expressions 2.6 Lexical Analysis.
1 Abstract Syntax Tree--motivation The parse tree –contains too much detail e.g. unnecessary terminals such as parentheses –depends heavily on the structure.
CPSC 388 – Compiler Design and Construction Parsers – Context Free Grammars.
Semantic Analysis III + Intermediate Representation I.
Semantic Analysis (Generating An AST) CS 471 September 26, 2007.
Chapter 1 Introduction Dr. Frank Lee. 1.1 Why Study Compiler? To write more efficient code in a high-level language To provide solid foundation in parsing.
Language Translators - Lee McCluskey LANGUAGE TRANSLATORS: WEEK 21 LECTURE: Using JavaCup to create simple interpreters
CSC 338: Compiler design and implementation
Grammar Variation in Compiler Design Carl Wu. Three topics Syntax Grammar vs. AST Component(?)-based grammar Aspect-oriented grammar.
1 Top Down Parsing. CS 412/413 Spring 2008Introduction to Compilers2 Outline Top-down parsing SLL(1) grammars Transforming a grammar into SLL(1) form.
Lesson 3 CDT301 – Compiler Theory, Spring 2011 Teacher: Linus Källberg.
CS412/413 Introduction to Compilers and Translators Spring ’99 Lecture 8: Semantic Analysis and Symbol Tables.
Compiler Construction Compiler Construction Semantic Analysis I.
Compiler Construction Dr. Noam Rinetzky and Orr Tamir School of Computer Science Tel Aviv University
COMP Parsing 3 of 4 Lectures 23. Using the Scanner Break input into tokens Use Scanner with delimiter: public void parse(String input ) { Scanner.
Chapter 2. Design of a Simple Compiler J. H. Wang Sep. 21, 2015.
CPS 506 Comparative Programming Languages Syntax Specification.
Abstract Syntax Trees Compiler Baojian Hua
Introduction Lecture 1 Wed, Jan 12, The Stages of Compilation Lexical analysis. Syntactic analysis. Semantic analysis. Intermediate code generation.
11/25/2015© Hal Perkins & UW CSEH-1 CSE P 501 – Compilers Implementing ASTs (in Java) Hal Perkins Winter 2008.
Winter Compiler Construction T5 – AST Mooly Sagiv and Roman Manevich School of Computer Science Tel-Aviv University.
Compiler Principles Fall Compiler Principles Lecture 6: Parsing part 5 Roman Manevich Ben-Gurion University.
Compiler Construction Compiler Construction Semantic Analysis I.
Semantic Analysis II. Messages Please check lecturer notices in the Moodle Appeals  Legitimate: “I don’t have the bug you mentioned…”  Illegitimate:
1 A Simple Syntax-Directed Translator CS308 Compiler Theory.
Semantic Analysis III + Intermediate Representation I.
Mooly Sagiv and Roman Manevich School of Computer Science
The Visitor Design Pattern and Java Tree Builder
Semantic Analysis II Type Checking EECS 483 – Lecture 12 University of Michigan Wednesday, October 18, 2006.
C H A P T E R T W O Linking Syntax And Semantics Programming Languages – Principles and Paradigms by Allen Tucker, Robert Noonan.
Bernd Fischer COMP2010: Compiler Engineering Abstract Syntax Trees.
Syntax-Directed Definitions CS375 Compilers. UT-CS. 1.
Compiler Construction Recap. 2 Announcements PA4: extension until end of exam period – Not a single day more, for any reason! PA5: bonus exercise – Will.
MiniJava Compiler A multi-back-end JIT compiler of Java.
COMP261 Lecture 18 Parsing 3 of 4.
A Simple Syntax-Directed Translator
Abstract Syntax Trees Lecture 14 Mon, Feb 28, 2005.
Implementing ASTs (in Java) Hal Perkins Autumn 2009
Basic Program Analysis: AST
Parsing & Scanning Lecture 2
CSE401 Introduction to Compiler Construction
Winter Compiler Construction T5 – AST
Syntax-Directed Translation
Implementing ASTs (in Java) Hal Perkins Autumn 2011
Presentation transcript:

Abstract Syntax Tree

2 Compiler IC Program ic x86 executable exe Lexical Analysis Syntax Analysis Parsing ASTSymbol Table etc. Inter. Rep. (IR) Code Generation IC compiler

3 From text to abstract syntax 5 + (7 * x) )id*num(+ Lexical Analyzer program text token stream Parser Grammar: E  id E  num E  E + E E  E * E E  ( E ) num(5) E EE+ E*E ( E) num(7)id(x) + Num(5) Num(7) id(x) * Abstract syntax tree parse tree valid syntax error

Abstract Syntax Tree Intermediate program representation Preserves program hierarchy What is the root of the AST? Provides clear interface to other compiler phases 4

5 Parsing and AST prog class_list ICClass FieldsOrMethods Field FieldsOrMethods type ID(state) BOOLEAN Method FieldsOrMethods … … Syntax tree built during parsing ProgAST ClassAST classList FieldAST[0] type:BoolType name:state MethodAST[0] MethodAST[1] MethodAST[2] … … methodList fieldList

6 AST node contents class ICClass extends ASTNode { String name; List fields; List methods;... } abstract class ASTNode { int getLine();... } class Program extends ASTNode { List classes;... }

7 Expression public class Expr extends ASTNode { private int value; private Expr left; private Expr right; private String operator; public Expr(Integer val) { value = val.intValue(); } public Expr(Expr operand, String op) { this.left = operand; this.operator = op; } public Expr(Expr left, Expr right, String op) { this.left = left; this.right = right; this.operator = op; }

8 Partial AST hierarchy ASTNode ProgramICClassStatementMethod VirtualMethodStaticMethod... Field

9 Partial AST hierarchy LocalVariable Statement StatementBlockIfWhile... Expression LiteralNew... Call declaration

IC Grammar 10

non terminal Program program; non terminal ICClass class; non terminal List class_list; program ::= class_list:cl {: RESULT = new Program(getLine(), cl); :} ; class_list ::= class:c {: RESULT = new LinkedList (); RESULT.add(c); :} | class_list:cl class:c {: cl.add(c); RESULT = cl; :} ; AST construction

12 AST traversal Once AST stable want to operate on tree AST traversal for type-checking AST traversal for transformation (IR) AST traversal for pretty-printing

13 “Non-Object Oriented” approach prettyPrint(ASTNode node) { if (node instanceof Program) { Program prog = (Program) node; for (ICClass icc : prog.classes) { prettyPrint(icc); } } else if (node instanceof ICClass) { ICClass icc = (ICClass) node; printClass(icc); } else if (node instanceof BinaryExpression) { BinaryExpression be = (BinaryExpression) node; prettyPrint(be.lhs); System.out.println(be.operator); prettyPrint(be.rhs); }... } Messy code instanceof + down-casting error-prone Not extensible

14 Single dispatch - polymorphism class A { void op() {…} } class B extends A { void op() {…} } class C extends A { void op() {…} }

15 What if we need more operations? class A { void op1() {…} void op2() {…} void op3() {…} } class B extends A { void op1() {…} void op2() {…} void op3() {…} } class C extends A { void op1() {…} void op2() {…} void op3() {…} } Want to separate complicated operations from data structures

16 class A { } class B extends A { } class C extends A { } class op1 extends op{ … // lots of code } class op2 extends op{ … // lots of code } class op3 extends op{ … // lots of code } × What if we need more operations?

17 class A { } class B extends A { } class C extends A { } class op1 extends op{ doOp(A a){ … // lots of code } } doOp(B b){ … // lots of code } } What if we need more operations? class op2 extends op{ doOp(A a){ … // lots of code } } doOp(B b){ … // lots of code } } class op3 extends op{ doOp(A a){ … // lots of code } } doOp(B b){ … // lots of code } } op o = new op3(); A a = new B(); o.doOp(a);

18 Separate operations on objects of a data structure from object representation Each operation (pass) may be implemented as separate visitor Use double-dispatch to find right method for object Visitor Pattern

19 Visitor pattern in Java interface Visitor { visit(A a); visit(B b); visit(C c); } class A { A x; accept(Visitor v) { v.visit(this); } } class B extends A { accept(Visitor v) { v.visit(this); } } class op1 implements Visitor { visit(A a) {…} visit(B b) {…} visit(C c) {…} } × class op2 implements Visitor { visit(A a) {…} visit(B b) {…} visit(C c) {…} } class op3 implements Visitor { visit(A a) {…} visit(B b) {…} visit(C c) {…} } class C extends A { accept(Visitor v) { v.visit(this); } }

20 Double dispatch example Visitor v = new op1(); // op1/2/3 A x = new B(); // x can be A/B/C x.accept(v); class op1 implements Visitor { visit(A a) { } visit(B b) { … } } class B { accept(Visitor v) { // always calls visit(B b) v.visit(this); } } 1 st dispatch 2 nd dispatch

21 Double dispatch example Visitor v = new op1(); // op1/2/3 A x = new B(); // x can be A/B/C x.accept(v); class op1 implements Visitor { visit(A a) { } visit(B b) { … } } class B { accept(Visitor v) { // always calls visit(B b) v.visit(this); } } 1 st dispatch 2 nd dispatch op1op2op3 A B C 1 st dispatch x.accept(v) v.visit(this) 2 nd dispatch op1.visit(B b)

22 Straight Line Program example prog  stmt_list stmt_list  stmt stmt_list  stmt_list stmt stmt  var = expr; stmt  print(expr); expr  expr + expr expr  expr - expr expr  expr * expr expr  expr / expr expr  - expr expr  ( expr ) expr  number expr  readi() expr  var ASTNode StmtExpr PrintStmt AssignStmt BinaryOpExpr UnaryOpExpr NumberExpr ReadIExpr StmtList VarExpr (Code available on web site. Demonstrates scanning, parsing, AST + visitors)web site

23 Printing visitor example interface Visitor { void visit(StmtList stmts); void visit(Stmt stmt); void visit(PrintStmt stmt); void visit(AssignStmt stmt); void visit(Expr expr); void visit(ReadIExpr expr); void visit(VarExpr expr); void visit(NumberExpr expr); void visit(UnaryOpExpr expr); void visit(BinaryOpExpr expr); } public class PrettyPrinter implements Visitor { public void print(ASTNode root) { root.accept(this); } public void visit(StmtList stmts) { for (Stmt s : stmts.statements) { s.accept(this); System.out.println(); } } // x = 2*7 public void visit(AssignStmt stmt) { stmt.varExpr.accept(this); System.out.print("="); stmt.rhs.accept(this); System.out.print(";"); } // x public void visit(VarExpr expr) { System.out.print(expr.name); } // 2*7 public void visit(BinaryOpExpr expr) { expr.lhs.accept(this); System.out.print(expr.op); expr.rhs.accept(this); }... }

24 Visitor variations interface PropagatingVisitor { /** Visits a statement node with a given * context object (book-keeping) * and returns the result * of the computation on this node. */ Object visit(Stmt st, Object context); Object visit(Expr e, Object context); Object visit(BinaryOpExpr e, Object context);... } Propagate values down the AST (and back)

25 Evaluating visitor example public class SLPEvaluator implements PropagatingVisitor { public void evaluate(ASTNode root) { root.accept(this); } /** x = 2*7 */ public Object visit(AssignStmt stmt, Object env) { Expr rhs = stmt.rhs; Integer expressionValue = (Integer) rhs.accept(this, env); VarExpr var = stmt.varExpr; ((Environment)env).update(var, expressionValue); return null; } /** expressions like 2*7 and 2*y */ public Object visit(BinaryOpExpr expr, Object env) { Integer lhsValue = (Integer) expr.lhs.accept(this, env); Integer rhsValue = (Integer) expr.rhs.accept(this, env); int result; switch (expr.op) { case PLUS: result = lhsValue.intValue() + rhsValue.intValue() ;... } return new Integer(result); }... } class Environment { Integer get(VarExpr ve) {…} void update(VarExpr ve, int value) {…} }

26 NumberExpr value = 1 BinaryOpExpr + leftright NumberExpr value= 2 VarExpr name = x BinaryOpExpr + leftright class BinaryOpExpr extends Expression { Object accept(Visitor v) { return v.visit(this); } Expression lhs, rhs; } class NumberExpr extends Expression { Object accept(Visitor v) { return v.visit(this); } int val; } SLPEvaluator ev = new SLPEvaluator(); Integer result = (Integer)root.accept(ev); root visit (lhs) visit (rhs) AST traversal public class SLPEvaluator … { public Object visit(BinaryOpExpr e, Object env) { Integer lhsValue=(Integer)e.lhs.accept(this,env); Integer rhsValue=(Integer)e.rhs.accept(this,env); int result; switch (expr.op) { case PLUS: result=lhsValue.intValue()+rhsValue.intValue();... } return new Integer(result); } public Object visit(NumberExpr e,Object env) { return e.value; } public Object visit(VarExpr e, Object env) { return ((Environment)env).get(e); } 1+2+x