예제 #1
0
        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);
            }
        }