import edu.neu.ccs.demeter.dj.*; import java.util.*; Main = List(Item) EOF. Item : Column | Declaration | Event. Column = "column" Title [Width] "is" <expr> Expr. Title = String. Width = "width" <width> Integer. Declaration = "declare" <varname> Varname [<attribute> Attribute] ["=" <expr> Expr]. Attribute : Asset | Liability. Asset = "asset". Liability = "liability". // Asset variables have their values added to the total savings every month. // Liability variables have their values subtracted from the total savings every month. Event = "event" <eventname> Eventname "is" [<shown> Shown] <occurrence> Occurrence <statements> Statements "end". Eventname = Ident. Shown = "shown". Occurrence : Once | Repeated. Once = "once at" When. When : Eventname | Date. Date = Month Year. Month : Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | MonthInteger. Jan = "jan". Feb = "feb". Mar = "mar". Apr = "apr". May = "may". Jun = "jun". Jul = "jul". Aug = "aug". Sep = "sep". Oct = "oct". Nov = "nov". Dec = "dec". MonthInteger = Integer. Year = Integer. Repeated : Yearly | Monthly. Yearly = "yearly every" Month. Monthly = "monthly". Statements = List(Statement). Statement : Assignment | If_Then | While | Print | Dump | Stop. Assignment = Varname "=" Expr. If_Then = "if" Expr "then" <thenStmts> Statements ["else" <elseStmts> Statements] "end". While = "while" Expr "loop" Statements "end". Stop = "stop". Dump = "dump symboltable". Print = "print" PrintOp. PrintOp : lookahead (@ 2 @) PrintStrExp | PrintStr | PrintExp. PrintStr = String. PrintStrExp = String Expr. PrintExp = Expr. // Expression definition Expr = BoolExpr. BoolExpr = RelExpr BoolExpr_ . BoolExpr_ : And | Or | EmptyBoolExpr. And = "and" RelExpr <next> BoolExpr_ . Or = "or" RelExpr <next> BoolExpr_ . EmptyBoolExpr = . RelExpr = NumExpr RelExpr_ . RelExpr_ : GT | LT | GE | LE | EQ | NE | EmptyRelExpr. GT = ">" NumExpr . LT = "<" NumExpr . GE = ">=" NumExpr . LE = "<=" NumExpr . EQ = "=" NumExpr . NE = "!=" NumExpr . EmptyRelExpr = . NumExpr = Term NumExpr_. NumExpr_ : Add | Sub | EmptyNumExpr . Add = "+" Term <next> NumExpr_. Sub = "-" Term <next> NumExpr_. EmptyNumExpr = . Term = Factor Term_. Term_ : Mul | Div | EmptyTerm. Mul = "*" Factor <next> Term_. Div = "/" Factor <next> Term_. EmptyTerm = . Factor = UnaryOp Factor1. UnaryOp : Negate | Not | EmptyUnary. Negate = "-". Not = "not". EmptyUnary =. Factor1 : Paren | SimpleFactor. Paren = "(" Expr ")". SimpleFactor = Simple. Simple : lookahead (@ 2 @) DoubleLiteral | IntegerLiteral | Varname. // Need lookahead to distinguish between integer and float literals. IntegerLiteral = <v> Integer. DoubleLiteral = <v> Double. Varname = <v> Ident. List(S) ~ {S}. // these don't appear in object file: Symbol = Varname [Attribute] [Value]. Value = <v> Double. SymbolTable = List(Symbol). // Visitors visitor EvalVisitor = extends Visitor. visitor InitSymbolTableVisitor = . visitor SearchSymbolTableVisitor = <name> String extends Visitor. visitor DumpSymbolTableVisitor = extends Visitor. visitor ValueOfVisitor = extends Visitor. visitor NameOfVisitor = extends Visitor. visitor EventVisitor = <year> double <month> double. visitor StatementVisitor = . visitor ColumnTitleVisitor = . visitor ColumnValueVisitor = <names> String. visitor GetAttributeVisitor = .