symantic-parser-0.1.0.20210201: src/Symantic/Parser/Machine.hs
module Symantic.Parser.Machine
( 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 Data.Function ((.))
import Data.Ord (Ord)
import Text.Show (Show)
import qualified Language.Haskell.TH.Syntax as TH
import Symantic.Parser.Grammar
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'
type Parser inp = ParserRepr Gen inp
-- | Like a 'Parser' but not bound to the 'Gen' interpreter.
type ParserRepr repr inp =
ObserveSharing TH.Name
(OptimizeGrammar (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) =>
Grammar (InputToken inp) (Program repr inp) =>
Machine (InputToken inp) repr =>
ParserRepr repr inp a ->
repr inp '[] ('Succ 'Zero) a
machine = optimizeMachine . grammar @(InputToken inp)