From a05f5aee2ceddec9721ce04ae596734524b80940 Mon Sep 17 00:00:00 2001 From: Michael Andreen Date: Sat, 18 Feb 2006 14:25:25 +0000 Subject: [PATCH] streamlining the abstract syntax --- Typecheck.hs | 29 +++++++++++++++++++++++++++++ syntax.cf | 43 ++++++++++++++++++++++++++++--------------- 2 files changed, 57 insertions(+), 15 deletions(-) create mode 100644 Typecheck.hs diff --git a/Typecheck.hs b/Typecheck.hs new file mode 100644 index 0000000..cc416e2 --- /dev/null +++ b/Typecheck.hs @@ -0,0 +1,29 @@ +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 + diff --git a/syntax.cf b/syntax.cf index a0e6953..28e93f9 100644 --- a/syntax.cf +++ b/syntax.cf @@ -4,8 +4,8 @@ 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] "}" ; @@ -19,16 +19,11 @@ SPrint. Stm ::= "print" Exp ";" ; -- 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 ; @@ -49,15 +44,33 @@ terminator Stm "" ; 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 "//" ; -- 2.39.2