-- ordinary rules Program. Stms ::= [Stm] ; SExp. Stm ::= Exp ";" ; SBlock. Stm ::= "{" [Stm] "}" ; SDecl. Stm ::= Type Ident "=" Exp ";" ; decl. Stm ::= Type Ident ";" ; define decl t v = SDecl t v EDefault ; 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 ";" ; 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" ; coercions Exp 3 ; -- _. Stm ::= Stm ";" ; terminator Stm "" ; 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; True. Bool ::= "true" ; False. Bool ::= "false" ; TInt. Type ::= "int" ; TBool. Type ::= "bool" ; -- pragmas internal ExpT. Exp ::= Type Exp ; internal SNoop. Stm ::= ; internal EDefault. Exp ::= ; internal BiOpExp. Exp ::= Exp Op Exp ; internal NoType. Type ::= ; internal EPost. Exp ::= Ident Op1 ; comment "/*" "*/" ; comment "//" ; entrypoints Stms, Exp ;