X-Git-Url: https://git.sourcephile.fr/haskell/symantic-parser.git/blobdiff_plain/3f0daffbee81756cfbfd938c2299eaff8c1e7d4b..5872160c05a45b876819139c3a7b37c93b4d92d1:/src/Symantic/Parser/Machine.hs diff --git a/src/Symantic/Parser/Machine.hs b/src/Symantic/Parser/Machine.hs index 25b9ee7..b4d592a 100644 --- a/src/Symantic/Parser/Machine.hs +++ b/src/Symantic/Parser/Machine.hs @@ -1,49 +1,38 @@ -{-# LANGUAGE TemplateHaskell #-} module Symantic.Parser.Machine - ( module Symantic.Parser.Machine - , module Symantic.Parser.Machine.Instructions - , module Symantic.Parser.Machine.Dump - , module Symantic.Parser.Machine.Eval - , module Symantic.Parser.Machine.Input - ) where -import Symantic.Parser.Machine.Instructions -import Symantic.Parser.Machine.Dump -import Symantic.Parser.Machine.Eval -import Data.Either (Either(..)) - + ( module Symantic.Parser.Machine + , module Symantic.Parser.Machine.Generate + , module Symantic.Parser.Machine.Input + , module Symantic.Parser.Machine.Instructions + , module Symantic.Parser.Machine.View + ) where import Data.Function ((.)) --- import Data.Char (Char) import Data.Ord (Ord) -import Language.Haskell.TH (CodeQ) import Symantic.Parser.Machine.Input import Symantic.Parser.Grammar import Text.Show (Show) import qualified Language.Haskell.TH.Syntax as TH -type Parser inp = +import Symantic.Parser.Machine.Instructions +import Symantic.Parser.Machine.Build +import Symantic.Parser.Machine.Generate +import Symantic.Parser.Machine.View + +-- * Type 'Parser' +type Parser inp = ParserRepr Gen inp + +-- | Like a 'Parser' but not bound to the 'Gen' interpreter. +type ParserRepr repr inp = ObserveSharing TH.Name - (OptimizeComb TH.Name - (Machine inp)) + (OptimizeGrammar TH.Name + (Machine repr inp)) +-- | Build a 'Machine' able to 'generate' the given 'Parser'. machine :: forall inp repr a. Ord (InputToken inp) => Show (InputToken inp) => TH.Lift (InputToken inp) => - -- InputToken inp ~ Char => - Executable repr => - Readable repr (InputToken inp) => - Grammar (Machine inp) => - Parser inp a -> + Grammar (InputToken inp) (Machine repr inp) => + Executable (InputToken inp) repr => + ParserRepr repr inp a -> repr inp '[] ('Succ 'Zero) a -machine = runMachine . optimizeComb . observeSharing - -runParser :: forall inp a. - Ord (InputToken inp) => - Show (InputToken inp) => - TH.Lift (InputToken inp) => - -- InputToken inp ~ Char => - Input inp => - Readable Eval (InputToken inp) => - Parser inp a -> - CodeQ (inp -> Either (ParsingError inp) a) -runParser p = [|| \input -> $$(eval [||input||] (machine p)) ||] +machine = runMachine . optimizeGrammar . observeSharing