'++' { PT _ (TS "++") }
'--' { PT _ (TS "--") }
'-' { PT _ (TS "-") }
+ '!' { PT _ (TS "!") }
'<' { PT _ (TS "<") }
'<=' { PT _ (TS "<=") }
'>' { PT _ (TS ">") }
| 'if' '(' Exp ')' Stm 'else' Stm { SIf $3 $5 $7 }
| 'while' '(' Exp ')' Stm { SWhile $3 $5 }
| 'print' Exp ';' { SPrint $2 }
- | Stm ';' { $1 }
Exp :: { Exp }
-Exp : Exp1 BOp Exp1 { BExp $1 $2 $3 }
+Exp : Ident '=' Exp { EAss $1 $3 }
+ | Exp1 Op0 Exp1 { compExp_ $1 $2 $3 }
| Exp1 { $1 }
Exp3 : Ident '++' { postIncr_ $1 }
| Ident '--' { postDecr_ $1 }
| Ident { EVar $1 }
- | Ident '=' Exp { EAss $1 $3 }
| Integer { EInt $1 }
| '-' Exp3 { ENeg $2 }
+ | '!' Exp3 { ENot $2 }
| Bool { EBool $1 }
| 'readInt' { EReadI }
| 'readBool' { EReadB }
Stms : ListStm { Program (reverse $1) }
-BOp :: { BOp }
-BOp : '<' { Lt }
+Op0 :: { Op }
+Op0 : '<' { Lt }
| '<=' { ELt }
| '>' { Gt }
| '>=' { EGt }
Op :: { Op }
Op : Op1 { $1 }
| Op2 { $1 }
+ | Op0 { $1 }
Type :: { Type }
myLexer = tokens
decl_ t_ v_ = SDecl t_ v_ EDefault
if_ e_ s_ = SIf e_ s_ SNoop
-op1_ e1_ o_ e2_ = OpExp e1_ o_ e2_
-op2_ e1_ o_ e2_ = OpExp e1_ o_ e2_
+compExp_ e1_ o_ e2_ = BiOpExp e1_ o_ e2_
+op1_ e1_ o_ e2_ = BiOpExp e1_ o_ e2_
+op2_ e1_ o_ e2_ = BiOpExp e1_ o_ e2_
postIncr_ i_ = EPost i_ Plus
postDecr_ i_ = EPost i_ Minus
}