packages feed

symantic-parser-0.2.0.20210703: src/Symantic/Parser.hs

module Symantic.Parser
  ( module Symantic.Parser.Grammar
  , module Symantic.Parser.Machine
  , module Symantic.Parser
  ) where

import Data.Either (Either)
import Data.Function (($))
import Language.Haskell.TH (CodeQ)
import qualified Language.Haskell.TH.Syntax as TH

import Symantic.Parser.Grammar
import Symantic.Parser.Machine

-- * Type 'Parser'
type Parser inp a = Machine Gen inp a

runParser :: forall inp a.
  Inputable inp =>
  Machinable (InputToken inp) Gen =>
  Parser inp a ->
  CodeQ (inp -> Either (ParsingError inp) a)
runParser p = TH.Code $ do
  mach <- TH.runIO $ machine p
  TH.examineCode $ generateCode mach