-- ordinary rules
-True. Bool ::= "true" ;
-False. Bool ::= "false" ;
-
-SDecl. Stm ::= Type Ident "=" Exp ";" ;
-decl. Stm ::= Type Ident ";" ;
-define decl t v = SDecl t v EDefault ;
-SExp. Stm ::= Exp ";" ;
-SBlock. Stm ::= "{" [Stm] "}" ;
-if. Stm ::= "if" "(" Exp ")" Stm ;
+
+True. Bool ::= "true" ;
+False. Bool ::= "false" ;
+
+TInt. Type ::= "int" ;
+TBool. Type ::= "bool" ;
+
+Program. Stms ::= [Stm] ;
+
+
+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 ;
-SWhile. Stm ::= "while" "(" Exp ")" Stm ;
+
-- SFor. Stm ::= "for" "(" Stm Exp ";" Exp ")" Stm ;
SPrint. Stm ::= "print" Exp ";" ;
--- VVar. Var ::= Ident ;
--- VAss. Var ::= Ident "=" Exp;
-BExp. Exp ::= Exp1 BOp Exp1 ;
+
+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 = OpExp e1 o e2 ;
+define op1 e1 o e2 = BiOpExp e1 o e2 ;
+
op2. Exp2 ::= Exp2 Op2 Exp3 ;
-define op2 e1 o e2 = OpExp e1 o e2 ;
-EIncr. Exp3 ::= Ident "++" ;
-EDecr. Exp3 ::= Ident "--" ;
+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 ;
-EAss. Exp3 ::= Ident "=" Exp;
EInt. Exp3 ::= Integer ;
-ENeg. Exp3 ::= "-" Exp3 ;
EBool. Exp3 ::= Bool ;
+
+ENeg. Exp3 ::= "-" Exp3 ;
+ENot. Exp3 ::= "!" Exp3 ;
+
EReadI. Exp3 ::= "readInt" ;
EReadB. Exp3 ::= "readBool" ;
+
coercions Exp 3 ;
-_. Stm ::= Stm ";" ;
+-- _. Stm ::= Stm ";" ;
terminator Stm "" ;
-Program. Stms ::= [Stm] ;
-Lt. BOp ::= "<" ;
-ELt. BOp ::= "<=" ;
-Gt. BOp ::= ">" ;
-EGt. BOp ::= ">=" ;
-Eq. BOp ::= "==" ;
-NEq. BOp ::= "!=" ;
+Lt. Op0 ::= "<" ;
+ELt. Op0 ::= "<=" ;
+Gt. Op0 ::= ">" ;
+EGt. Op0 ::= ">=" ;
+Eq. Op0 ::= "==" ;
+NEq. Op0 ::= "!=" ;
Plus. Op1 ::= "+" ;
Minus. Op1 ::= "-" ;
_. Op ::= Op1;
_. Op ::= Op2;
+_. Op ::= Op0;
-
-TInt. Type ::= "int" ;
-TBool. Type ::= "bool" ;
-
-- pragmas
-internal ExpT. Exp ::= Type Exp ;
+-- 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 ::= ;
-internal EDefault. Exp ::= ;
-internal OpExp. Exp ::= Exp Op Exp ;
-internal NoType. Type ::= ;
comment "/*" "*/" ;
comment "//" ;