-- Haskel data types for the abstract syntax. -- Generated by the BNF converter. {-# LANGUAGE GeneralizedNewtypeDeriving #-} -- | The abstract syntax of language C4. module AbsC4 where import qualified Prelude as T (Char, Double, Integer, String) import qualified Prelude as C (Eq, Ord, Show, Read) import Data.String data Progr = Program [Dec] [Stm] -- ^ Progr ::= "int" "main" "(" ")" "{" Dec Stm "}" deriving (C.Eq, C.Ord, C.Show, C.Read) data Dec = Decl Typ [Ident] -- ^ Dec ::= Typ Ident deriving (C.Eq, C.Ord, C.Show, C.Read) data Stm = SAss Ident Exp -- ^ Stm ::= Ident "=" Exp ";" | SAssT Typ Ident Exp -- ^ Stm ::= Typ Ident Exp | SBlock [Dec] [Stm] -- ^ Stm ::= "{" Dec Stm "}" | SDec Dec -- ^ Stm ::= Dec | SDecr Ident -- ^ Stm ::= Ident "--" ";" | SIf Exp Stm Stm -- ^ Stm ::= "if" "(" Exp ")" Stm "else" Stm | SIncr Ident -- ^ Stm ::= Ident "++" ";" | SPrint Exp -- ^ Stm ::= "printInt" "(" Exp ")" ";" | SReturn Exp -- ^ Stm ::= "return" Exp ";" | SReturnT Typ Exp -- ^ Stm ::= Typ Exp | SWhile Exp Stm -- ^ Stm ::= "while" "(" Exp ")" Stm deriving (C.Eq, C.Ord, C.Show, C.Read) data Exp = EChar T.Char -- ^ Exp ::= Char | EDouble T.Double -- ^ Exp ::= Double | EInt T.Integer -- ^ Exp ::= Integer | EOpA Exp Op Exp -- ^ Exp ::= Exp0 Op Exp0 | EOpB Exp Op Exp -- ^ Exp ::= Exp1 Op0 Exp1 | EOpC Exp Op Exp -- ^ Exp ::= Exp1 Op1 Exp2 | EOpD Exp Op Exp -- ^ Exp ::= Exp2 Op2 Exp3 | EOpE Exp Op Exp -- ^ Exp ::= Exp1 Op Exp1 | EString T.String -- ^ Exp ::= String | EVar Ident -- ^ Exp ::= Ident deriving (C.Eq, C.Ord, C.Show, C.Read) data Op = OAnd -- ^ Op ::= "&&" | OEq -- ^ Op ::= "==" | OGt -- ^ Op ::= ">" | OLt -- ^ Op ::= "<" | OMinus -- ^ Op ::= "-" | OOr -- ^ Op ::= "||" | OPlus -- ^ Op ::= "+" | OTimes -- ^ Op ::= "*" deriving (C.Eq, C.Ord, C.Show, C.Read) data Typ = TDouble -- ^ Typ ::= "double" | TInt -- ^ Typ ::= "int" deriving (C.Eq, C.Ord, C.Show, C.Read) newtype Ident = Ident T.String deriving (C.Eq, C.Ord, C.Show, C.Read, Data.String.IsString)