diff options
Diffstat (limited to 'src/output.cpp')
-rw-r--r-- | src/output.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/output.cpp b/src/output.cpp index cfefbbb..1503c38 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -302,7 +302,7 @@ void output_t::emit_source() { emit_reductions(); - std::fprintf(source_file, "int %spush(%scontext_t *parser, int token, const %stoken_value_t *value", prefix(), prefix(), prefix()); + std::fprintf(source_file, "static int %sdo_push(%scontext_t *parser, int token", prefix(), prefix()); for (const auto &arg : get_generator()->get_grammar().extra_args) std::fprintf(source_file, ", %s %s", arg.first.c_str(), arg.second.c_str()); std::fprintf(source_file, ") {\n"); @@ -314,6 +314,23 @@ void output_t::emit_source() { std::fprintf(source_file, "\t\t}\n"); std::fprintf(source_file, "\t}\n"); + std::fprintf(source_file, "}\n\n"); + + std::fprintf(source_file, "int %spush(%scontext_t *parser, int token, const %stoken_value_t *value", prefix(), prefix(), prefix()); + for (const auto &arg : get_generator()->get_grammar().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, "\tint ret = %sdo_push(parser, token", prefix()); + for (const auto &arg : get_generator()->get_grammar().extra_args) + std::fprintf(source_file, ", %s", arg.second.c_str()); + std::fprintf(source_file, ");\n\n"); + + std::fprintf(source_file, "\tif (ret > 0)\n"); + std::fprintf(source_file, "\t\tparser->stack[parser->top-1].value.token = *value;\n\n"); + + std::fprintf(source_file, "\treturn ret;\n"); + std::fprintf(source_file, "}\n"); } |