-{-# LANGUAGE TemplateHaskell #-}
module Symantic.Parser.Machine
- ( module Symantic.Parser.Machine
- , module Symantic.Parser.Machine.Instructions
- , module Symantic.Parser.Machine.Dump
- , module Symantic.Parser.Machine.Gen
- , module Symantic.Parser.Machine.Input
- ) where
-import Symantic.Parser.Machine.Instructions
-import Symantic.Parser.Machine.Dump
-import Symantic.Parser.Machine.Gen
-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.Optimize
+ , module Symantic.Parser.Machine.Program
+ , module Symantic.Parser.Machine.View
+ ) where
+import System.IO (IO)
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
+import Symantic.Parser.Machine.Generate
+import Symantic.Parser.Machine.Input
+import Symantic.Parser.Machine.Instructions
+import Symantic.Parser.Machine.Optimize
+import Symantic.Parser.Machine.Program
+import Symantic.Parser.Machine.View
-type Parser inp =
- ObserveSharing TH.Name
- (OptimizeComb TH.Name
- (Machine inp))
+-- * Type 'Machine'
+type Machine repr inp = Grammar (Program repr inp)
+-- | Build a 'Machine' able to 'generateCode' for 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 ->
- 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 Gen (InputToken inp) =>
- Parser inp a ->
- CodeQ (inp -> Either (ParsingError inp) a)
-runParser p = [|| \input -> $$(generate [||input||] (machine p)) ||]
+ Grammarable (InputToken inp) (Program repr inp) =>
+ Machinable (InputToken inp) repr =>
+ Machine repr inp a ->
+ IO (repr inp '[] a)
+machine = optimizeMachine . grammar @(InputToken inp)