-- ordinary rules BTrue. BoolT ::= "true" ; BFalse. BoolT ::= "false" ; SDecl. Stm ::= Typ Var ";" ; --SAss. Stm ::= Ident "=" Exp ";" ; SExp. Stm ::= Exp ";" ; SBlock. Stm ::= "{" [Stm] "}" ; SIf. Stm ::= "if" "(" Exp ")" Stm ; SIfE. Stm ::= "if" "(" Exp ")" Stm "else" Stm ; SWhile. Stm ::= "while" "(" Exp ")" Stm ; -- SFor. Stm ::= "for" "(" Stm Exp ";" Exp ")" Stm ; SPrint. Stm ::= "print" Exp ";" ; VVar. Var ::= Ident ; VAss. Var ::= Ident "=" Exp; ELt. Exp ::= Exp1 "<" Exp1 ; EELt. Exp ::= Exp1 "<=" Exp1 ; EGt. Exp ::= Exp1 ">" Exp1 ; EEGt. Exp ::= Exp1 ">=" Exp1 ; EEq. Exp ::= Exp1 "==" Exp1 ; ENEq. Exp ::= Exp1 "!=" Exp1 ; EPlus. Exp1 ::= Exp1 "+" Exp2 ; EMinus. Exp1 ::= Exp1 "-" Exp2 ; ETimes. Exp2 ::= Exp2 "*" Exp3 ; EDiv. Exp2 ::= Exp2 "/" Exp3 ; EIncr. Exp3 ::= Ident "++" ; EDecr. Exp3 ::= Ident "--" ; EVar. Exp3 ::= Var ; EInt. Exp3 ::= Integer ; ENeg. Exp3 ::= "-" Exp3 ; EBool. Exp3 ::= BoolT ; EReadI. Exp3 ::= "readInt" ; EReadB. Exp3 ::= "readBool" ; coercions Exp 3 ; _. Stm ::= Stm ";" ; terminator Stm "" ; Program. Stms ::= [Stm] ; TInt. Typ ::= "int" ; TBool. Typ ::= "bool" ; -- pragmas internal ExpT. Exp ::= Typ Exp ; comment "/*" "*/" ; comment "//" ; entrypoints Stms, Exp ;