{-# LANGUAGE TemplateHaskell #-} module Symantic.Parser.Automaton ( module Symantic.Parser.Automaton , module Symantic.Parser.Automaton.Instructions , module Symantic.Parser.Automaton.Dump , module Symantic.Parser.Automaton.Eval , module Symantic.Parser.Automaton.Input ) where import Symantic.Parser.Automaton.Instructions import Symantic.Parser.Automaton.Dump import Symantic.Parser.Automaton.Eval import Data.Either (Either(..)) import Symantic.Parser.Grammar import Symantic.Parser.Automaton.Input import Data.Function ((.)) import Language.Haskell.TH (CodeQ) import qualified Language.Haskell.TH.Syntax as TH type Parser inp = ObserveSharing TH.Name (OptimizeComb TH.Name (Automaton inp)) automaton :: forall inp repr a. Executable repr => Grammar (Automaton inp) => Parser inp a -> repr inp '[] ('Succ 'Zero) a automaton = runAutomaton . optimizeComb . observeSharing runParser :: forall inp a. Input inp => Parser (Cursor inp) a -> CodeQ (inp -> Either ParsingError a) runParser p = [||\input -> $$(eval [||input||] (automaton p))||]