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, std::string * str, __attribute__((unused)) solar::grammar_t * grammar) { +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_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 67: - parser->stack[++parser->top].state = 69; + case 55: + parser->stack[++parser->top].state = 63; break; - case 68: - parser->stack[++parser->top].state = 70; + case 70: + parser->stack[++parser->top].state = 72; + break; + + 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 67: - parser->stack[++parser->top].state = 69; + case 55: + parser->stack[++parser->top].state = 63; break; - case 68: - parser->stack[++parser->top].state = 70; + case 70: + parser->stack[++parser->top].state = 72; + break; + + 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 67: - parser->stack[++parser->top].state = 69; + case 55: + parser->stack[++parser->top].state = 63; break; - case 68: - parser->stack[++parser->top].state = 70; + case 70: + parser->stack[++parser->top].state = 72; + break; + + case 71: + parser->stack[++parser->top].state = 73; break; } @@ -857,50 +857,6 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus break; case 50: - switch (token) { - case 'c': - parser->stack[++parser->top].state = 57; - return 1; - - default: - return -1; - } - break; - - case 51: - switch (token) { - case 'a': - parser->stack[++parser->top].state = 58; - return 1; - - default: - return -1; - } - break; - - case 52: - switch (token) { - case TOK_BLOCK: - parser->stack[++parser->top].state = 59; - return 1; - - default: - return -1; - } - break; - - case 53: - switch (token) { - case TOK_BLOCK: - parser->stack[++parser->top].state = 60; - return 1; - - default: - return -1; - } - break; - - case 54: switch (token) { case TOK_SYMBOL: parser->stack[++parser->top].state = 47; @@ -919,7 +875,70 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; + case 51: + switch (token) { + case 'c': + parser->stack[++parser->top].state = 59; + return 1; + + default: + return -1; + } + break; + + case 52: + switch (token) { + case 'a': + parser->stack[++parser->top].state = 60; + return 1; + + default: + return -1; + } + break; + + case 53: + switch (token) { + case TOK_BLOCK: + parser->stack[++parser->top].state = 61; + return 1; + + default: + return -1; + } + 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; + 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: + return -1; + } + break; + + 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,21 +961,10 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 57: - switch (token) { - case 't': - parser->stack[++parser->top].state = 62; - return 1; - - default: - return -1; - } - break; - case 58: switch (token) { - case 'r': - parser->stack[++parser->top].state = 63; + case ')': + parser->stack[++parser->top].state = 64; return 1; default: @@ -965,6 +973,28 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus break; case 59: + switch (token) { + case 't': + parser->stack[++parser->top].state = 65; + return 1; + + default: + return -1; + } + break; + + case 60: + switch (token) { + case 'r': + parser->stack[++parser->top].state = 66; + return 1; + + default: + return -1; + } + break; + + 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,42 +1026,21 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus } break; - case 62: - switch (token) { - case 'o': - parser->stack[++parser->top].state = 64; - return 1; - - default: - return -1; - } - break; - - case 63: - switch (token) { - case 'g': - parser->stack[++parser->top].state = 65; - return 1; - - default: - return -1; - } - break; - case 64: switch (token) { - case 'r': - parser->stack[++parser->top].state = 66; - return 1; - default: - return -1; + 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 TOK_BLOCK: + case 'o': parser->stack[++parser->top].state = 67; return 1; @@ -1041,6 +1050,39 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus break; case 66: + switch (token) { + case 'g': + parser->stack[++parser->top].state = 68; + return 1; + + default: + return -1; + } + break; + + case 67: + switch (token) { + case 'r': + parser->stack[++parser->top].state = 69; + return 1; + + default: + return -1; + } + break; + + case 68: + switch (token) { + case TOK_BLOCK: + parser->stack[++parser->top].state = 70; + return 1; + + default: + return -1; + } + break; + + 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.push_back(*var); + rhs->second.emplace_back(*var, true); return rhs; } -rhs |= rhs(rhs) STRING(str) { +rhs |= rhs(=rhs) symbol(sym) '(' '=' varname(var) ')' { + rhs->first.push_back(*sym); + rhs->second.emplace_back(*var, false); + + return rhs; +} + +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; };