| Safe Haskell | None |
|---|
Text.GRead.Grammar
Contents
Description
Representation of Data Type Grammars.
- class Gram a where
- data DGrammar a = forall env . DGrammar (Ref a env) (Env DGram env env)
- data DGram a env
- = DGD (DLNontDefs a env)
- | DGG (DGrammar a)
- newtype DRef a env = DRef (Ref a env, Int)
- newtype DLNontDefs a env = DLNontDefs [(DRef a env, DProductions a env)]
- newtype DProductions a env = DPS {}
- data DProd a env where
- data DSymbol a env where
- (.#.) :: DSymbol b env -> DProd (b -> a) env -> DProd a env
- consG :: DGrammar a -> Env DGram use def' -> Env DGram use (def', a)
- consD :: DLNontDefs a env -> Env DGram env def' -> Env DGram env (def', a)
- dNont :: (Ref a env, Int) -> DSymbol a env
- dTerm :: [Char] -> DSymbol Token env
- dEnd :: a -> DProd a env
- parenT :: t -> t1 -> t2 -> t1
- data Grammar a = forall env . Grammar (Ref a env) (Env Productions env env)
- newtype Productions a env = PS {}
- data Prod a env where
- data Symbol a env where
- data Token
- ext :: Env Productions env def' -> [Prod a env] -> Env Productions env (def', a)
- (.*.) :: Symbol b env -> Prod (b -> a) env -> Prod a env
- matchSym :: Symbol a env -> Symbol b env -> Maybe (Equal a b)
- append :: (a -> b -> c) -> Prod a env -> Symbol b env -> Prod c env
Class Gram
Class of data types with typed grammar representation. It has to be
instantiated in order to use the function gread.
Instances can be derived automatically using the functions defined in the module Text.GRead.Derive.
For example, given the declarations
infixl 5 :<:
infixr 6 :>:, :*:
data T1 = T1 :<: T1
| T1 :>: T1
| C1
data T2 a = a :*: T2 a
| C2
the instances of Gram can be
_0 = Zero
_1 = Suc _0
instance Gram T1 where
grammar = DGrammar _0 envT1
envT1 :: Env DGram ((),T1) ((),T1)
envT1 = consD (nonts _0) Empty
where
nonts _T1 = DLNontDefs
[ ( DRef (_T1, 5)
, DPS [ dNont (_T1, 5) .#. dTerm ":<:" .#.
dNont (_T1, 6) .#. dEnd infixL ]
)
, ( DRef (_T1, 6)
, DPS [ dNont (_T1, 7) .#. dTerm ":>:" .#.
dNont (_T1, 6) .#. dEnd infixR ]
)
, ( DRef (_T1,10)
, DPS [ dTerm "C1" .#. dEnd (const C1)
, dTerm "(" .#. dNont (_T1,0) .#.
dTerm ")" .#. dEnd parenT ]
)
]
infixL e1 _ e2 = e2 :<: e1
infixR e1 _ e2 = e2 :>: e1
instance Gram a => Gram (T2 a) where
grammar = DGrammar _0 envT2
envT2 :: (Gram a) => Env DGram (((),a),T2 a)
(((),a),T2 a)
envT2 = consD (nonts _0 _1) $
consG grammar Empty
where
nonts _T2 _A = DLNontDefs
[ ( DRef (_T2, 6)
, DPS [ dNont (_A, 7) .#. dTerm ":*:" .#.
dNont (_T2, 7) .#. dEnd infixT ]
)
, ( DRef (_T2,10)
, DPS [ dTerm "C2" .#. dEnd (const C2)
, dTerm "(" .#. dNont (_T2,0) .#.
dTerm ")" .#. dEnd parenT ]
)
]
infixP e1 _ e2 = e2 :+: e1
infixT e1 _ e2 = e2 :*: e1
In case of mutually recursive datatypes, their definitions have to be tupled together into a single environment.
Typed Grammar Representations for Data Types
Types
Data type describing grammatical structures of data types,
including information about precedences. The type DGrammar a
describes the grammar of the data type a.
newtype DLNontDefs a env Source
Constructors
| DLNontDefs [(DRef a env, DProductions a env)] |
newtype DProductions a env Source
Smart Constructors
Typed Grammar Representations
Types
newtype Productions a env Source
Smart Constructors
ext :: Env Productions env def' -> [Prod a env] -> Env Productions env (def', a)Source