summaryrefslogtreecommitdiffstats
path: root/src/output.cpp
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2015-04-09 03:31:20 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2015-04-09 03:31:20 +0200
commit59258d1f71d36502cf778dd089409146fd085c12 (patch)
treed9974750b88a979113adba40a6db4b48d750bdd4 /src/output.cpp
parent80abbf2be25e4c760fe80c9f6694047db6c7cfe4 (diff)
downloadsolar-59258d1f71d36502cf778dd089409146fd085c12.tar
solar-59258d1f71d36502cf778dd089409146fd085c12.zip
Add support for extra arguments
Diffstat (limited to 'src/output.cpp')
-rw-r--r--src/output.cpp31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/output.cpp b/src/output.cpp
index 7f074ab..33c6bb1 100644
--- a/src/output.cpp
+++ b/src/output.cpp
@@ -101,7 +101,12 @@ void output_t::emit_header() {
std::fprintf(header_file, "%scontext_t * %salloc(void *(*alloc_func)(size_t));\n", prefix(), prefix());
std::fprintf(header_file, "void %sfree(%scontext_t *parser, void (*free_func)(void *));\n\n", prefix(), prefix());
- std::fprintf(header_file, "int %spush(%scontext_t *parser, int token, const %stoken_value_t *value);\n", prefix(), prefix(), prefix());
+ std::fprintf(header_file, "int %spush(%scontext_t *parser, int token, const %stoken_value_t *value", prefix(), prefix(), prefix());
+
+ for (const auto &arg : generator->get_extra_args())
+ std::fprintf(header_file, ", %s %s", arg.first.c_str(), arg.second.c_str());
+
+ std::fprintf(header_file, ");\n");
}
void output_t::emit_reduction(unsigned rule_id) {
@@ -133,6 +138,15 @@ void output_t::emit_reduction(unsigned rule_id) {
empty = false;
}
+ for (const auto &arg : generator->get_extra_args()) {
+ if (!empty)
+ std::fprintf(source_file, ", ");
+
+ std::fprintf(source_file, "%s %s", arg.first.c_str(), arg.second.c_str());
+
+ empty = false;
+ }
+
if (empty)
std::fprintf(source_file, "void");
@@ -207,6 +221,15 @@ void output_t::emit_state_reduce(const item_t &item, int rule_id) {
empty = false;
}
+ for (const auto &arg : generator->get_extra_args()) {
+ if (!empty)
+ std::fprintf(source_file, ", ");
+
+ std::fprintf(source_file, "%s", arg.second.c_str());
+
+ empty = false;
+ }
+
std::fprintf(source_file, ");\n");
}
@@ -312,7 +335,11 @@ void output_t::emit_source() {
emit_reductions();
- std::fprintf(source_file, "int %spush(%scontext_t *parser, int token, const %stoken_value_t *value) {\n", prefix(), prefix(), prefix());
+ std::fprintf(source_file, "int %spush(%scontext_t *parser, int token, const %stoken_value_t *value", prefix(), prefix(), prefix());
+ for (const auto &arg : generator->get_extra_args())
+ std::fprintf(source_file, ", %s %s", arg.first.c_str(), arg.second.c_str());
+ std::fprintf(source_file, ") {\n");
+
std::fprintf(source_file, "\twhile (1) {\n");
std::fprintf(source_file, "\t\tswitch (parser->stack[parser->top].state) {\n");