doc: update the ReadMe and ChangeLog
[haskell/symantic-parser.git] / src / Symantic / Parser / Machine.hs
index 25b9ee7eafd23e869cc8a93b1ad786aeb5156675..b4d592ae7071b63fc2fba32742246564fb7c5ed7 100644 (file)
@@ -1,49 +1,38 @@
-{-# LANGUAGE TemplateHaskell #-}
 module Symantic.Parser.Machine
- ( module Symantic.Parser.Machine
- , module Symantic.Parser.Machine.Instructions
- , module Symantic.Parser.Machine.Dump
- , module Symantic.Parser.Machine.Eval
- , module Symantic.Parser.Machine.Input
- ) where
-import Symantic.Parser.Machine.Instructions
-import Symantic.Parser.Machine.Dump
-import Symantic.Parser.Machine.Eval
-import Data.Either (Either(..))
-
+  ( module Symantic.Parser.Machine
+  , module Symantic.Parser.Machine.Generate
+  , module Symantic.Parser.Machine.Input
+  , module Symantic.Parser.Machine.Instructions
+  , module Symantic.Parser.Machine.View
+  ) where
 import Data.Function ((.))
--- import Data.Char (Char)
 import Data.Ord (Ord)
-import Language.Haskell.TH (CodeQ)
 import Symantic.Parser.Machine.Input
 import Symantic.Parser.Grammar
 import Text.Show (Show)
 import qualified Language.Haskell.TH.Syntax as TH
 
-type Parser inp =
+import Symantic.Parser.Machine.Instructions
+import Symantic.Parser.Machine.Build
+import Symantic.Parser.Machine.Generate
+import Symantic.Parser.Machine.View
+
+-- * Type 'Parser'
+type Parser inp = ParserRepr Gen inp
+
+-- | Like a 'Parser' but not bound to the 'Gen' interpreter.
+type ParserRepr repr inp =
   ObserveSharing TH.Name
-                 (OptimizeComb TH.Name
-                               (Machine inp))
+                 (OptimizeGrammar TH.Name
+                                  (Machine repr inp))
 
+-- | Build a 'Machine' able to 'generate' the given 'Parser'.
 machine :: forall inp repr a.
   Ord (InputToken inp) =>
   Show (InputToken inp) =>
   TH.Lift (InputToken inp) =>
-  -- InputToken inp ~ Char =>
-  Executable repr =>
-  Readable repr (InputToken inp) =>
-  Grammar (Machine inp) =>
-  Parser inp a ->
+  Grammar (InputToken inp) (Machine repr inp) =>
+  Executable (InputToken inp) repr =>
+  ParserRepr repr inp a ->
   repr inp '[] ('Succ 'Zero) a
-machine = runMachine . optimizeComb . observeSharing
-
-runParser :: forall inp a.
-  Ord (InputToken inp) =>
-  Show (InputToken inp) =>
-  TH.Lift (InputToken inp) =>
-  -- InputToken inp ~ Char =>
-  Input inp =>
-  Readable Eval (InputToken inp) =>
-  Parser inp a ->
-  CodeQ (inp -> Either (ParsingError inp) a)
-runParser p = [|| \input -> $$(eval [||input||] (machine p)) ||]
+machine = runMachine . optimizeGrammar . observeSharing