{-# 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 p = [|| \input -> $$(generate [||input||] (machine p)) ||]