summaryrefslogtreecommitdiffstats
path: root/src/output_slr.cpp
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2015-04-10 23:22:12 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2015-04-10 23:22:12 +0200
commitc7038d65b98ff517726d8cdd7e3393275a20634f (patch)
tree14ec24890f38d064c0fc47826a700319911b203f /src/output_slr.cpp
parentc2728e4c835c6ae7db4d23ef60e5df3b9be3061a (diff)
downloadsolar-c7038d65b98ff517726d8cdd7e3393275a20634f.tar
solar-c7038d65b98ff517726d8cdd7e3393275a20634f.zip
output: also collapse goto case branches
Diffstat (limited to 'src/output_slr.cpp')
-rw-r--r--src/output_slr.cpp30
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) {