From 1a79d217af4b7403b6567c269bf115bb1fad9495 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 11 Apr 2015 03:18:22 +0200 Subject: Allow skipping the destructor selectively --- src/output.cpp | 6 +- src/output_lr0.cpp | 8 +- src/output_slr.cpp | 8 +- src/parse.cpp | 276 ++++++++++++++++++++++++++++++----------------------- src/parse.y | 45 +++++---- src/rule.hpp | 2 +- 6 files changed, 201 insertions(+), 144 deletions(-) diff --git a/src/output.cpp b/src/output.cpp index fee9267..6a54f71 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -173,15 +173,15 @@ void output_t::emit_reduction(unsigned rule_id) { bool empty = true; for (unsigned i = 0; i < rule.variables.size(); i++) { - const std::string &var = rule.variables[i]; + const auto &var = rule.variables[i]; - if (var.empty()) + if (var.first.empty()) continue; if (!empty) std::fprintf(source_file, ", "); - std::fprintf(source_file, "%s %s", get_generator()->get_grammar().get_type(item.get_rhs()[i]).c_str(), var.c_str()); + std::fprintf(source_file, "%s %s", get_generator()->get_grammar().get_type(item.get_rhs()[i]).c_str(), var.first.c_str()); empty = false; } diff --git a/src/output_lr0.cpp b/src/output_lr0.cpp index 5d0c882..b492744 100644 --- a/src/output_lr0.cpp +++ b/src/output_lr0.cpp @@ -69,8 +69,7 @@ void output_lr0_t::emit_state_reduce(const item_t &item, int rule_id) { bool empty = true; 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()) + if (vars[i].first.empty()) continue; if (!empty) @@ -91,7 +90,10 @@ void output_lr0_t::emit_state_reduce(const item_t &item, int rule_id) { std::fprintf(source_file, ");\n"); - for (unsigned i = 0; i < rhs.size(); i++) { + for (unsigned i = 0; i < vars.size(); i++) { + if (!vars[i].second) + continue; + auto it = generator->get_grammar().destructors.find(rhs[i]); if (it == generator->get_grammar().destructors.end()) continue; diff --git a/src/output_slr.cpp b/src/output_slr.cpp index d2b9817..3c9e1c2 100644 --- a/src/output_slr.cpp +++ b/src/output_slr.cpp @@ -66,8 +66,7 @@ void output_slr_t::emit_state_reduce_code(const item_t &item, int rule_id) { bool empty = true; 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()) + if (vars[i].first.empty()) continue; if (!empty) @@ -88,7 +87,10 @@ void output_slr_t::emit_state_reduce_code(const item_t &item, int rule_id) { std::fprintf(source_file, ");\n"); - for (unsigned i = 0; i < rhs.size(); i++) { + for (unsigned i = 0; i < vars.size(); i++) { + if (!vars[i].second) + continue; + auto it = generator->get_grammar().destructors.find(rhs[i]); if (it == generator->get_grammar().destructors.end()) continue; diff --git a/src/parse.cpp b/src/parse.cpp index 4f2aece..0c2a7c4 100644 --- a/src/parse.cpp +++ b/src/parse.cpp @@ -1,7 +1,8 @@ #include "parse.hpp" -typedef std::pair, std::vector> rhs_t; +typedef std::vector> vars_t; +typedef std::pair, vars_t> rhs_t; static inline void free_string(std::string *v) { @@ -16,6 +17,10 @@ static inline void free_rule(solar::rule_t *v) { delete v; } +static inline void free_rhs(rhs_t *v) { + delete v; +} + typedef union parse_symbol_value { parse_token_value_t token; @@ -77,21 +82,17 @@ static inline void parse_reduce_9(solar::rule_t * rule, __attribute__((unused)) if (grammar->rules.empty()) { solar::item_t init(""); init.get_rhs().push_back(solar::symbol_t::make_nonterm(rule->item.get_lhs().c_str())); - grammar->rules.emplace_back(solar::rule_t {std::move(init), std::vector(), std::string()}); + grammar->rules.emplace_back(solar::rule_t {std::move(init), vars_t(), std::string()}); } grammar->rules.push_back(*rule); } -static inline solar::rule_t * parse_reduce_10(std::string * lhs, rhs_t * rhs, std::string * action, __attribute__((unused)) solar::grammar_t * grammar) { - auto *ret = new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action}; - delete rhs; - return ret; -} +static inline solar::rule_t * parse_reduce_10(std::string * lhs, rhs_t * rhs, std::string * action, __attribute__((unused)) solar::grammar_t * grammar) {return + new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action} +;} -static inline rhs_t * parse_reduce_11(__attribute__((unused)) solar::grammar_t * grammar) { - return new rhs_t(); -} +static inline rhs_t * parse_reduce_11(__attribute__((unused)) solar::grammar_t * grammar) {return new rhs_t();} static inline rhs_t * parse_reduce_12(rhs_t * rhs, solar::symbol_t * sym, __attribute__((unused)) solar::grammar_t * grammar) { rhs->first.push_back(*sym); @@ -102,12 +103,19 @@ static inline rhs_t * parse_reduce_12(rhs_t * rhs, solar::symbol_t * sym, __attr static inline rhs_t * parse_reduce_13(rhs_t * rhs, solar::symbol_t * sym, std::string * var, __attribute__((unused)) solar::grammar_t * grammar) { rhs->first.push_back(*sym); - rhs->second.push_back(*var); + rhs->second.emplace_back(*var, true); + + return rhs; +} + +static inline rhs_t * parse_reduce_14(rhs_t * rhs, solar::symbol_t * sym, std::string * var, __attribute__((unused)) solar::grammar_t * grammar) { + rhs->first.push_back(*sym); + rhs->second.emplace_back(*var, false); return rhs; } -static inline rhs_t * parse_reduce_14(rhs_t * rhs, std::string * str, __attribute__((unused)) solar::grammar_t * grammar) { +static inline rhs_t * parse_reduce_15(rhs_t * rhs, std::string * str, __attribute__((unused)) solar::grammar_t * grammar) { for (char c : *str) { rhs->first.push_back(solar::symbol_t::make_char(c)); rhs->second.emplace_back(); @@ -116,45 +124,25 @@ static inline rhs_t * parse_reduce_14(rhs_t * rhs, std::string * str, __attribut return rhs; } -static inline std::string * parse_reduce_15(__attribute__((unused)) solar::grammar_t * grammar) { - return new std::string; -} +static inline std::string * parse_reduce_16(__attribute__((unused)) solar::grammar_t * grammar) {return new std::string;} -static inline std::string * parse_reduce_16(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) { - return new std::string(*v); -} +static inline std::string * parse_reduce_17(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return v;} -static inline std::string * parse_reduce_17(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) { - return new std::string("\n\treturn " + *v + ";\n"); -} +static inline std::string * parse_reduce_18(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return new std::string("return " + *v + ";");} -static inline solar::symbol_t * parse_reduce_18(solar::symbol_t * v, __attribute__((unused)) solar::grammar_t * grammar) { - return new solar::symbol_t(*v); -} +static inline solar::symbol_t * parse_reduce_19(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return new solar::symbol_t(solar::symbol_t::make_nonterm(*v));} -static inline solar::symbol_t * parse_reduce_19(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) { - return new solar::symbol_t(solar::symbol_t::make_nonterm(*v)); -} +static inline solar::symbol_t * parse_reduce_20(solar::symbol_t * v, __attribute__((unused)) solar::grammar_t * grammar) {return v;} -static inline solar::symbol_t * parse_reduce_20(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) { - return new solar::symbol_t(solar::symbol_t::make_term(*v)); -} +static inline solar::symbol_t * parse_reduce_21(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return new solar::symbol_t(solar::symbol_t::make_term(*v));} -static inline solar::symbol_t * parse_reduce_21(char v, __attribute__((unused)) solar::grammar_t * grammar) { - return new solar::symbol_t(solar::symbol_t::make_char(v)); -} +static inline solar::symbol_t * parse_reduce_22(char v, __attribute__((unused)) solar::grammar_t * grammar) {return new solar::symbol_t(solar::symbol_t::make_char(v));} -static inline std::string * parse_reduce_22(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) { - return new std::string(*v); -} +static inline std::string * parse_reduce_23(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return v;} -static inline std::string * parse_reduce_23(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) { - return new std::string(*v); -} +static inline std::string * parse_reduce_24(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return v;} -static inline std::string * parse_reduce_24(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) { - return new std::string(*v); -} +static inline std::string * parse_reduce_25(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return v;} static int parse_do_push(parse_context_t *parser, int token, __attribute__((unused)) solar::grammar_t * grammar) { parse_symbol_value_t result; @@ -468,6 +456,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus parser->top -= 5; result.symbol_rule = parse_reduce_10(parser->stack[parser->top + 0].value.token.str, parser->stack[parser->top + 3].value.symbol_rhs, parser->stack[parser->top + 4].value.symbol_action, grammar); free_string(parser->stack[parser->top + 0].value.token.str); + free_rhs(parser->stack[parser->top + 3].value.symbol_rhs); free_string(parser->stack[parser->top + 4].value.symbol_action); parser->stack[parser->top].value.symbol_rule = result.symbol_rule; parser->stack[++parser->top].state = 3; @@ -493,16 +482,15 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus switch (token) { default: parser->top -= 1; - result.symbol_symbol = parse_reduce_18(parser->stack[parser->top + 0].value.symbol_term, grammar); - free_symbol(parser->stack[parser->top + 0].value.symbol_term); + result.symbol_symbol = parse_reduce_20(parser->stack[parser->top + 0].value.symbol_term, grammar); parser->stack[parser->top].value.symbol_symbol = result.symbol_symbol; switch (parser->stack[parser->top].state) { case 18: parser->stack[++parser->top].state = 25; break; - case 66: - parser->stack[++parser->top].state = 68; + case 69: + parser->stack[++parser->top].state = 71; break; } @@ -513,8 +501,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus switch (token) { default: parser->top -= 1; - result.symbol_action = parse_reduce_16(parser->stack[parser->top + 0].value.token.str, grammar); - free_string(parser->stack[parser->top + 0].value.token.str); + result.symbol_action = parse_reduce_17(parser->stack[parser->top + 0].value.token.str, grammar); parser->stack[parser->top].value.symbol_action = result.symbol_action; parser->stack[++parser->top].state = 24; } @@ -524,11 +511,11 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus switch (token) { default: parser->top -= 1; - result.symbol_term = parse_reduce_21(parser->stack[parser->top + 0].value.token.c, grammar); + result.symbol_term = parse_reduce_22(parser->stack[parser->top + 0].value.token.c, grammar); parser->stack[parser->top].value.symbol_term = result.symbol_term; switch (parser->stack[parser->top].state) { case 18: - case 66: + case 69: parser->stack[++parser->top].state = 26; break; @@ -544,7 +531,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus switch (token) { default: parser->top -= 1; - result.symbol_action = parse_reduce_17(parser->stack[parser->top + 0].value.token.str, grammar); + result.symbol_action = parse_reduce_18(parser->stack[parser->top + 0].value.token.str, grammar); free_string(parser->stack[parser->top + 0].value.token.str); parser->stack[parser->top].value.symbol_action = result.symbol_action; parser->stack[++parser->top].state = 24; @@ -555,7 +542,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus switch (token) { default: parser->top -= 2; - result.symbol_rhs = parse_reduce_14(parser->stack[parser->top + 0].value.symbol_rhs, parser->stack[parser->top + 1].value.token.str, grammar); + result.symbol_rhs = parse_reduce_15(parser->stack[parser->top + 0].value.symbol_rhs, parser->stack[parser->top + 1].value.token.str, grammar); free_string(parser->stack[parser->top + 1].value.token.str); parser->stack[parser->top].value.symbol_rhs = result.symbol_rhs; parser->stack[++parser->top].state = 18; @@ -574,8 +561,8 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus parser->stack[++parser->top].state = 25; break; - case 66: - parser->stack[++parser->top].state = 68; + case 69: + parser->stack[++parser->top].state = 71; break; } @@ -586,12 +573,12 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus switch (token) { default: parser->top -= 1; - result.symbol_term = parse_reduce_20(parser->stack[parser->top + 0].value.token.str, grammar); + result.symbol_term = parse_reduce_21(parser->stack[parser->top + 0].value.token.str, grammar); free_string(parser->stack[parser->top + 0].value.token.str); parser->stack[parser->top].value.symbol_term = result.symbol_term; switch (parser->stack[parser->top].state) { case 18: - case 66: + case 69: parser->stack[++parser->top].state = 26; break; @@ -607,7 +594,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus switch (token) { default: parser->top -= 1; - result.symbol_action = parse_reduce_15(grammar); + result.symbol_action = parse_reduce_16(grammar); parser->stack[parser->top].value.symbol_action = result.symbol_action; parser->stack[++parser->top].state = 24; } @@ -690,6 +677,10 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus parser->stack[++parser->top].state = 49; return 1; + case '=': + parser->stack[++parser->top].state = 50; + return 1; + default: return -1; } @@ -698,7 +689,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 40: switch (token) { case 'u': - parser->stack[++parser->top].state = 50; + parser->stack[++parser->top].state = 51; return 1; default: @@ -709,7 +700,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 41: switch (token) { case '_': - parser->stack[++parser->top].state = 51; + parser->stack[++parser->top].state = 52; return 1; default: @@ -720,7 +711,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 42: switch (token) { case 'r': - parser->stack[++parser->top].state = 52; + parser->stack[++parser->top].state = 53; return 1; default: @@ -731,7 +722,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 43: switch (token) { case 'e': - parser->stack[++parser->top].state = 53; + parser->stack[++parser->top].state = 54; return 1; default: @@ -742,7 +733,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 44: switch (token) { case TOK_BLOCK: - parser->stack[++parser->top].state = 54; + parser->stack[++parser->top].state = 55; return 1; default: @@ -753,7 +744,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 45: switch (token) { case TOK_BLOCK: - parser->stack[++parser->top].state = 55; + parser->stack[++parser->top].state = 56; return 1; default: @@ -764,7 +755,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 46: switch (token) { case ')': - parser->stack[++parser->top].state = 56; + parser->stack[++parser->top].state = 57; return 1; default: @@ -776,24 +767,27 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus switch (token) { default: parser->top -= 1; - result.symbol_varname = parse_reduce_24(parser->stack[parser->top + 0].value.token.str, grammar); - free_string(parser->stack[parser->top + 0].value.token.str); + result.symbol_varname = parse_reduce_25(parser->stack[parser->top + 0].value.token.str, grammar); parser->stack[parser->top].value.symbol_varname = result.symbol_varname; switch (parser->stack[parser->top].state) { case 39: parser->stack[++parser->top].state = 46; break; - case 54: - parser->stack[++parser->top].state = 61; + case 50: + parser->stack[++parser->top].state = 58; + break; + + case 55: + parser->stack[++parser->top].state = 63; break; - case 67: - parser->stack[++parser->top].state = 69; + case 70: + parser->stack[++parser->top].state = 72; break; - case 68: - parser->stack[++parser->top].state = 70; + case 71: + parser->stack[++parser->top].state = 73; break; } @@ -804,24 +798,27 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus switch (token) { default: parser->top -= 1; - result.symbol_varname = parse_reduce_22(parser->stack[parser->top + 0].value.token.str, grammar); - free_string(parser->stack[parser->top + 0].value.token.str); + result.symbol_varname = parse_reduce_23(parser->stack[parser->top + 0].value.token.str, grammar); parser->stack[parser->top].value.symbol_varname = result.symbol_varname; switch (parser->stack[parser->top].state) { case 39: parser->stack[++parser->top].state = 46; break; - case 54: - parser->stack[++parser->top].state = 61; + case 50: + parser->stack[++parser->top].state = 58; + break; + + case 55: + parser->stack[++parser->top].state = 63; break; - case 67: - parser->stack[++parser->top].state = 69; + case 70: + parser->stack[++parser->top].state = 72; break; - case 68: - parser->stack[++parser->top].state = 70; + case 71: + parser->stack[++parser->top].state = 73; break; } @@ -832,24 +829,27 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus switch (token) { default: parser->top -= 1; - result.symbol_varname = parse_reduce_23(parser->stack[parser->top + 0].value.token.str, grammar); - free_string(parser->stack[parser->top + 0].value.token.str); + result.symbol_varname = parse_reduce_24(parser->stack[parser->top + 0].value.token.str, grammar); parser->stack[parser->top].value.symbol_varname = result.symbol_varname; switch (parser->stack[parser->top].state) { case 39: parser->stack[++parser->top].state = 46; break; - case 54: - parser->stack[++parser->top].state = 61; + case 50: + parser->stack[++parser->top].state = 58; + break; + + case 55: + parser->stack[++parser->top].state = 63; break; - case 67: - parser->stack[++parser->top].state = 69; + case 70: + parser->stack[++parser->top].state = 72; break; - case 68: - parser->stack[++parser->top].state = 70; + case 71: + parser->stack[++parser->top].state = 73; break; } @@ -858,8 +858,16 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 50: switch (token) { - case 'c': - parser->stack[++parser->top].state = 57; + case TOK_SYMBOL: + parser->stack[++parser->top].state = 47; + return 1; + + case TOK_SYMBOL_LC: + parser->stack[++parser->top].state = 48; + return 1; + + case TOK_SYMBOL_UC: + parser->stack[++parser->top].state = 49; return 1; default: @@ -869,8 +877,8 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 51: switch (token) { - case 'a': - parser->stack[++parser->top].state = 58; + case 'c': + parser->stack[++parser->top].state = 59; return 1; default: @@ -880,8 +888,8 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 52: switch (token) { - case TOK_BLOCK: - parser->stack[++parser->top].state = 59; + case 'a': + parser->stack[++parser->top].state = 60; return 1; default: @@ -892,7 +900,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus case 53: switch (token) { case TOK_BLOCK: - parser->stack[++parser->top].state = 60; + parser->stack[++parser->top].state = 61; return 1; default: @@ -901,6 +909,17 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus break; case 54: + switch (token) { + case TOK_BLOCK: + parser->stack[++parser->top].state = 62; + return 1; + + default: + return -1; + } + break; + + case 55: switch (token) { case TOK_SYMBOL: parser->stack[++parser->top].state = 47; @@ -919,7 +938,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 55: + case 56: switch (token) { default: parser->top -= 7; @@ -930,7 +949,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 56: + case 57: switch (token) { default: parser->top -= 5; @@ -942,10 +961,21 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 57: + case 58: + switch (token) { + case ')': + parser->stack[++parser->top].state = 64; + return 1; + + default: + return -1; + } + break; + + case 59: switch (token) { case 't': - parser->stack[++parser->top].state = 62; + parser->stack[++parser->top].state = 65; return 1; default: @@ -953,10 +983,10 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 58: + case 60: switch (token) { case 'r': - parser->stack[++parser->top].state = 63; + parser->stack[++parser->top].state = 66; return 1; default: @@ -964,7 +994,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 59: + case 61: switch (token) { default: parser->top -= 8; @@ -974,7 +1004,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 60: + case 62: switch (token) { default: parser->top -= 8; @@ -984,7 +1014,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 61: + case 63: switch (token) { default: parser->top -= 8; @@ -996,10 +1026,22 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 62: + case 64: + switch (token) { + default: + parser->top -= 6; + result.symbol_rhs = parse_reduce_14(parser->stack[parser->top + 0].value.symbol_rhs, parser->stack[parser->top + 1].value.symbol_symbol, parser->stack[parser->top + 4].value.symbol_varname, grammar); + free_symbol(parser->stack[parser->top + 1].value.symbol_symbol); + free_string(parser->stack[parser->top + 4].value.symbol_varname); + parser->stack[parser->top].value.symbol_rhs = result.symbol_rhs; + parser->stack[++parser->top].state = 18; + } + break; + + case 65: switch (token) { case 'o': - parser->stack[++parser->top].state = 64; + parser->stack[++parser->top].state = 67; return 1; default: @@ -1007,10 +1049,10 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 63: + case 66: switch (token) { case 'g': - parser->stack[++parser->top].state = 65; + parser->stack[++parser->top].state = 68; return 1; default: @@ -1018,10 +1060,10 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 64: + case 67: switch (token) { case 'r': - parser->stack[++parser->top].state = 66; + parser->stack[++parser->top].state = 69; return 1; default: @@ -1029,10 +1071,10 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 65: + case 68: switch (token) { case TOK_BLOCK: - parser->stack[++parser->top].state = 67; + parser->stack[++parser->top].state = 70; return 1; default: @@ -1040,7 +1082,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 66: + case 69: switch (token) { case TOK_CHAR: parser->stack[++parser->top].state = 28; @@ -1059,7 +1101,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 67: + case 70: switch (token) { case TOK_SYMBOL: parser->stack[++parser->top].state = 47; @@ -1078,7 +1120,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 68: + case 71: switch (token) { case TOK_SYMBOL: parser->stack[++parser->top].state = 47; @@ -1097,7 +1139,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 69: + case 72: switch (token) { default: parser->top -= 12; @@ -1108,7 +1150,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 70: + case 73: switch (token) { default: parser->top -= 13; diff --git a/src/parse.y b/src/parse.y index 274e374..419e255 100644 --- a/src/parse.y +++ b/src/parse.y @@ -3,7 +3,8 @@ } %source { -typedef std::pair, std::vector> rhs_t; +typedef std::vector> vars_t; +typedef std::pair, vars_t> rhs_t; static inline void free_string(std::string *v) { @@ -17,6 +18,10 @@ static inline void free_symbol(solar::symbol_t *v) { static inline void free_rule(solar::rule_t *v) { delete v; } + +static inline void free_rhs(rhs_t *v) { + delete v; +} } @@ -45,6 +50,7 @@ static inline void free_rule(solar::rule_t *v) { %destructor rule free_rule %type rhs {rhs_t *} +%destructor rhs free_rhs %type action {std::string *} %destructor action free_string @@ -94,37 +100,42 @@ directive |= rule(rule) { if (grammar->rules.empty()) { solar::item_t init(""); init.get_rhs().push_back(solar::symbol_t::make_nonterm(rule->item.get_lhs().c_str())); - grammar->rules.emplace_back(solar::rule_t {std::move(init), std::vector(), std::string()}); + grammar->rules.emplace_back(solar::rule_t {std::move(init), vars_t(), std::string()}); } grammar->rules.push_back(*rule); } -rule |= SYMBOL_LC(lhs) "|=" rhs(rhs) action(action) { - auto *ret = new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action}; - delete rhs; - return ret; -} +rule |= SYMBOL_LC(lhs) "|=" rhs(rhs) action(action) [ + new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action} +] rhs |= [new rhs_t()] -rhs |= rhs(rhs) symbol(sym) { +rhs |= rhs(=rhs) symbol(sym) { rhs->first.push_back(*sym); rhs->second.emplace_back(); return rhs; } -rhs |= rhs(rhs) symbol(sym) '(' varname(var) ')' { +rhs |= rhs(=rhs) symbol(sym) '(' varname(var) ')' { + rhs->first.push_back(*sym); + rhs->second.emplace_back(*var, true); + + return rhs; +} + +rhs |= rhs(=rhs) symbol(sym) '(' '=' varname(var) ')' { rhs->first.push_back(*sym); - rhs->second.push_back(*var); + rhs->second.emplace_back(*var, false); return rhs; } -rhs |= rhs(rhs) STRING(str) { +rhs |= rhs(=rhs) STRING(str) { for (char c : *str) { rhs->first.push_back(solar::symbol_t::make_char(c)); rhs->second.emplace_back(); @@ -135,16 +146,16 @@ rhs |= rhs(rhs) STRING(str) { action |= ';' [new std::string] -action |= BLOCK(v) [new std::string(*v)] -action |= SQBLOCK(v) [new std::string("\n\treturn " + *v + ";\n")] +action |= BLOCK(=v) [v] +action |= SQBLOCK(v) [new std::string("return " + *v + ";")] -symbol |= term(v) [new solar::symbol_t(*v)] symbol |= SYMBOL_LC(v) [new solar::symbol_t(solar::symbol_t::make_nonterm(*v))] +symbol |= term(=v) [v] term |= SYMBOL_UC(v) [new solar::symbol_t(solar::symbol_t::make_term(*v))] term |= CHAR(v) [new solar::symbol_t(solar::symbol_t::make_char(v))] -varname |= SYMBOL_LC(v) [new std::string(*v)] -varname |= SYMBOL_UC(v) [new std::string(*v)] -varname |= SYMBOL(v)[new std::string(*v)] +varname |= SYMBOL_LC(=v) [v] +varname |= SYMBOL_UC(=v) [v] +varname |= SYMBOL(=v)[v] diff --git a/src/rule.hpp b/src/rule.hpp index 5b85ced..2779dba 100644 --- a/src/rule.hpp +++ b/src/rule.hpp @@ -33,7 +33,7 @@ namespace solar { struct rule_t { item_t item; - std::vector variables; + std::vector> variables; std::string action; }; -- cgit v1.2.3