ChristmasTree-0.2.1.1: Alternative approach of 'read' that composes grammars instead of parsers.

Safe HaskellNone

Text.GRead.Grammar

Contents

Description

Representation of Data Type Grammars.

Synopsis

Class Gram

class Gram a whereSource

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.

Methods

grammar :: DGrammar aSource

The function grammar returns the grammar representation of the data type.

Typed Grammar Representations for Data Types

Types

data DGrammar a Source

Data type describing grammatical structures of data types, including information about precedences. The type DGrammar a describes the grammar of the data type a.

Constructors

forall env . DGrammar (Ref a env) (Env DGram env env)

A grammar consists of an environment (Env) with the defined non-terminals and a reference (Ref) to the main non-terminal in the environment.

data DGram a env Source

Constructors

DGD (DLNontDefs a env) 
DGG (DGrammar a) 

newtype DRef a env Source

Constructors

DRef (Ref a env, Int) 

newtype DLNontDefs a env Source

Constructors

DLNontDefs [(DRef a env, DProductions a env)] 

newtype DProductions a env Source

Constructors

DPS 

Fields

unDPS :: [DProd a env]
 

data DProd a env whereSource

Constructors

DSeq :: DSymbol b env -> DProd (b -> a) env -> DProd a env 
DEnd :: a -> DProd a env 

data DSymbol a env whereSource

Constructors

DNont :: DRef a env -> DSymbol a env 
DTerm :: Token -> DSymbol Token env 

Smart Constructors

(.#.) :: DSymbol b env -> DProd (b -> a) env -> DProd a envSource

consG :: DGrammar a -> Env DGram use def' -> Env DGram use (def', a)Source

consD :: DLNontDefs a env -> Env DGram env def' -> Env DGram env (def', a)Source

dNont :: (Ref a env, Int) -> DSymbol a envSource

dEnd :: a -> DProd a envSource

parenT :: t -> t1 -> t2 -> t1Source

Typed Grammar Representations

Types

data Grammar a Source

Constructors

forall env . Grammar (Ref a env) (Env Productions env env) 

newtype Productions a env Source

Constructors

PS 

Fields

unPS :: [Prod a env]
 

data Prod a env whereSource

Constructors

Seq :: Symbol b env -> Prod (b -> a) env -> Prod a env 
End :: a -> Prod a env 

data Symbol a env whereSource

Constructors

Nont :: Ref a env -> Symbol a env 
Term :: Token -> Symbol Token env 

data Token Source

Constructors

Keyw String 
Open 
Close 

Smart Constructors

ext :: Env Productions env def' -> [Prod a env] -> Env Productions env (def', a)Source

(.*.) :: Symbol b env -> Prod (b -> a) env -> Prod a envSource

Utils

matchSym :: Symbol a env -> Symbol b env -> Maybe (Equal a b)Source

append :: (a -> b -> c) -> Prod a env -> Symbol b env -> Prod c envSource