Predictive_Parser::Predictive_Parser(CFG *grammar) {

	//init vars
	this->grammar = grammar;
	first = new map<string, set<string>*> ();
	follow = new map<string, set<string>*> ();
	subset_first = new map<pair<string,int>,set<string>*>();

	parse_table = new Parse_Table_Entry*[grammar->get_nonterminals()->size()];

	//size = size of terminals + 1 (input end marker)
	for (unsigned int i = 0; i < grammar->get_nonterminals()->size(); ++i)
		parse_table[i] = new Parse_Table_Entry[grammar->get_terminals()->size() + 1];


	//calculate first
	set<string>* nonterminals = grammar->get_nonterminals();
	for (set<string>::iterator it = nonterminals->begin(); it
			!= nonterminals->end(); ++it) {
		calc_first(*it);
	}

	//calculate follow
	calc_follow();

	//generate parsing table
	generate_table();
}
Exemple #2
0
void LL_construct()
{
	try
	{
		prepare_nonterminals();
		calc_first();
		print_first();
		calc_follow();
		print_follow();
		parse_table_generate();
		print_parse_table();
	}
	catch (ConstructException &e)
	{
		puts(e.message);
		puts("Syntax analyzer construct failed.");
	}
}