| EVar Ident
| EInt Integer
| ENeg Exp
+ | ENot Exp
| EBool Bool
| EReadI
| EReadB
{\symb{{$=$}}} &{\symb{;}} &{\symb{\{}} \\
{\symb{\}}} &{\symb{(}} &{\symb{)}} \\
{\symb{{$+$}{$+$}}} &{\symb{{$-$}{$-$}}} &{\symb{{$-$}}} \\
-{\symb{{$<$}}} &{\symb{{$<$}{$=$}}} &{\symb{{$>$}}} \\
-{\symb{{$>$}{$=$}}} &{\symb{{$=$}{$=$}}} &{\symb{!{$=$}}} \\
-{\symb{{$+$}}} &{\symb{*}} &{\symb{/}} \\
+{\symb{!}} &{\symb{{$<$}}} &{\symb{{$<$}{$=$}}} \\
+{\symb{{$>$}}} &{\symb{{$>$}{$=$}}} &{\symb{{$=$}{$=$}}} \\
+{\symb{!{$=$}}} &{\symb{{$+$}}} &{\symb{*}} \\
+{\symb{/}} & & \\
\end{tabular}\\
\subsection*{Comments}
& {\delimit} &{\nonterminal{Ident}} \\
& {\delimit} &{\nonterminal{Integer}} \\
& {\delimit} &{\terminal{{$-$}}} {\nonterminal{Exp3}} \\
+ & {\delimit} &{\terminal{!}} {\nonterminal{Exp3}} \\
& {\delimit} &{\nonterminal{Bool}} \\
& {\delimit} &{\terminal{readInt}} \\
& {\delimit} &{\terminal{readBool}} \\
$u = [\0-\255] -- universal: any character
@rsyms = -- symbols and non-identifier-like reserved words
- \= | \; | \{ | \} | \( | \) | \+ \+ | \- \- | \- | \< | \< \= | \> | \> \= | \= \= | \! \= | \+ | \* | \/
+ \= | \; | \{ | \} | \( | \) | \+ \+ | \- \- | \- | \! | \< | \< \= | \> | \> \= | \= \= | \! \= | \+ | \* | \/
:-
"//" [.]* ; -- Toss single line comments
'++' { PT _ (TS "++") }
'--' { PT _ (TS "--") }
'-' { PT _ (TS "-") }
+ '!' { PT _ (TS "!") }
'<' { PT _ (TS "<") }
'<=' { PT _ (TS "<=") }
'>' { PT _ (TS ">") }
| Ident { EVar $1 }
| Integer { EInt $1 }
| '-' Exp3 { ENeg $2 }
+ | '!' Exp3 { ENot $2 }
| Bool { EBool $1 }
| 'readInt' { EReadI }
| 'readBool' { EReadB }
EVar id -> prPrec i 3 (concatD [prt 0 id])
EInt n -> prPrec i 3 (concatD [prt 0 n])
ENeg exp -> prPrec i 3 (concatD [doc (showString "-") , prt 3 exp])
+ ENot exp -> prPrec i 3 (concatD [doc (showString "!") , prt 3 exp])
EBool bool -> prPrec i 3 (concatD [prt 0 bool])
EReadI -> prPrec i 3 (concatD [doc (showString "readInt")])
EReadB -> prPrec i 3 (concatD [doc (showString "readBool")])
EVar id -> failure x
EInt n -> failure x
ENeg exp -> failure x
+ ENot exp -> failure x
EBool bool -> failure x
EReadI -> failure x
EReadB -> failure x
typeCheckExp (ENeg e) = do
TInt <- typeCheckExp e
return TInt
+typeCheckExp (ENot e) = do
+ TBool <- typeCheckExp e
+ return TBool
typeCheckVar :: (MonadState Types m) => Ident -> m Type
typeCheckVar i = do
/*
tests if and if/else
*/
-if (readBool) {
+if (!readBool) {
if (readInt < 0)
print true;
else
EVar. Exp3 ::= Ident ;
EInt. Exp3 ::= Integer ;
ENeg. Exp3 ::= "-" Exp3 ;
--- ENot. Exp3 ::= "!" Exp3 ;
+ENot. Exp3 ::= "!" Exp3 ;
EBool. Exp3 ::= Bool ;
EReadI. Exp3 ::= "readInt" ;
EReadB. Exp3 ::= "readBool" ;