{-# 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) =>
  -- InputToken inp ~ Char =>
  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)) ||]