module Symantic.Parser.Machine
( module Symantic.Parser.Machine
- , module Symantic.Parser.Machine.Build
, 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 System.IO (IO)
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.Build
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 (Machine repr inp))
+-- * Type 'Machine'
+type Machine repr inp = Grammar (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) (Machine repr inp) =>
- Executable (InputToken inp) repr =>
- ParserRepr repr inp a ->
- repr inp '[] ('Succ 'Zero) a
+ Grammarable (InputToken inp) (Program repr inp) =>
+ Machinable (InputToken inp) repr =>
+ Machine repr inp a ->
+ IO (repr inp '[] a)
machine = optimizeMachine . grammar @(InputToken inp)