4 True. Bool ::= "true" ;
5 False. Bool ::= "false" ;
7 SDecl. Stm ::= Type Ident "=" Exp ";" ;
8 decl. Stm ::= Type Ident ";" ;
9 define decl t v = SDecl t v EDefault ;
10 SExp. Stm ::= Exp ";" ;
11 SBlock. Stm ::= "{" [Stm] "}" ;
12 if. Stm ::= "if" "(" Exp ")" Stm ;
13 SIf. Stm ::= "if" "(" Exp ")" Stm "else" Stm ;
14 define if e s = SIf e s SNoop ;
15 SWhile. Stm ::= "while" "(" Exp ")" Stm ;
16 -- SFor. Stm ::= "for" "(" Stm Exp ";" Exp ")" Stm ;
17 SPrint. Stm ::= "print" Exp ";" ;
19 BExp. Exp ::= Exp1 BOp Exp1 ;
20 op1. Exp1 ::= Exp1 Op1 Exp2 ;
21 define op1 e1 o e2 = OpExp e1 o e2 ;
22 op2. Exp2 ::= Exp2 Op2 Exp3 ;
23 define op2 e1 o e2 = OpExp e1 o e2 ;
24 postIncr. Exp3 ::= Ident "++" ;
25 define postIncr i = EPost i Plus ;
26 postDecr. Exp3 ::= Ident "--" ;
27 define postDecr i = EPost i Minus ;
28 EVar. Exp3 ::= Ident ;
29 EAss. Exp3 ::= Ident "=" Exp;
30 EInt. Exp3 ::= Integer ;
31 ENeg. Exp3 ::= "-" Exp3 ;
32 EBool. Exp3 ::= Bool ;
33 EReadI. Exp3 ::= "readInt" ;
34 EReadB. Exp3 ::= "readBool" ;
44 Program. Stms ::= [Stm] ;
63 TInt. Type ::= "int" ;
64 TBool. Type ::= "bool" ;
68 internal ExpT. Exp ::= Type Exp ;
69 internal SNoop. Stm ::= ;
70 internal EDefault. Exp ::= ;
71 internal OpExp. Exp ::= Exp Op Exp ;
72 internal NoType. Type ::= ;
73 internal EPost. Exp ::= Ident Op1 ;
78 entrypoints Stms, Exp ;