]> ruin.nu Git - proglang.git/commitdiff
streamlining the abstract syntax
authorMichael Andreen <harv@ruin.nu>
Sat, 18 Feb 2006 14:25:25 +0000 (14:25 +0000)
committerMichael Andreen <harv@ruin.nu>
Sat, 18 Feb 2006 14:25:25 +0000 (14:25 +0000)
Typecheck.hs [new file with mode: 0644]
syntax.cf

diff --git a/Typecheck.hs b/Typecheck.hs
new file mode 100644 (file)
index 0000000..cc416e2
--- /dev/null
@@ -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
+
index a0e69538f58bb9a72899ec801b68366d11e3f808..28e93f9a4f1afb152c4ecb6997953411bc7d9b56 100644 (file)
--- a/syntax.cf
+++ b/syntax.cf
@@ -4,8 +4,8 @@
 True. Bool ::= "true" ;
 False. Bool ::= "false" ;
 
 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] "}" ;
 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;
 
 -- 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 ;
 EIncr.    Exp3    ::= Ident "++" ;
 EDecr.    Exp3    ::= Ident "--" ;
 EVar.     Exp3    ::= Ident ;
@@ -49,15 +44,33 @@ terminator Stm "" ;
 
 Program.  Stms ::= [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
 
 
 -- pragmas
 
-internal ExpT. Exp ::= Typ Exp ;
+internal ExpT. Exp ::= Type Exp ;
 internal SNoop. Stm ::= ;
 internal EDefault. Exp ::= ;
 internal SNoop. Stm ::= ;
 internal EDefault. Exp ::= ;
+internal OpExp. Exp ::= Exp Op Exp ;
+internal NoType. Type ::= ;
 
 comment "/*" "*/" ;
 comment "//" ;
 
 comment "/*" "*/" ;
 comment "//" ;