diff options
Diffstat (limited to 'src/output.cpp')
-rw-r--r-- | src/output.cpp | 31 |
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"); |