From 7a65ee0c61b04b09f10655f03be2fc082c8d5b2b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 9 Apr 2015 04:46:39 +0200 Subject: Introduce rule_t and grammar_t --- src/output.cpp | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'src/output.cpp') diff --git a/src/output.cpp b/src/output.cpp index cc9d5f3..f15aac0 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -54,7 +54,7 @@ output_t::output_t(const generator_t *generator0, const char *header, const char if (term.get_type() == SYMBOL_TYPE_TERM) tokens.insert(std::make_pair(term.get_value(), tokens.size())); - symbol_values.insert(std::make_pair(term, "token." + generator->get_term_type(term).second)); + symbol_values.insert(std::make_pair(term, "token." + generator->get_grammar().get_term_type(term).second)); } } @@ -80,8 +80,8 @@ void output_t::emit_token_value() { std::map token_values; - for (const auto &term : generator->get_terminals()) { - const auto &type = generator->get_term_type(term); + for (const symbol_t &term : generator->get_terminals()) { + const auto &type = generator->get_grammar().get_term_type(term); if (!type.first.empty()) token_values.insert(std::make_pair(type.second, type.first)); } @@ -95,8 +95,8 @@ void output_t::emit_token_value() { void output_t::emit_header() { std::fprintf(header_file, "#pragma once\n\n"); - if (!generator->get_header_block().empty()) - std::fprintf(header_file, "%s\n", generator->get_header_block().c_str()); + if (!generator->get_grammar().header_block.empty()) + std::fprintf(header_file, "%s\n", generator->get_grammar().header_block.c_str()); emit_tokens(); emit_token_value(); @@ -108,19 +108,19 @@ void output_t::emit_header() { 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()) + for (const auto &arg : generator->get_grammar().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) { - const auto &rule = generator->get_rules()[rule_id]; + const rule_t &rule = generator->get_grammar().rules[rule_id]; std::fprintf(source_file, "static inline "); - const item_t &item = std::get<0>(rule); - const std::string &type = generator->get_nonterm_type(item.get_lhs()); + const item_t &item = rule.item; + const std::string &type = generator->get_grammar().get_nonterm_type(item.get_lhs()); if (type.empty()) std::fprintf(source_file, "void"); else @@ -129,8 +129,8 @@ void output_t::emit_reduction(unsigned rule_id) { std::fprintf(source_file, " %sreduce_%u(", prefix(), rule_id); bool empty = true; - for (unsigned i = 0; i < std::get<1>(rule).size(); i++) { - const std::string &var = std::get<1>(rule)[i]; + for (unsigned i = 0; i < rule.variables.size(); i++) { + const std::string &var = rule.variables[i]; if (var.empty()) continue; @@ -138,12 +138,12 @@ void output_t::emit_reduction(unsigned rule_id) { if (!empty) std::fprintf(source_file, ", "); - std::fprintf(source_file, "%s %s", generator->get_type(item.get_rhs()[i]).c_str(), var.c_str()); + std::fprintf(source_file, "%s %s", generator->get_grammar().get_type(item.get_rhs()[i]).c_str(), var.c_str()); empty = false; } - for (const auto &arg : generator->get_extra_args()) { + for (const auto &arg : generator->get_grammar().extra_args) { if (!empty) std::fprintf(source_file, ", "); @@ -156,16 +156,16 @@ void output_t::emit_reduction(unsigned rule_id) { std::fprintf(source_file, "void"); std::fprintf(source_file, ") {"); - std::fprintf(source_file, "%s", std::get<2>(rule).c_str()); + std::fprintf(source_file, "%s", rule.action.c_str()); std::fprintf(source_file, "}\n\n"); } void output_t::emit_reductions() { - const auto &rules = generator->get_rules(); + const auto &rules = generator->get_grammar().rules; for (size_t i = 0; i < rules.size(); i++) { - if (!std::get<2>(rules[i]).empty()) + if (!rules[i].action.empty()) emit_reduction(i); } } @@ -205,7 +205,7 @@ void output_t::emit_state_reduce(const item_t &item, int rule_id) { std::fprintf(source_file, "\t\t\tparser->top -= %u;\n", unsigned(rhs.size())); if (rule_id >= 0) { - const std::string &type = generator->get_nonterm_type(item.get_lhs()); + const std::string &type = generator->get_grammar().get_nonterm_type(item.get_lhs()); std::fprintf(source_file, "\t\t\t"); if (!type.empty()) @@ -213,7 +213,7 @@ void output_t::emit_state_reduce(const item_t &item, int rule_id) { std::fprintf(source_file, "%sreduce_%i(", prefix(), rule_id); bool empty = true; - const auto &vars = std::get<1>(generator->get_rules()[rule_id]); + const auto &vars = generator->get_grammar().rules[rule_id].variables; for (unsigned i = 0; i < vars.size(); i++) { const std::string &var = vars[i]; if (var.empty()) @@ -226,7 +226,7 @@ void output_t::emit_state_reduce(const item_t &item, int rule_id) { empty = false; } - for (const auto &arg : generator->get_extra_args()) { + for (const auto &arg : generator->get_grammar().extra_args) { if (!empty) std::fprintf(source_file, ", "); @@ -277,8 +277,8 @@ void output_t::emit_state(unsigned i) { emit_state_shift(i); } else { - const auto &rule = generator->get_rules()[it->second]; - emit_state_reduce(std::get<0>(rule), std::get<2>(rule).empty() ? -1 : it->second); + const rule_t &rule = generator->get_grammar().rules[it->second]; + emit_state_reduce(rule.item, rule.action.empty() ? -1 : it->second); } std::fprintf(source_file, "\t\t\tbreak;\n\n"); @@ -305,14 +305,14 @@ void output_t::emit_header_include() { void output_t::emit_source() { emit_header_include(); - if (!generator->get_source_block().empty()) - std::fprintf(source_file, "%s\n\n", generator->get_source_block().c_str()); + if (!generator->get_grammar().source_block.empty()) + std::fprintf(source_file, "%s\n\n", generator->get_grammar().source_block.c_str()); std::fprintf(source_file, "typedef union %ssymbol_value {\n", prefix()); std::fprintf(source_file, "\t%stoken_value_t token;\n", prefix()); for (const auto &nonterm : generator->get_nonterminals()) { - const std::string &type = generator->get_nonterm_type(nonterm); + const std::string &type = generator->get_grammar().get_nonterm_type(nonterm); if (!type.empty()) std::fprintf(source_file, "\t%s symbol_%s;\n", type.c_str(), nonterm.c_str()); @@ -344,7 +344,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()); - for (const auto &arg : generator->get_extra_args()) + for (const auto &arg : generator->get_grammar().extra_args) std::fprintf(source_file, ", %s %s", arg.first.c_str(), arg.second.c_str()); std::fprintf(source_file, ") {\n"); -- cgit v1.2.3