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(); }
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."); } }