packages feed

symantic-parser-0.0.0.20210101: src/Symantic/Parser/Machine.hs

module Symantic.Parser.Machine
 ( module Symantic.Parser.Machine
 , module Symantic.Parser.Machine.Instructions
 , module Symantic.Parser.Machine.Dump
 , module Symantic.Parser.Machine.Generate
 , module Symantic.Parser.Machine.Input
 ) where
import Data.Function ((.))
import Data.Ord (Ord)
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.Instructions
import Symantic.Parser.Machine.Dump
import Symantic.Parser.Machine.Generate

-- * Type 'Parser'
type Parser inp =
  ObserveSharing TH.Name
                 (OptimizeComb TH.Name
                               (Machine inp))

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