From ea41a7529715987941257a0330c1eb1ae08cc12c Mon Sep 17 00:00:00 2001 From: Paweł Dybiec Date: Wed, 8 Jan 2020 20:22:14 +0100 Subject: Initial commit Initial version of project. What is done: * Syntax of expressions,commands,programs and types * Crude typechecking * Some typechecking tests --- src/Lib.hs | 6 ++++++ src/Syntax.hs | 34 ++++++++++++++++++++++++++++++++++ src/Typecheck.hs | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 src/Lib.hs create mode 100644 src/Syntax.hs create mode 100644 src/Typecheck.hs (limited to 'src') diff --git a/src/Lib.hs b/src/Lib.hs new file mode 100644 index 0000000..d36ff27 --- /dev/null +++ b/src/Lib.hs @@ -0,0 +1,6 @@ +module Lib + ( someFunc + ) where + +someFunc :: IO () +someFunc = putStrLn "someFunc" diff --git a/src/Syntax.hs b/src/Syntax.hs new file mode 100644 index 0000000..1c888b5 --- /dev/null +++ b/src/Syntax.hs @@ -0,0 +1,34 @@ +module Syntax + where + +type Idnt = String +data Typ = TInt + | TRecord [(Idnt, Typ)] + | TVariant [(Idnt, Typ)] + | TPtr Typ + deriving(Eq,Show) + +data Expr = Var Idnt + | IntLit Int + | Record [(Idnt, Expr)] + | Variant Typ [(Idnt, Expr)] + | Add Expr Expr + | Mult Expr Expr + | Neg Expr + | Deref Expr + deriving(Eq,Show) +data Com = Skip + | Seq Com Com + | If Expr Com Com + | While Expr Com + | Asgn Idnt Expr + | Decl Idnt Expr Com + | Alloc Idnt Expr + | Save Idnt Expr + deriving(Eq,Show) + +data FuncDecl = Func Idnt [Idnt] [(Idnt,Expr)] Com Expr + deriving(Eq,Show) +data Program = P [FuncDecl] [(Idnt, Int)] Com + deriving(Eq,Show) + diff --git a/src/Typecheck.hs b/src/Typecheck.hs new file mode 100644 index 0000000..d8b8128 --- /dev/null +++ b/src/Typecheck.hs @@ -0,0 +1,43 @@ +module Typecheck +(inferExpr, + checkExpr) + where +import Syntax +import Control.Monad +type Environment = [(Idnt,Typ)] + +assertInt TInt = Just () +assertInt _ = Nothing +assertRec (Record _) = Just () +assertRec _ = Nothing +assertVar (Variant _ _) = Just () +assertVar _ = Nothing +assertPtr (TPtr _) = Just () +assertPtr _ = Nothing + +inferExpr :: Expr -> Environment -> Maybe Typ +inferExpr (Var name) env = lookup name env +inferExpr (IntLit _) _ = Just TInt +inferExpr (Record _) _ = undefined +inferExpr (Variant _ _) _ = undefined +inferExpr (Add e1 e2) env = do + checkExpr e1 env TInt + checkExpr e1 env TInt + return TInt +inferExpr (Mult e1 e2) env = do + checkExpr e1 env TInt + checkExpr e1 env TInt + return TInt +inferExpr (Neg e) env = do + checkExpr e env TInt + return TInt +inferExpr (Deref e1) env = do + t <- inferExpr e1 env + assertPtr t + return t + +checkExpr :: Expr -> Environment -> Typ -> Maybe () +checkExpr e env t = do + t' <- inferExpr e env + guard (t==t') + return () -- cgit 1.4.1