{-# 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 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) =>
  -- InputToken inp ~ Char =>
  Input inp =>
  Readable Gen (InputToken inp) =>
  Parser inp a ->
  CodeQ (inp -> Either (ParsingError inp) a)
runParser :: forall inp a.
(Ord (InputToken inp), Show (InputToken inp),
 Lift (InputToken inp), Input inp, Readable Gen (InputToken inp)) =>
Parser inp a -> CodeQ (inp -> Either (ParsingError inp) a)
runParser Parser inp a
p = [|| \input -> $$(generate [||input||] (machine p)) ||]