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 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 -> repr inp '[] a machine = optimizeMachine . grammar @(InputToken inp)