-- ordinary rules True. Bool ::= "true" ; False. Bool ::= "false" ; TInt. Type ::= "int" ; TBool. Type ::= "bool" ; Program. Program ::= [FuncStm] ; SExp. Stm ::= Exp ";" ; SBlock. Stm ::= "{" [Stm] "}" ; SDecl. Stm ::= Type Ident "=" Exp ";" ; SDeclD. Stm ::= Type Ident ";" ; SWhile. Stm ::= "while" "(" Exp ")" Stm ; SIf. Stm ::= "if" "(" Exp ")" Stm "else" Stm ; if. Stm ::= "if" "(" Exp ")" Stm ; define if e s = SIf e s SNoop ; -- SFor. Stm ::= "for" "(" Stm Exp ";" Exp ")" Stm ; SPrint. Stm ::= "print" Exp ";" ; SReturn. Stm ::= "return" Exp ";" ; EAss. Exp ::= Ident "=" Exp; compExp. Exp ::= Exp1 Op0 Exp1 ; define compExp e1 o e2 = BiOpExp e1 o e2 ; op1. Exp1 ::= Exp1 Op1 Exp2 ; define op1 e1 o e2 = BiOpExp e1 o e2 ; op2. Exp2 ::= Exp2 Op2 Exp3 ; define op2 e1 o e2 = BiOpExp e1 o e2 ; postIncr. Exp3 ::= Ident "++" ; define postIncr i = EPost i Plus ; postDecr. Exp3 ::= Ident "--" ; define postDecr i = EPost i Minus ; EVar. Exp3 ::= Ident ; EInt. Exp3 ::= Integer ; EBool. Exp3 ::= Bool ; ENeg. Exp3 ::= "-" Exp3 ; ENot. Exp3 ::= "!" Exp3 ; EReadI. Exp3 ::= "readInt" ; EReadB. Exp3 ::= "readBool" ; EFunc. Exp3 ::= Ident "(" [Exp] ")" ; coercions Exp 3 ; -- _. Stm ::= Stm ";" ; terminator Stm "" ; separator Exp "," ; Decl. Decl ::= Type Ident ; separator Decl "," ; Func. Func ::= Type Ident "(" [Decl] ")" "{" [Stm] "}" ; separator Func "" ; S. FuncStm ::= Stm ; F. FuncStm ::= Func ; separator FuncStm "" ; -- E1. Exps ::= Exp ; -- E2. Exps ::= Exp "," Exps ; Lt. Op0 ::= "<" ; ELt. Op0 ::= "<=" ; Gt. Op0 ::= ">" ; EGt. Op0 ::= ">=" ; Eq. Op0 ::= "==" ; NEq. Op0 ::= "!=" ; Plus. Op1 ::= "+" ; Minus. Op1 ::= "-" ; Times. Op2 ::= "*" ; Div. Op2 ::= "/" ; _. Op ::= Op1; _. Op ::= Op2; _. Op ::= Op0; -- pragmas -- internal ExpT. Exp ::= Type Exp ; -- internal EDefault. Exp ::= ; internal BiOpExp. Exp ::= Exp Op Exp ; -- internal NoType. Type ::= ; internal EPost. Exp ::= Ident Op1 ; internal SNoop. Stm ::= ; comment "/*" "*/" ; comment "//" ; entrypoints Program;