--- /dev/null
+module Typecheck where
+
+import Abssyntax
+
+typeCheckExp :: Exp -> Maybe Type
+BExp e o e' = do
+ TInt <- typeCheck e
+ TInt <- typeCheck e'
+ return TBool
+OpExp e o e' = do
+ TInt <- typeCheck e
+ TInt <- typeCheck e'
+ return TInt
+
+typeCheckStm :: Stm -> Maybe Type
+SNoop = return NoType
+SExp e = typeCheckExp e
+SBlock ss = do
+ mapM typeCheckStm ss
+ return NoType
+SIf e s s' = do
+ TBool <- typeCheckExp e
+ NoType <- typeCheckStm s
+ NoType <- typeCheckStm s
+ return NoType
+SWhile e s = do
+ TBool <- typeCheckExp e
+ NoType <- typeCheckStm s
+
True. Bool ::= "true" ;
False. Bool ::= "false" ;
-SDecl. Stm ::= Typ Ident "=" Exp ";" ;
-decl. Stm ::= Typ Ident ";" ;
+SDecl. Stm ::= Type Ident "=" Exp ";" ;
+decl. Stm ::= Type Ident ";" ;
define decl t v = SDecl t v EDefault ;
SExp. Stm ::= Exp ";" ;
SBlock. Stm ::= "{" [Stm] "}" ;
-- VVar. Var ::= Ident ;
-- VAss. Var ::= Ident "=" Exp;
-ELt. Exp ::= Exp1 "<" Exp1 ;
-EELt. Exp ::= Exp1 "<=" Exp1 ;
-EGt. Exp ::= Exp1 ">" Exp1 ;
-EEGt. Exp ::= Exp1 ">=" Exp1 ;
-EEq. Exp ::= Exp1 "==" Exp1 ;
-ENEq. Exp ::= Exp1 "!=" Exp1 ;
-EPlus. Exp1 ::= Exp1 "+" Exp2 ;
-EMinus. Exp1 ::= Exp1 "-" Exp2 ;
-ETimes. Exp2 ::= Exp2 "*" Exp3 ;
-EDiv. Exp2 ::= Exp2 "/" Exp3 ;
+BExp. Exp ::= Exp1 BOp Exp1 ;
+op1. Exp1 ::= Exp1 Op1 Exp2 ;
+define op1 e1 o e2 = OpExp e1 o e2 ;
+op2. Exp2 ::= Exp2 Op2 Exp3 ;
+define op2 e1 o e2 = OpExp e1 o e2 ;
EIncr. Exp3 ::= Ident "++" ;
EDecr. Exp3 ::= Ident "--" ;
EVar. Exp3 ::= Ident ;
Program. Stms ::= [Stm] ;
+Lt. BOp ::= "<" ;
+ELt. BOp ::= "<=" ;
+Gt. BOp ::= ">" ;
+EGt. BOp ::= ">=" ;
+Eq. BOp ::= "==" ;
+NEq. BOp ::= "!=" ;
-TInt. Typ ::= "int" ;
-TBool. Typ ::= "bool" ;
+Plus. Op1 ::= "+" ;
+Minus. Op1 ::= "-" ;
+Times. Op2 ::= "*" ;
+Div. Op2 ::= "/" ;
+
+_. Op ::= Op1;
+_. Op ::= Op2;
+
+
+
+TInt. Type ::= "int" ;
+TBool. Type ::= "bool" ;
-- pragmas
-internal ExpT. Exp ::= Typ Exp ;
+internal ExpT. Exp ::= Type Exp ;
internal SNoop. Stm ::= ;
internal EDefault. Exp ::= ;
+internal OpExp. Exp ::= Exp Op Exp ;
+internal NoType. Type ::= ;
comment "/*" "*/" ;
comment "//" ;