Esempio n. 1
0
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 = &current->follow.terminals;
            for(set<Terminal*>::iterator f = follow->begin(); f != follow->end(); f++)
                table[i][findTerminal(*f)] = emptyRule;
        }
    }
}
Esempio n. 2
0
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());
}
Esempio n. 3
0
Rule *ParsingTable::parse(NonTerminal *state, Terminal *match) {
    return table[findNonTerminal(state)][findTerminal(match)];
}