summaryrefslogtreecommitdiffstats
path: root/src/output.cpp
diff options
context:
space:
mode:
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");