private static SimulationPath <A, char> RunSimulationWithCFGForEmptyStack(PDA <A, char> pda, A[] word, CancellationToken token) { Assertion.Assert(pda.AcceptanceCondition.IsEmptyStack(), "the pda has not empty stack as acceptance condition"); var cfg1 = PDAToCFGConverter <A, char> .ToCFG(pda, token); var cfg = CFGCleaner.RemoveUselessSymbols(cfg1, token); if (cfg == null) { throw new NoAcceptanceException(wordNotAcceptedMessage); } var cfgIn2NF = CFGTo2NFConverter <A, char> .To2NF(cfg); var cykTable = new CYKTable <A>(word, cfgIn2NF); if (!cykTable.AcceptsWord()) { throw new NoAcceptanceException(wordNotAcceptedMessage); } var startDerivationNode = cykTable.GetStartDerivationNode(); return(startDerivationNode.ConvertToPDASimulationPath(pda, cfg.StartSymbol, word)); }
private void AddCFGOfPDA(PDA <A, S> pda, string id, CancellationToken token) { var cfg = PDAToCFGConverter <A, S> .ToCFG(pda, token); var cleanedCfg = CFGCleaner.RemoveUselessSymbols(cfg, token); if (cleanedCfg == null) { noWordIsAccepted = true; } else { var cfgInCNF = GrammarUtilities.getEquivalentCNF(cleanedCfg); contextFreeGrammarsInCNF.Add(id, cfgInCNF); } }