packages feed

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