-{-# 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