summaryrefslogtreecommitdiffstats
path: root/src/output_lr0.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/output_lr0.cpp')
-rw-r--r--src/output_lr0.cpp30
1 files changed, 1 insertions, 29 deletions
diff --git a/src/output_lr0.cpp b/src/output_lr0.cpp
index 031ed43..9d4897e 100644
--- a/src/output_lr0.cpp
+++ b/src/output_lr0.cpp
@@ -93,35 +93,7 @@ void output_lr0_t::emit_state_reduce(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\tparser->stack[++parser->top].state = %u;\n", gotos[0].second);
- }
- else {
- std::fprintf(source_file, "\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\tcase %u:\n", unsigned(i));
- std::fprintf(source_file, "\t\t\t\tparser->stack[++parser->top].state = %u;\n", unsigned(it->second));
- std::fprintf(source_file, "\t\t\t\tbreak;\n");
- }
-
-
- std::fprintf(source_file, "\t\t\t}\n");
- }
+ emit_gotos(item.get_lhs());
}
void output_lr0_t::emit_state(unsigned state) {