]> Git — Sourcephile - haskell/symantic-parser.git/blob - src/Symantic/Parser/Grammar.hs
grammar: sort symantics by name
[haskell/symantic-parser.git] / src / Symantic / Parser / Grammar.hs
1 {-# LANGUAGE AllowAmbiguousTypes #-} -- For grammar
2 {-# LANGUAGE ConstraintKinds #-} -- For Grammar
3 module Symantic.Parser.Grammar
4 ( module Symantic.Parser.Grammar
5 , module Symantic.Parser.Grammar.Combinators
6 , module Symantic.Parser.Grammar.Fixity
7 , module Symantic.Parser.Grammar.Optimize
8 , module Symantic.Parser.Grammar.ObserveSharing
9 , module Symantic.Parser.Grammar.Write
10 , module Symantic.Parser.Grammar.View
11 , Letable(..)
12 , Letsable(..)
13 ) where
14 import Symantic.Parser.Grammar.Combinators
15 import Symantic.Parser.Grammar.View
16 import Symantic.Parser.Grammar.Fixity
17 import Symantic.Parser.Grammar.ObserveSharing
18 import Symantic.Parser.Grammar.Optimize
19 import Symantic.Parser.Grammar.Write
20
21 import Data.Function ((.))
22 import Data.String (String)
23 import Text.Show (Show(..))
24 import qualified Language.Haskell.TH.Syntax as TH
25
26 -- * Class 'Grammar'
27 type Grammar tok repr =
28 ( CombAlternable repr
29 , CombApplicable repr
30 , CombFoldable repr
31 , Letable TH.Name repr
32 , Letsable TH.Name repr
33 , CombLookable repr
34 , CombMatchable repr
35 , CombSatisfiable tok repr
36 , CombSelectable repr
37 , CombThrowable repr
38 )
39
40 -- | A usual pipeline to interpret 'Comb'inators:
41 -- 'observeSharing' then 'optimizeGrammar' then a polymorphic @(repr)@.
42 grammar ::
43 Grammar tok repr =>
44 ObserveSharing TH.Name
45 (OptimizeGrammar repr) a ->
46 repr a
47 grammar = optimizeGrammar . observeSharing
48
49 -- | An usual pipeline to show 'Comb'inators:
50 -- 'observeSharing' then 'optimizeGrammar' then 'viewGrammar' then 'show'.
51 showGrammar ::
52 ShowLetName showName TH.Name =>
53 ObserveSharing TH.Name
54 (OptimizeGrammar (ViewGrammar showName)) a ->
55 String
56 showGrammar = show . viewGrammar . grammar