ptera-core-0.1.0.0: src/Language/Parser/Ptera/Machine/PEG.hs
module Language.Parser.Ptera.Machine.PEG where
import Language.Parser.Ptera.Prelude
import qualified Data.EnumMap.Strict as EnumMap
import qualified Language.Parser.Ptera.Data.Alignable as Alignable
import qualified Language.Parser.Ptera.Data.Alignable.Array as AlignableArray
type T = PEG
data PEG start varDoc altDoc a = PEG
{ vars :: AlignableArray.T VarNum (Var varDoc)
, rules :: AlignableArray.T VarNum Rule
, alts :: AlignableArray.T AltNum (Alt altDoc a)
, initials :: EnumMap.EnumMap start VarNum
}
deriving (Eq, Show, Functor)
newtype VarNum = VarNum Int
deriving (Eq, Show)
deriving Hashable via Int
deriving Alignable.T via Alignable.Inst
newtype AltNum = AltNum Int
deriving (Eq, Show)
deriving Hashable via Int
deriving Alignable.T via Alignable.Inst
newtype Rule = Rule
{ ruleAlts :: [AltNum]
}
deriving (Eq, Show)
newtype Var varDoc = Var
{ varHelp :: varDoc
}
deriving (Eq, Show, Functor)
data Alt altDoc a = Alt
{ altKind :: AltKind
, altUnitSeq :: [Unit]
, altAction :: a
, altHelp :: altDoc
}
deriving (Eq, Show, Functor)
data AltKind
= AltSeq
| AltNot
| AltAnd
deriving (Eq, Show)
data Unit
= UnitTerminal Terminal
| UnitNonTerminal VarNum
deriving (Eq, Show)
type Terminal = Int