Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- data Instr input valueStack (failStack :: Peano) returnValue where
- Push :: InstrPure v -> Instr inp (v ': vs) es ret -> Instr inp vs es ret
- Pop :: Instr inp vs es ret -> Instr inp (v ': vs) es ret
- LiftI2 :: InstrPure (x -> y -> z) -> Instr inp (z ': vs) es ret -> Instr inp (y ': (x ': vs)) es ret
- Fail :: [ErrorItem (InputToken inp)] -> Instr inp vs ('Succ es) ret
- PopFail :: Instr inp vs es ret -> Instr inp vs ('Succ es) ret
- CatchFail :: Instr inp vs ('Succ es) ret -> Instr inp (Cursor inp ': vs) es ret -> Instr inp vs es ret
- LoadInput :: Instr inp vs es r -> Instr inp (Cursor inp ': vs) es r
- PushInput :: Instr inp (Cursor inp ': vs) es ret -> Instr inp vs es ret
- Case :: Instr inp (x ': vs) es r -> Instr inp (y ': vs) es r -> Instr inp (Either x y ': vs) es r
- Swap :: Instr inp (x ': (y ': vs)) es r -> Instr inp (y ': (x ': vs)) es r
- Choices :: [InstrPure (v -> Bool)] -> [Instr inp vs es ret] -> Instr inp vs es ret -> Instr inp (v ': vs) es ret
- Subroutine :: LetName v -> Instr inp '[] ('Succ 'Zero) v -> Instr inp vs ('Succ es) ret -> Instr inp vs ('Succ es) ret
- Jump :: LetName ret -> Instr inp '[] ('Succ es) ret
- Call :: LetName v -> Instr inp (v ': vs) ('Succ es) ret -> Instr inp vs ('Succ es) ret
- Ret :: Instr inp '[ret] es ret
- Read :: [ErrorItem (InputToken inp)] -> InstrPure (InputToken inp -> Bool) -> Instr inp (InputToken inp ': vs) ('Succ es) ret -> Instr inp vs ('Succ es) ret
- DefJoin :: LetName v -> Instr inp (v ': vs) es ret -> Instr inp vs es ret -> Instr inp vs es ret
- RefJoin :: LetName v -> Instr inp (v ': vs) es ret
- data InstrPure a where
- InstrPureHaskell :: Haskell a -> InstrPure a
- InstrPureSameOffset :: Cursorable cur => InstrPure (cur -> cur -> Bool)
- newtype LetName a = LetName {}
- type Executable repr = (Stackable repr, Branchable repr, Failable repr, Inputable repr, Routinable repr, Joinable repr)
- class Stackable (repr :: Type -> [Type] -> Peano -> Type -> Type) where
- class Branchable (repr :: Type -> [Type] -> Peano -> Type -> Type) where
- class Failable (repr :: Type -> [Type] -> Peano -> Type -> Type) where
- class Inputable (repr :: Type -> [Type] -> Peano -> Type -> Type) where
- class Routinable (repr :: Type -> [Type] -> Peano -> Type -> Type) where
- class Joinable (repr :: Type -> [Type] -> Peano -> Type -> Type) where
- class Readable (repr :: Type -> [Type] -> Peano -> Type -> Type) (tok :: Type) where
- data Peano
- pattern Fmap :: InstrPure (x -> y) -> Instr inp (y ': xs) es ret -> Instr inp (x ': xs) es ret
- pattern App :: Instr inp (y ': vs) es ret -> Instr inp (x ': ((x -> y) ': vs)) es ret
- pattern If :: Instr inp vs es ret -> Instr inp vs es ret -> Instr inp (Bool ': vs) es ret
- data Machine inp v = Machine {}
- runMachine :: forall inp v es repr. Executable repr => Readable repr (InputToken inp) => Machine inp v -> repr inp '[] ('Succ es) v
- failIfConsumed :: Cursorable (Cursor inp) => Instr inp vs ('Succ es) ret -> Instr inp (Cursor inp ': vs) ('Succ es) ret
- makeJoin :: Instr inp (v ': vs) es ret -> (Instr inp (v ': vs) es ret -> Instr inp vs es ret) -> Instr inp vs es ret
Type Instr
data Instr input valueStack (failStack :: Peano) returnValue where Source #
Push :: InstrPure v -> Instr inp (v ': vs) es ret -> Instr inp vs es ret |
|
Pop :: Instr inp vs es ret -> Instr inp (v ': vs) es ret |
|
LiftI2 :: InstrPure (x -> y -> z) -> Instr inp (z ': vs) es ret -> Instr inp (y ': (x ': vs)) es ret |
|
Fail :: [ErrorItem (InputToken inp)] -> Instr inp vs ('Succ es) ret |
|
PopFail :: Instr inp vs es ret -> Instr inp vs ('Succ es) ret |
|
CatchFail :: Instr inp vs ('Succ es) ret -> Instr inp (Cursor inp ': vs) es ret -> Instr inp vs es ret |
|
LoadInput :: Instr inp vs es r -> Instr inp (Cursor inp ': vs) es r |
|
PushInput :: Instr inp (Cursor inp ': vs) es ret -> Instr inp vs es ret |
|
Case :: Instr inp (x ': vs) es r -> Instr inp (y ': vs) es r -> Instr inp (Either x y ': vs) es r |
|
Swap :: Instr inp (x ': (y ': vs)) es r -> Instr inp (y ': (x ': vs)) es r |
|
Choices :: [InstrPure (v -> Bool)] -> [Instr inp vs es ret] -> Instr inp vs es ret -> Instr inp (v ': vs) es ret |
|
Subroutine :: LetName v -> Instr inp '[] ('Succ 'Zero) v -> Instr inp vs ('Succ es) ret -> Instr inp vs ('Succ es) ret |
|
Jump :: LetName ret -> Instr inp '[] ('Succ es) ret |
|
Call :: LetName v -> Instr inp (v ': vs) ('Succ es) ret -> Instr inp vs ('Succ es) ret |
|
Ret :: Instr inp '[ret] es ret |
|
Read :: [ErrorItem (InputToken inp)] -> InstrPure (InputToken inp -> Bool) -> Instr inp (InputToken inp ': vs) ('Succ es) ret -> Instr inp vs ('Succ es) ret |
|
DefJoin :: LetName v -> Instr inp (v ': vs) es ret -> Instr inp vs es ret -> Instr inp vs es ret | |
RefJoin :: LetName v -> Instr inp (v ': vs) es ret |
Instances
(Executable repr, Readable repr (InputToken inp)) => Trans (Instr inp vs es) (repr inp vs es) Source # | |
Defined in Symantic.Parser.Machine.Instructions |
Type InstrPure
data InstrPure a where Source #
InstrPureHaskell :: Haskell a -> InstrPure a | |
InstrPureSameOffset :: Cursorable cur => InstrPure (cur -> cur -> Bool) |
Type LetName
Class Executable
type Executable repr = (Stackable repr, Branchable repr, Failable repr, Inputable repr, Routinable repr, Joinable repr) Source #
Class Stackable
class Stackable (repr :: Type -> [Type] -> Peano -> Type -> Type) where Source #
push :: InstrPure v -> repr inp (v ': vs) n ret -> repr inp vs n ret Source #
pop :: repr inp vs n ret -> repr inp (v ': vs) n ret Source #
liftI2 :: InstrPure (x -> y -> z) -> repr inp (z ': vs) es ret -> repr inp (y ': (x ': vs)) es ret Source #
swap :: repr inp (x ': (y ': vs)) n r -> repr inp (y ': (x ': vs)) n r Source #
Instances
Stackable Gen Source # | |
Defined in Symantic.Parser.Machine.Generate push :: forall v inp (vs :: [Type]) (n :: Peano) ret. InstrPure v -> Gen inp (v ': vs) n ret -> Gen inp vs n ret Source # pop :: forall inp (vs :: [Type]) (n :: Peano) ret v. Gen inp vs n ret -> Gen inp (v ': vs) n ret Source # liftI2 :: forall x y z inp (vs :: [Type]) (es :: Peano) ret. InstrPure (x -> y -> z) -> Gen inp (z ': vs) es ret -> Gen inp (y ': (x ': vs)) es ret Source # swap :: forall inp x y (vs :: [Type]) (n :: Peano) r. Gen inp (x ': (y ': vs)) n r -> Gen inp (y ': (x ': vs)) n r Source # | |
Stackable DumpInstr Source # | |
Defined in Symantic.Parser.Machine.Dump push :: forall v inp (vs :: [Type]) (n :: Peano) ret. InstrPure v -> DumpInstr inp (v ': vs) n ret -> DumpInstr inp vs n ret Source # pop :: forall inp (vs :: [Type]) (n :: Peano) ret v. DumpInstr inp vs n ret -> DumpInstr inp (v ': vs) n ret Source # liftI2 :: forall x y z inp (vs :: [Type]) (es :: Peano) ret. InstrPure (x -> y -> z) -> DumpInstr inp (z ': vs) es ret -> DumpInstr inp (y ': (x ': vs)) es ret Source # swap :: forall inp x y (vs :: [Type]) (n :: Peano) r. DumpInstr inp (x ': (y ': vs)) n r -> DumpInstr inp (y ': (x ': vs)) n r Source # |
Class Branchable
class Branchable (repr :: Type -> [Type] -> Peano -> Type -> Type) where Source #
case_ :: repr inp (x ': vs) n r -> repr inp (y ': vs) n r -> repr inp (Either x y ': vs) n r Source #
choices :: [InstrPure (v -> Bool)] -> [repr inp vs es ret] -> repr inp vs es ret -> repr inp (v ': vs) es ret Source #
Instances
Branchable Gen Source # | |
Defined in Symantic.Parser.Machine.Generate case_ :: forall inp x (vs :: [Type]) (n :: Peano) r y. Gen inp (x ': vs) n r -> Gen inp (y ': vs) n r -> Gen inp (Either x y ': vs) n r Source # choices :: forall v inp (vs :: [Type]) (es :: Peano) ret. [InstrPure (v -> Bool)] -> [Gen inp vs es ret] -> Gen inp vs es ret -> Gen inp (v ': vs) es ret Source # | |
Branchable DumpInstr Source # | |
Defined in Symantic.Parser.Machine.Dump case_ :: forall inp x (vs :: [Type]) (n :: Peano) r y. DumpInstr inp (x ': vs) n r -> DumpInstr inp (y ': vs) n r -> DumpInstr inp (Either x y ': vs) n r Source # choices :: forall v inp (vs :: [Type]) (es :: Peano) ret. [InstrPure (v -> Bool)] -> [DumpInstr inp vs es ret] -> DumpInstr inp vs es ret -> DumpInstr inp (v ': vs) es ret Source # |
Class Failable
class Failable (repr :: Type -> [Type] -> Peano -> Type -> Type) where Source #
fail :: [ErrorItem (InputToken inp)] -> repr inp vs ('Succ es) ret Source #
popFail :: repr inp vs es ret -> repr inp vs ('Succ es) ret Source #
catchFail :: repr inp vs ('Succ es) ret -> repr inp (Cursor inp ': vs) es ret -> repr inp vs es ret Source #
Instances
Failable Gen Source # | |
Defined in Symantic.Parser.Machine.Generate fail :: forall inp (vs :: [Type]) (es :: Peano) ret. [ErrorItem (InputToken inp)] -> Gen inp vs ('Succ es) ret Source # popFail :: forall inp (vs :: [Type]) (es :: Peano) ret. Gen inp vs es ret -> Gen inp vs ('Succ es) ret Source # catchFail :: forall inp (vs :: [Type]) (es :: Peano) ret. Gen inp vs ('Succ es) ret -> Gen inp (Cursor inp ': vs) es ret -> Gen inp vs es ret Source # | |
Failable DumpInstr Source # | |
Defined in Symantic.Parser.Machine.Dump fail :: forall inp (vs :: [Type]) (es :: Peano) ret. [ErrorItem (InputToken inp)] -> DumpInstr inp vs ('Succ es) ret Source # popFail :: forall inp (vs :: [Type]) (es :: Peano) ret. DumpInstr inp vs es ret -> DumpInstr inp vs ('Succ es) ret Source # catchFail :: forall inp (vs :: [Type]) (es :: Peano) ret. DumpInstr inp vs ('Succ es) ret -> DumpInstr inp (Cursor inp ': vs) es ret -> DumpInstr inp vs es ret Source # |
Class Inputable
class Inputable (repr :: Type -> [Type] -> Peano -> Type -> Type) where Source #
loadInput :: repr inp vs es r -> repr inp (Cursor inp ': vs) es r Source #
pushInput :: repr inp (Cursor inp ': vs) es ret -> repr inp vs es ret Source #
Class Routinable
class Routinable (repr :: Type -> [Type] -> Peano -> Type -> Type) where Source #
subroutine :: LetName v -> repr inp '[] ('Succ 'Zero) v -> repr inp vs ('Succ es) ret -> repr inp vs ('Succ es) ret Source #
call :: LetName v -> repr inp (v ': vs) ('Succ es) ret -> repr inp vs ('Succ es) ret Source #
Instances
Routinable Gen Source # | |
Defined in Symantic.Parser.Machine.Generate subroutine :: forall v inp (vs :: [Type]) (es :: Peano) ret. LetName v -> Gen inp '[] ('Succ 'Zero) v -> Gen inp vs ('Succ es) ret -> Gen inp vs ('Succ es) ret Source # call :: forall v inp (vs :: [Type]) (es :: Peano) ret. LetName v -> Gen inp (v ': vs) ('Succ es) ret -> Gen inp vs ('Succ es) ret Source # ret :: forall inp ret (es :: Peano). Gen inp '[ret] es ret Source # jump :: forall ret inp (es :: Peano). LetName ret -> Gen inp '[] ('Succ es) ret Source # | |
Routinable DumpInstr Source # | |
Defined in Symantic.Parser.Machine.Dump subroutine :: forall v inp (vs :: [Type]) (es :: Peano) ret. LetName v -> DumpInstr inp '[] ('Succ 'Zero) v -> DumpInstr inp vs ('Succ es) ret -> DumpInstr inp vs ('Succ es) ret Source # call :: forall v inp (vs :: [Type]) (es :: Peano) ret. LetName v -> DumpInstr inp (v ': vs) ('Succ es) ret -> DumpInstr inp vs ('Succ es) ret Source # ret :: forall inp ret (es :: Peano). DumpInstr inp '[ret] es ret Source # jump :: forall ret inp (es :: Peano). LetName ret -> DumpInstr inp '[] ('Succ es) ret Source # |
Class Joinable
class Joinable (repr :: Type -> [Type] -> Peano -> Type -> Type) where Source #
defJoin :: LetName v -> repr inp (v ': vs) es ret -> repr inp vs es ret -> repr inp vs es ret Source #
Class Readable
class Readable (repr :: Type -> [Type] -> Peano -> Type -> Type) (tok :: Type) where Source #
read :: tok ~ InputToken inp => [ErrorItem tok] -> InstrPure (tok -> Bool) -> repr inp (tok ': vs) ('Succ es) ret -> repr inp vs ('Succ es) ret Source #
Type Peano
pattern Fmap :: InstrPure (x -> y) -> Instr inp (y ': xs) es ret -> Instr inp (x ': xs) es ret Source #
(
.Fmap
f k)
Type Machine
Making the control-flow explicit.
Instances
runMachine :: forall inp v es repr. Executable repr => Readable repr (InputToken inp) => Machine inp v -> repr inp '[] ('Succ es) v Source #