diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-04-09 03:31:20 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-04-09 03:31:20 +0200 |
commit | 59258d1f71d36502cf778dd089409146fd085c12 (patch) | |
tree | d9974750b88a979113adba40a6db4b48d750bdd4 /src/output.cpp | |
parent | 80abbf2be25e4c760fe80c9f6694047db6c7cfe4 (diff) | |
download | solar-59258d1f71d36502cf778dd089409146fd085c12.tar solar-59258d1f71d36502cf778dd089409146fd085c12.zip |
Add support for extra arguments
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"); |