Skip to content
Snippets Groups Projects
RandomGrammarFactory.cpp 1.77 KiB
Newer Older
/*
 * RandomGrammarFactory.cpp
 *
 *  Created on: 27. 3. 2014
 *	  Author: Tomas Pecka
 */

#include "RandomGrammarFactory.h"
#include <registration/AlgoRegistration.hpp>

namespace grammar {

namespace generate {

auto GenerateCFG1 = registration::AbstractRegister < RandomGrammarFactory, grammar::CFG < >, ext::set < DefaultSymbolType >, ext::set < DefaultSymbolType >, double > ( RandomGrammarFactory::generateCFG, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "nonterminals", "terminals", "density" );

grammar::CFG < char, char > RandomGrammarFactory::generateCFG ( size_t nonterminalsCount, size_t terminalsCount, bool randomizedAlphabet, double density ) {
	if(terminalsCount > 26)
		throw exception::CommonException("Too big terminals count.");
	ext::deque < char > terminals;
	for(int i = 0; i < 26; i++) terminals.push_back ( i + 'a' );
	if(randomizedAlphabet) shuffle ( terminals.begin ( ), terminals.end ( ), ext::random_devices::semirandom );
	terminals.resize ( terminalsCount );

	if(nonterminalsCount > 26)
		throw exception::CommonException("Too big nonterminals count.");
	ext::deque < char > nonterminals;
	for(int i = 0; i < 26; i++) nonterminals.push_back ( i + 'A' );
	if ( randomizedAlphabet ) shuffle ( nonterminals.begin ( ), nonterminals.end ( ), ext::random_devices::semirandom );
	nonterminals.resize ( nonterminalsCount);
	return RandomGrammarFactory::randomCFG ( nonterminals, terminals, density );
auto GenerateCFG2 = registration::AbstractRegister < RandomGrammarFactory, grammar::CFG < char, char >, size_t, size_t, bool, double> ( RandomGrammarFactory::generateCFG, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "nonterminalsCount", "terminalsCount", "randomizedAlphabet", "density" );

} /* namespace generate */

} /* namespace grammar */