diff options
Diffstat (limited to 'src/output_slr.cpp')
-rw-r--r-- | src/output_slr.cpp | 30 |
1 files changed, 1 insertions, 29 deletions
diff --git a/src/output_slr.cpp b/src/output_slr.cpp index 563fd60..4a7b463 100644 --- a/src/output_slr.cpp +++ b/src/output_slr.cpp @@ -94,35 +94,7 @@ void output_slr_t::emit_state_reduce_code(const item_t &item, int rule_id) { std::fprintf(source_file, ");\n"); } - std::vector<std::pair<unsigned, unsigned>> gotos; - - for (size_t i = 0; i < generator->get_state_count(); i++) { - auto it = generator->get_gotos().find(std::make_pair(i, item.get_lhs())); - if (it == generator->get_gotos().end()) - continue; - - gotos.emplace_back(i, it->second); - } - - if (gotos.size() == 1) { - std::fprintf(source_file, "\t\t\t\tparser->stack[++parser->top].state = %u;\n", gotos[0].second); - } - else { - std::fprintf(source_file, "\t\t\t\tswitch (parser->stack[parser->top].state) {\n"); - - for (size_t i = 0; i < generator->get_state_count(); i++) { - auto it = generator->get_gotos().find(std::make_pair(i, item.get_lhs())); - if (it == generator->get_gotos().end()) - continue; - - std::fprintf(source_file, "\t\t\t\tcase %u:\n", unsigned(i)); - std::fprintf(source_file, "\t\t\t\t\tparser->stack[++parser->top].state = %u;\n", unsigned(it->second)); - std::fprintf(source_file, "\t\t\t\t\tbreak;\n\n"); - } - - - std::fprintf(source_file, "\t\t\t\t}\n"); - } + emit_gotos(item.get_lhs()); } bool output_slr_t::emit_state_reduce(unsigned state) { |