packages feed

symantic-parser-0.2.0.20210703: 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 System.IO (IO)
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 'Machine'
type Machine repr inp =
  ObserveSharing TH.Name
                 (OptimizeGrammar (Program repr inp))

-- | Build a 'Machine' able to 'generateCode' for the given 'Parser'.
machine :: forall inp repr a.
  Grammarable (InputToken inp) (Program repr inp) =>
  Machinable (InputToken inp) repr =>
  Machine repr inp a ->
  IO (repr inp '[] a)
machine = optimizeMachine . grammar @(InputToken inp)