module Syntax where type Idnt = String data Typ = TInt | TRecord TypeDict | TVariant TypeDict | TPtr Typ deriving(Eq,Show) type TypeDict = [(Idnt,Typ)] data Expr = Var Idnt | IntLit Int | Record [(Idnt, Expr)] | Variant Typ Idnt Expr | Add Expr Expr | Mult Expr Expr | Neg Expr | Deref Expr | Match Expr [(Idnt, Expr)] | Proj Idnt 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 | SMatch Expr [(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)