CFGLib.GrammarGenerator.NextCNF C# (CSharp) Method

NextCNF() public method

Generates a new, random CNF grammar
public NextCNF ( int numNonterminals, int numProductions, IList terminals, bool useNull = true ) : CNFGrammar
numNonterminals int
numProductions int
terminals IList
useNull bool
return CNFGrammar
		public CNFGrammar NextCNF(int numNonterminals, int numProductions, IList<Terminal> terminals, bool useNull = true) {
			if (numNonterminals < 1) {
				throw new ArgumentOutOfRangeException("Need at least one nonterminal");
			}
			var start = RandomNonterminal(1);
			double producesEmptyWeight = 0.0;
			if (useNull) {
				if (numProductions > 0) {
					if (_rand.Next(2) == 1) {
						producesEmptyWeight = 100 * _rand.NextDouble();
						numProductions--;
					}
				}
			}
			var numNontermProductions = _rand.Next(numProductions);
			var numTermProductions = numProductions - numNontermProductions;
			var productions = new List<Production>();

			for (int i = 0; i < numNontermProductions; i++) {
				productions.Add(NextCNFNonterminalProduction(numNonterminals));
			}
			for (int i = 0; i < numTermProductions; i++) {
				var terminal = RandomTerminal(terminals);
				productions.Add(NextCNFTerminalProduction(numNonterminals, terminals, terminal));
			}

			productions.Add(new Production(start, new Sentence(), producesEmptyWeight));

			return new CNFGrammar(productions, start);
		}

Usage Example

Example #1
0
        public void RandomTesting()
        {
            var randg = new GrammarGenerator();

            int _maxNonterminals = 8;
            int _maxProductions  = 8;
            int _maxTerminals    = 20;
            int _step            = 1;

            for (int numProductions = 0; numProductions < _maxProductions; numProductions += _step)
            {
                for (int numNonterminals = 1; numNonterminals < _maxNonterminals; numNonterminals += _step)
                {
                    for (int numTerminals = 1; numTerminals < _maxTerminals; numTerminals += _step)
                    {
                        var range     = Enumerable.Range(0, numTerminals);
                        var terminals = new List <Terminal>(range.Select((x) => Terminal.Of("x" + x)));
                        Console.WriteLine("{0}, {1}, {2}", numNonterminals, numProductions, numTerminals);
                        var rg = randg.NextCNF(numNonterminals, numProductions, terminals);
                        TestGrammar(rg);
                    }
                }
            }
        }
All Usage Examples Of CFGLib.GrammarGenerator::NextCNF