1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
#include "writer.ih"
void Writer::srTable(State const *sp, FBB::Table &table, std::ostream &out)
{
bool acceptState = sp->isAcceptState();
StateItem const *defaultReduction =
sp->reduction(sp->defaultReduction());
// A token is needed if there are terminaltransitions or multiple
// reductions (or for the accept state, set at state/define.cc)
bool tokenNeeded = sp->terminalTransitions() || sp->reductions() > 1;
int stateType = sp->type();
if (tokenNeeded)
stateType |= StateType::REQ_TOKEN;
if (defaultReduction)
stateType |= StateType::DEF_RED;
out << "\n" // Write the table header
"SR_ " << s_threadConst << "s_" << sp->idx() << "[] =\n"
"{\n";
table.clear();
// 2nd element equals the index of the last array element
table << StateType::typeName(stateType) <<
sp->transitions() + sp->reductionsLAsize() + acceptState + 1 <<
def;
// cerr << (sp->transitions() + sp->reductionsLAsize() + acceptState + 1) <<
// " = " << sp->transitions() << ' ' << sp->reductionsLAsize() << ' ' <<
// acceptState << " 1\n";
transitions(table, sp->next());
if (acceptState)
table << Rules::eofTerminal() << "ACCEPT_" << def;
reductions(table, *sp);
table << 0 <<
(defaultReduction ? -static_cast<int>(defaultReduction->nr()) : 0) <<
def;
out << table << "};\n"; // table ends in a newline
}
|