-- Haskel data types for the abstract syntax. -- Generated by the BNF converter. {-# LANGUAGE GeneralizedNewtypeDeriving #-} -- | The abstract syntax of language Prolog. module AbsProlog where import qualified Prelude as T (String) import qualified Prelude as C (Eq, Ord, Show, Read) import Data.String data Database = Db [Clause] -- ^ Database ::= Clause deriving (C.Eq, C.Ord, C.Show, C.Read) data Clause = Directive [Predicate] -- ^ Clause ::= ":-" Predicate | Fact Predicate -- ^ Clause ::= Predicate | Rule Predicate [Predicate] -- ^ Clause ::= Predicate ":-" Predicate deriving (C.Eq, C.Ord, C.Show, C.Read) data Predicate = APred Atom -- ^ Predicate ::= Atom | CPred Atom [Term] -- ^ Predicate ::= Atom "(" Term ")" deriving (C.Eq, C.Ord, C.Show, C.Read) data Term = Complex Atom [Term] -- ^ Term ::= Atom "(" Term ")" | TAtom Atom -- ^ Term ::= Atom | TList List -- ^ Term ::= List | VarT Var -- ^ Term ::= Var deriving (C.Eq, C.Ord, C.Show, C.Read) data Atom = Atm LIdent -- ^ Atom ::= LIdent | EAtm Ident -- ^ Atom ::= "\'" Ident "\'" deriving (C.Eq, C.Ord, C.Show, C.Read) data Var = A Wild -- ^ Var ::= Wild | V UIdent -- ^ Var ::= UIdent deriving (C.Eq, C.Ord, C.Show, C.Read) data List = Cons [Term] List -- ^ List ::= "[" Term "|" List "]" | ConsV [Term] Var -- ^ List ::= "[" Term "|" Var "]" | Empty -- ^ List ::= "[" "]" | Enum [Term] -- ^ List ::= "[" Term "]" 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) newtype UIdent = UIdent T.String deriving (C.Eq, C.Ord, C.Show, C.Read, Data.String.IsString) newtype LIdent = LIdent T.String deriving (C.Eq, C.Ord, C.Show, C.Read, Data.String.IsString) newtype Wild = Wild T.String deriving (C.Eq, C.Ord, C.Show, C.Read, Data.String.IsString)