-- ordinary rules
-BTrue. BoolT ::= "true" ;
-BFalse. BoolT ::= "false" ;
+True. Bool ::= "true" ;
+False. Bool ::= "false" ;
-SDecl. Stm ::= Typ Ident ";" ;
-SDeclAss. Stm ::= Typ Ident "=" Exp ";" ;
+SDecl. Stm ::= Typ Ident "=" Exp ";" ;
+decl. Stm ::= Typ Ident ";" ;
+define decl t v = SDecl t v EDefault ;
SExp. Stm ::= Exp ";" ;
SBlock. Stm ::= "{" [Stm] "}" ;
-SIf. Stm ::= "if" "(" Exp ")" Stm ;
-SIfE. Stm ::= "if" "(" Exp ")" Stm "else" Stm ;
+if. Stm ::= "if" "(" Exp ")" Stm ;
+SIf. Stm ::= "if" "(" Exp ")" Stm "else" Stm ;
+define if e s = SIf e s SNoop ;
SWhile. Stm ::= "while" "(" Exp ")" Stm ;
-- SFor. Stm ::= "for" "(" Stm Exp ";" Exp ")" Stm ;
SPrint. Stm ::= "print" Exp ";" ;
EAss. Exp3 ::= Ident "=" Exp;
EInt. Exp3 ::= Integer ;
ENeg. Exp3 ::= "-" Exp3 ;
-EBool. Exp3 ::= BoolT ;
+EBool. Exp3 ::= Bool ;
EReadI. Exp3 ::= "readInt" ;
EReadB. Exp3 ::= "readBool" ;
-- pragmas
internal ExpT. Exp ::= Typ Exp ;
+internal SNoop. Stm ::= ;
+internal EDefault. Exp ::= ;
comment "/*" "*/" ;
comment "//" ;