{-# LANGUAGE TemplateHaskell #-}
module Symantic.Parser
( module Symantic.Parser.Grammar
, module Symantic.Parser.Machine
, module Symantic.Parser
) where
import Data.Either (Either(..))
import Data.Ord (Ord)
import Language.Haskell.TH (CodeQ)
import Text.Show (Show)
import Type.Reflection (Typeable)
import qualified Language.Haskell.TH.Syntax as TH
import Symantic.Parser.Grammar
import Symantic.Parser.Machine
runParser :: forall inp a.
Ord (InputToken inp) =>
Show (InputToken inp) =>
TH.Lift (InputToken inp) =>
Typeable (InputToken inp) =>
Input inp =>
Readable (InputToken inp) Gen =>
Parser inp a ->
CodeQ (inp -> Either (ParsingError inp) a)
runParser :: forall inp a.
(Ord (InputToken inp), Show (InputToken inp),
Lift (InputToken inp), Typeable (InputToken inp), Input inp,
Readable (InputToken inp) Gen) =>
Parser inp a -> CodeQ (inp -> Either (ParsingError inp) a)
runParser Parser inp a
p = [|| \input -> $$(generateCode [||input||] (machine p)) ||]