module Symantic.Parser.Machine ( module Symantic.Parser.Machine , module Symantic.Parser.Machine.Generate , module Symantic.Parser.Machine.Input , module Symantic.Parser.Machine.Instructions , module Symantic.Parser.Machine.Optimize , module Symantic.Parser.Machine.Program , module Symantic.Parser.Machine.View ) where import Data.Function ((.)) import Data.Ord (Ord) import System.IO (IO) import Text.Show (Show) import qualified Language.Haskell.TH.Syntax as TH import Symantic.Parser.Grammar import Symantic.Parser.Machine.Generate import Symantic.Parser.Machine.Input import Symantic.Parser.Machine.Instructions import Symantic.Parser.Machine.Optimize import Symantic.Parser.Machine.Program 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 (OptimizeGrammar (Program repr inp)) -- | Build a 'Machine' able to 'generateCode' for the given 'Parser'. machine :: forall inp repr a. Ord (InputToken inp) => Show (InputToken inp) => TH.Lift (InputToken inp) => Grammar (InputToken inp) (Program repr inp) => Machine (InputToken inp) repr => ParserRepr repr inp a -> IO (repr inp '[] a) machine = optimizeMachine . grammar @(InputToken inp)