packages feed

ptera-0.1.0.0: src/Language/Parser/Ptera/Runner/Parser.hs

module Language.Parser.Ptera.Runner.Parser (
    T,

    StartNum,
    StateNum,
    TokenNum,
    VarNum,
    AltNum,
    AltKind (..),

    RunnerParser (..),
    Syntax.GrammarToken (..),
    ActionM (..),
    ReduceArgument (..),
    Syntax.ActionTask (..),
    Syntax.getAction,
    Syntax.modifyAction,
    Syntax.failAction,
    Trans (..),
    TransOp (..),

    eosToken,
) where

import           Language.Parser.Ptera.Prelude

import           Language.Parser.Ptera.Machine.PEG (AltKind (..))
import qualified Language.Parser.Ptera.Syntax      as Syntax

type StartNum = Int
type StateNum = Int
type TokenNum = Int
type VarNum = Int
type AltNum = Int

type T = RunnerParser

newtype ActionM ctx = ActionM
    { runActionM :: [ReduceArgument] -> Syntax.ActionTask ctx ReduceArgument
    }

data ReduceArgument where
    ReduceArgument :: a -> ReduceArgument

data RunnerParser ctx elem altHelp = RunnerParser
    { parserInitial     :: StartNum -> Maybe StateNum
    , parserGetTokenNum :: elem -> TokenNum
    , parserTrans       :: StateNum -> TokenNum -> Trans
    , parserAltKind     :: AltNum -> AltKind
    , parserStateHelp   :: StateNum -> [(AltNum, Int)]
    , parserAltHelp     :: AltNum -> (StringLit, Maybe altHelp)
    , parserAction      :: AltNum -> ActionM ctx
    }

data Trans = Trans
    { transState :: StateNum
    , transOps   :: [TransOp]
    }
    deriving (Eq, Show)

data TransOp
    = TransOpEnter VarNum Bool StateNum
    | TransOpPushBackpoint StateNum
    | TransOpHandleNot AltNum
    | TransOpShift
    | TransOpReduce AltNum
    deriving (Eq, Show)

eosToken :: TokenNum
eosToken = -1