void ParsingTable::createTables() { for(int i=0; i<nt.size(); i++) { NonTerminal *current = nt[i]; Rule *emptyRule = NULL; //For each rule in this nonterminal for(int j=0; j< current->rules.size(); j++) { Rule *currentRule = current->rules[j]; if(current->rules[j]->token.size() == 0) continue; //get first token GrammerObject *firstToken = currentRule->token[0]; //if token is a terminal that is where the rule should go if(firstToken->isTerminal()) { table[i][findTerminal(firstToken)] = currentRule; continue; } //if nonterminal must get out the first set set<Terminal*> *first = &((NonTerminal*)firstToken)->first.terminals; for(set<Terminal*>::iterator firsts = first->begin(); firsts != first->end(); firsts++) { table[i][findTerminal(*firsts)] = currentRule; } if(((NonTerminal*)firstToken)->first.hasEmptySet) { emptyRule = currentRule; } } if(emptyRule != NULL) { set<Terminal*> *follow = ¤t->follow.terminals; for(set<Terminal*>::iterator f = follow->begin(); f != follow->end(); f++) table[i][findTerminal(*f)] = emptyRule; } } }
void BasicBlock::replaceTerminal(Node* node) { NodeAndIndex result = findTerminal(); if (!result) append(node); else { m_nodes.insert(result.index + 1, node); result.node->convertToPhantom(); } ASSERT(terminal()); }
Rule *ParsingTable::parse(NonTerminal *state, Terminal *match) { return table[findNonTerminal(state)][findTerminal(match)]; }