ptera-0.1.0.0: src/Language/Parser/Ptera/Pipeline/SafeGrammar2SRB.hs
module Language.Parser.Ptera.Pipeline.SafeGrammar2SRB where
import Language.Parser.Ptera.Prelude
import qualified Language.Parser.Ptera.Data.Alignable.Array as AlignableArray
import qualified Language.Parser.Ptera.Data.Alignable.Set as AlignableSet
import qualified Language.Parser.Ptera.Machine.PEG as PEG
import qualified Language.Parser.Ptera.Machine.SRB as SRB
import qualified Language.Parser.Ptera.Pipeline.Grammar2PEG as Grammar2PEG
import qualified Language.Parser.Ptera.Pipeline.LAPEG2SRB as LAPEG2SRB
import qualified Language.Parser.Ptera.Pipeline.PEG2LAPEG as PEG2LAPEG
import qualified Language.Parser.Ptera.Syntax.Grammar as Grammar
import qualified Language.Parser.Ptera.Syntax.SafeGrammar as SafeGrammar
safeGrammar2Srb :: SafeGrammar.T action rules tokens elem initials
-> Either [StringLit] (SRB.T Int StringLit (Maybe ()) (Grammar.Action action))
safeGrammar2Srb (SafeGrammar.UnsafeGrammar g) = do
let peg = Grammar2PEG.grammar2Peg g
laPeg <- case runExcept do PEG2LAPEG.peg2LaPeg peg of
Right x -> Right x
Left vns -> do
let vs = PEG.vars peg
Left
[ PEG.varHelp do AlignableArray.forceIndex vs vn
| vn <- AlignableSet.toList vns
]
pure do LAPEG2SRB.laPeg2Srb laPeg