asts ast node classes
play

ASTs AST node classes The parsers output is an abstract syntax tree - PDF document

ASTs AST node classes The parsers output is an abstract syntax tree (AST) Each node in an AST is an instance of an AST class representing the grammatical structure of the parsed input IfStmt , AssignStmt , AddExpr , VarDecl , etc. ASTs


  1. ASTs AST node classes The parser’s output is an abstract syntax tree (AST) Each node in an AST is an instance of an AST class representing the grammatical structure of the parsed input • IfStmt , AssignStmt , AddExpr , VarDecl , etc. ASTs represent only semantically meaningful aspects of input Each AST class declares its own instance variables program, unlike concrete syntax trees which record the holding its AST subtrees complete textual form of the input program • IfStmt has testExpr , thenStmt , and elseStmt • no need to record keywords or punctuation like ( ) , ; , else • AssignStmt has lhsVar and rhsExpr • rest of compiler only cares about abstract structure • AddExpr has arg1Expr and arg2Expr • VarDecl has typeExpr and varName Craig Chambers 86 CSE 401 Craig Chambers 87 CSE 401 AST class hierarchy AST extensions in project AST classes organized into an inheritance hierarchy based on New variable declarations: commonalities of meaning and structure • StaticVarDecl Each "abstract non-terminal" that has multiple alternative New types: concrete forms will have an abstract class that’s the • DoubleType superclass of the various alternative forms • ArrayType • Stmt is abstract superclass of IfStmt , AssignStmt , etc. • Expr is abstract superclass of AddExpr , VarExpr , etc. New/changed statements: • Type is abstract superclass of IntType , ClassType , etc. • IfStmt can omit else branch • ForStmt • BreakStmt • ArrayAssignStmt New expressions: • DoubleLiteralExpr • OrExpr • ArrayLookupExpr • ArrayLengthExpr • ArrayNewExpr Craig Chambers 88 CSE 401 Craig Chambers 89 CSE 401

  2. Automatic parser generation in MiniJava Terminal and nonterminal declarations We use the CUP tool to automatically create a parser from a Terminal declarations we saw before: specification file, Parser/minijava.cup /* reserved words: */ terminal CLASS, PUBLIC, STATIC, EXTENDS; The MiniJava Makefile automatically rebuilds the parser ... whenever its specification file changes /* tokens with values: */ terminal String IDENTIFIER; terminal Integer INT_LITERAL; A CUP file has several sections: • introductory declarations included with the generated Nonterminals are similar: parser nonterminal Program Program; • declarations of the terminals and nonterminals with their nonterminal MainClassDecl MainClassDecl; types nonterminal List/*<...>*/ ClassDecls; • the AST node or other value returned when finished parsing that nonterminal or terminal nonterminal RegularClassDecl ClassDecl; • precedence declarations ... • productions + actions nonterminal List/*<Stmt>*/ Stmts; nonterminal Stmt Stmt; nonterminal List/*<Expr>*/ Exprs; nonterminal List/*<Expr>*/ MoreExprs; nonterminal Expr Expr; nonterminal String Identifier; Craig Chambers 90 CSE 401 Craig Chambers 91 CSE 401 Precedence declarations Productions Can specify precedence and associativity of operators All of the form: • equal precedence in a single declaration LHS ::= RHS1 {: Java code 1 :} | RHS2 {: Java code 2 :} • lowest precedence textually first | ... • specify left, right, or nonassoc with each declaration | RHSn {: Java code n :}; Examples: Can label symbols in RHS with : var suffix to refer to its result precedence left AND_AND; value in Java code precedence nonassoc EQUALS_EQUALS, • var left is set to line in input where var symbol was EXCLAIM_EQUALS; precedence left LESSTHAN, LESSEQUAL, E.g.: GREATEREQUAL, GREATERTHAN; Expr ::= Expr:arg1 PLUS Expr:arg2 precedence left PLUS, MINUS; {: RESULT = new AddExpr( precedence left STAR, SLASH; arg1,arg2,arg1left); :} precedence left EXCLAIM; | INT_LITERAL:value precedence left PERIOD; {: RESULT = new IntLiteralExpr( value.intValue(),valueleft); :} | Expr:rcvr PERIOD Identifier:message OPEN_PAREN Exprs:args CLOSE_PAREN {: RESULT = new MethodCallExpr( rcvr,message,args,rcvrleft); :} | ... ; Craig Chambers 92 CSE 401 Craig Chambers 93 CSE 401

  3. Error handling Panic mode error recovery How to handle syntax error? When find a syntax error, skip tokens until reach a “landmark” • landmarks in MiniJava: ; , ) , } Option 1: quit compilation • once a landmark is found, hope to have gotten back on track + easy - inconvenient for programmer In top-down parser, maintain set of landmark tokens as recursive descent proceeds Option 2: error recovery • landmarks selected from terminals later in production + try to catch as many errors as possible on one compile • as parsing proceeds, set of landmarks will change, - avoid streams of spurious errors depending on the parsing context Option 3: error correction In bottom-up parser, can add special error nonterminals, + fix syntax errors as part of compilation followed by landmarks - hard!! • if syntax error, then will skip tokens till see landmark, then reduce and continue normally E.g. Stmt ::= ... | error ; | { error } Expr ::= ... | ( error ) Craig Chambers 94 CSE 401 Craig Chambers 95 CSE 401

Recommend


More recommend