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; abstract AExpr: Expr; VarRefExpr: AExpr ::= ; NumLitExpr: AExpr ::= ; ABinaryExpr: AExpr ::= Left:AExpr Op:Op_a Right:AExpr; abstract BExpr: Expr; BoolLitExpr:BExpr ::= ; NotExpr: BExpr ::= BExpr; LogicExpr: BExpr ::= Left:BExpr Op:Op_b Right:BExpr; RelExpr: BExpr ::= Left:AExpr Op:Op_r Right:AExpr; LabeledBExpr: BExpr ::= LabelAST:Label BExpr; // statements abstract S; CompoundS: S ::= SList:S* ; AssignS:S ::= LabelAST:Label AExpr; SkipS:S ::= LabelAST:Label; IfS:S ::= LabeledBExpr S1:S S2:S ; WhileS:S ::= LabeledBExpr S; AssertS:S ::= LabeledBExpr; 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 | LabeledBExpr: * | S1: * | S2: *] / | \ v v v [LabeledBExpr | [AssignS | [SkipS | LabelAST: * LabelAST: * LabelAST: * ] BExpr: * ]| Var: * \ / | AExpr: * ] \ 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"] ------------------------------------------