COP 5021 Lecture -*- Outline -*- * Abstract Syntax Trees (ASTs) in JastAdd ** importance of ASTs ------------------------------------------ IMPORTANCE OF ASTS ASTs are: the key interface between parser and rest of compiler (or static analysis) ------------------------------------------ ** overview in JastAdd ------------------------------------------ ABSTRACT SYNTAX TREES IN JASTADD ASTs are described in .ast files (e.g., WHILE.ast) JastAdd tool converts to java classes (e.g., AST/IfS.java, AST/BExpr.java) At runtime, each AST is a Java object. (constructed by the parser) ------------------------------------------ ** WHILE.ast file ------------------------------------------ // WHILE.ast file Program ::= S; abstract Op ::= ; Op_b : Op; Op_r : Op; Op_a : Op; abstract Expr; VarRefExpr: Expr ::= ; NumLitExpr: Expr ::= ; ABinaryExpr: Expr ::= Left:Expr Op:Op_a Right:Expr; BoolLitExpr:Expr ::= ; NotExpr: Expr ::= Expr; LogicExpr: Expr ::= Left:Expr Op:Op_b Right:Expr; RelExpr: Expr ::= Left:Expr Op:Op_r Right:Expr; LabeledExpr: Expr ::= LabelAST:Label Expr; // statements abstract S; CompoundS: S ::= SList:S* ; AssignS:S ::= LabelAST:Label Expr; SkipS:S ::= LabelAST:Label; IfS:S ::= LabeledExpr S1:S S2:S ; WhileS:S ::= LabeledExpr S; AssertS:S ::= LabeledExpr; abstract Label; NumLabel:Label ::= ; ------------------------------------------ Q: What's the syntax? Q: What does "abstract" mean? might want to look at some of the generated output .java files *** picture of runtime AST ------------------------------------------ PARSED AST EXAMPLE Parsing the program if x < 5 then y := 2 else skip gives the AST: [Program | S: * ] | v [IfS | LabeledExpr: * | S1: * | S2: *] / | \ v v v [LabeledExpr | [AssignS | [SkipS | LabelAST: * LabelAST: * LabelAST: * ] Expr: * ]| Var: * \ / | Expr: * ] \ v v [NumLabel | LabelAST: *] [NumLabel | [NumLabel | Num: * ] / Num: * ] | v | v [String | "1"] v [String | "3"] [String | "2"] [RelExpr | Left: *-----\ | Op_r: *-----|----->[Op_r | Contents: * ] | Right: * ] | | / v v [String | "<" ] [VarRefExpr | Contents * ] | v [String | "x" ] [NumLitExpr | Contents: * ] | v [String | "5"] ------------------------------------------