Allow skipping the destructor selectively
This commit is contained in:
parent
d91b60407c
commit
1a79d217af
6 changed files with 264 additions and 207 deletions
|
@ -173,15 +173,15 @@ void output_t::emit_reduction(unsigned rule_id) {
|
||||||
|
|
||||||
bool empty = true;
|
bool empty = true;
|
||||||
for (unsigned i = 0; i < rule.variables.size(); i++) {
|
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;
|
continue;
|
||||||
|
|
||||||
if (!empty)
|
if (!empty)
|
||||||
std::fprintf(source_file, ", ");
|
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;
|
empty = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,8 +69,7 @@ void output_lr0_t::emit_state_reduce(const item_t &item, int rule_id) {
|
||||||
bool empty = true;
|
bool empty = true;
|
||||||
const auto &vars = generator->get_grammar().rules[rule_id].variables;
|
const auto &vars = generator->get_grammar().rules[rule_id].variables;
|
||||||
for (unsigned i = 0; i < vars.size(); i++) {
|
for (unsigned i = 0; i < vars.size(); i++) {
|
||||||
const std::string &var = vars[i];
|
if (vars[i].first.empty())
|
||||||
if (var.empty())
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!empty)
|
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");
|
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]);
|
auto it = generator->get_grammar().destructors.find(rhs[i]);
|
||||||
if (it == generator->get_grammar().destructors.end())
|
if (it == generator->get_grammar().destructors.end())
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -66,8 +66,7 @@ void output_slr_t::emit_state_reduce_code(const item_t &item, int rule_id) {
|
||||||
bool empty = true;
|
bool empty = true;
|
||||||
const auto &vars = generator->get_grammar().rules[rule_id].variables;
|
const auto &vars = generator->get_grammar().rules[rule_id].variables;
|
||||||
for (unsigned i = 0; i < vars.size(); i++) {
|
for (unsigned i = 0; i < vars.size(); i++) {
|
||||||
const std::string &var = vars[i];
|
if (vars[i].first.empty())
|
||||||
if (var.empty())
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!empty)
|
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");
|
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]);
|
auto it = generator->get_grammar().destructors.find(rhs[i]);
|
||||||
if (it == generator->get_grammar().destructors.end())
|
if (it == generator->get_grammar().destructors.end())
|
||||||
continue;
|
continue;
|
||||||
|
|
402
src/parse.cpp
402
src/parse.cpp
|
@ -1,7 +1,8 @@
|
||||||
#include "parse.hpp"
|
#include "parse.hpp"
|
||||||
|
|
||||||
|
|
||||||
typedef std::pair<std::vector<solar::symbol_t>, std::vector<std::string>> rhs_t;
|
typedef std::vector<std::pair<std::string, bool>> vars_t;
|
||||||
|
typedef std::pair<std::vector<solar::symbol_t>, vars_t> rhs_t;
|
||||||
|
|
||||||
|
|
||||||
static inline void free_string(std::string *v) {
|
static inline void free_string(std::string *v) {
|
||||||
|
@ -16,6 +17,10 @@ static inline void free_rule(solar::rule_t *v) {
|
||||||
delete v;
|
delete v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void free_rhs(rhs_t *v) {
|
||||||
|
delete v;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef union parse_symbol_value {
|
typedef union parse_symbol_value {
|
||||||
parse_token_value_t token;
|
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()) {
|
if (grammar->rules.empty()) {
|
||||||
solar::item_t init("");
|
solar::item_t init("");
|
||||||
init.get_rhs().push_back(solar::symbol_t::make_nonterm(rule->item.get_lhs().c_str()));
|
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>(), std::string()});
|
grammar->rules.emplace_back(solar::rule_t {std::move(init), vars_t(), std::string()});
|
||||||
}
|
}
|
||||||
|
|
||||||
grammar->rules.push_back(*rule);
|
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) {
|
static inline solar::rule_t * parse_reduce_10(std::string * lhs, rhs_t * rhs, std::string * action, __attribute__((unused)) solar::grammar_t * grammar) {return
|
||||||
auto *ret = new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action};
|
new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action}
|
||||||
delete rhs;
|
;}
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline rhs_t * parse_reduce_11(__attribute__((unused)) solar::grammar_t * grammar) {
|
static inline rhs_t * parse_reduce_11(__attribute__((unused)) solar::grammar_t * grammar) {return new rhs_t();}
|
||||||
return new rhs_t();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline rhs_t * parse_reduce_12(rhs_t * rhs, solar::symbol_t * sym, __attribute__((unused)) solar::grammar_t * grammar) {
|
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);
|
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) {
|
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->first.push_back(*sym);
|
||||||
rhs->second.push_back(*var);
|
rhs->second.emplace_back(*var, true);
|
||||||
|
|
||||||
return rhs;
|
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) {
|
for (char c : *str) {
|
||||||
rhs->first.push_back(solar::symbol_t::make_char(c));
|
rhs->first.push_back(solar::symbol_t::make_char(c));
|
||||||
rhs->second.emplace_back();
|
rhs->second.emplace_back();
|
||||||
|
@ -116,45 +124,25 @@ static inline rhs_t * parse_reduce_14(rhs_t * rhs, std::string * str, __attribut
|
||||||
return rhs;
|
return rhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline std::string * parse_reduce_15(__attribute__((unused)) solar::grammar_t * grammar) {
|
static inline std::string * parse_reduce_16(__attribute__((unused)) solar::grammar_t * grammar) {return new std::string;}
|
||||||
return new std::string;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline std::string * parse_reduce_16(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {
|
static inline std::string * parse_reduce_17(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return v;}
|
||||||
return new std::string(*v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline std::string * parse_reduce_17(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {
|
static inline std::string * parse_reduce_18(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return new std::string("return " + *v + ";");}
|
||||||
return new std::string("\n\treturn " + *v + ";\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline solar::symbol_t * parse_reduce_18(solar::symbol_t * v, __attribute__((unused)) solar::grammar_t * grammar) {
|
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));}
|
||||||
return new solar::symbol_t(*v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline solar::symbol_t * parse_reduce_19(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {
|
static inline solar::symbol_t * parse_reduce_20(solar::symbol_t * v, __attribute__((unused)) solar::grammar_t * grammar) {return v;}
|
||||||
return new solar::symbol_t(solar::symbol_t::make_nonterm(*v));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline solar::symbol_t * parse_reduce_20(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {
|
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));}
|
||||||
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) {
|
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));}
|
||||||
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) {
|
static inline std::string * parse_reduce_23(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return v;}
|
||||||
return new std::string(*v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline std::string * parse_reduce_23(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {
|
static inline std::string * parse_reduce_24(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return v;}
|
||||||
return new std::string(*v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline std::string * parse_reduce_24(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {
|
static inline std::string * parse_reduce_25(std::string * v, __attribute__((unused)) solar::grammar_t * grammar) {return v;}
|
||||||
return new std::string(*v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int parse_do_push(parse_context_t *parser, int token, __attribute__((unused)) solar::grammar_t * grammar) {
|
static int parse_do_push(parse_context_t *parser, int token, __attribute__((unused)) solar::grammar_t * grammar) {
|
||||||
parse_symbol_value_t result;
|
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;
|
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);
|
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_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);
|
free_string(parser->stack[parser->top + 4].value.symbol_action);
|
||||||
parser->stack[parser->top].value.symbol_rule = result.symbol_rule;
|
parser->stack[parser->top].value.symbol_rule = result.symbol_rule;
|
||||||
parser->stack[++parser->top].state = 3;
|
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) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 1;
|
parser->top -= 1;
|
||||||
result.symbol_symbol = parse_reduce_18(parser->stack[parser->top + 0].value.symbol_term, grammar);
|
result.symbol_symbol = parse_reduce_20(parser->stack[parser->top + 0].value.symbol_term, grammar);
|
||||||
free_symbol(parser->stack[parser->top + 0].value.symbol_term);
|
|
||||||
parser->stack[parser->top].value.symbol_symbol = result.symbol_symbol;
|
parser->stack[parser->top].value.symbol_symbol = result.symbol_symbol;
|
||||||
switch (parser->stack[parser->top].state) {
|
switch (parser->stack[parser->top].state) {
|
||||||
case 18:
|
case 18:
|
||||||
parser->stack[++parser->top].state = 25;
|
parser->stack[++parser->top].state = 25;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 66:
|
case 69:
|
||||||
parser->stack[++parser->top].state = 68;
|
parser->stack[++parser->top].state = 71;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -513,8 +501,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 1;
|
parser->top -= 1;
|
||||||
result.symbol_action = parse_reduce_16(parser->stack[parser->top + 0].value.token.str, grammar);
|
result.symbol_action = parse_reduce_17(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].value.symbol_action = result.symbol_action;
|
||||||
parser->stack[++parser->top].state = 24;
|
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) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 1;
|
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;
|
parser->stack[parser->top].value.symbol_term = result.symbol_term;
|
||||||
switch (parser->stack[parser->top].state) {
|
switch (parser->stack[parser->top].state) {
|
||||||
case 18:
|
case 18:
|
||||||
case 66:
|
case 69:
|
||||||
parser->stack[++parser->top].state = 26;
|
parser->stack[++parser->top].state = 26;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -544,7 +531,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 1;
|
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);
|
free_string(parser->stack[parser->top + 0].value.token.str);
|
||||||
parser->stack[parser->top].value.symbol_action = result.symbol_action;
|
parser->stack[parser->top].value.symbol_action = result.symbol_action;
|
||||||
parser->stack[++parser->top].state = 24;
|
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) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 2;
|
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);
|
free_string(parser->stack[parser->top + 1].value.token.str);
|
||||||
parser->stack[parser->top].value.symbol_rhs = result.symbol_rhs;
|
parser->stack[parser->top].value.symbol_rhs = result.symbol_rhs;
|
||||||
parser->stack[++parser->top].state = 18;
|
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;
|
parser->stack[++parser->top].state = 25;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 66:
|
case 69:
|
||||||
parser->stack[++parser->top].state = 68;
|
parser->stack[++parser->top].state = 71;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -586,12 +573,12 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 1;
|
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);
|
free_string(parser->stack[parser->top + 0].value.token.str);
|
||||||
parser->stack[parser->top].value.symbol_term = result.symbol_term;
|
parser->stack[parser->top].value.symbol_term = result.symbol_term;
|
||||||
switch (parser->stack[parser->top].state) {
|
switch (parser->stack[parser->top].state) {
|
||||||
case 18:
|
case 18:
|
||||||
case 66:
|
case 69:
|
||||||
parser->stack[++parser->top].state = 26;
|
parser->stack[++parser->top].state = 26;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -607,7 +594,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 1;
|
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].value.symbol_action = result.symbol_action;
|
||||||
parser->stack[++parser->top].state = 24;
|
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;
|
parser->stack[++parser->top].state = 49;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
case '=':
|
||||||
|
parser->stack[++parser->top].state = 50;
|
||||||
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -698,7 +689,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
case 40:
|
case 40:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case 'u':
|
case 'u':
|
||||||
parser->stack[++parser->top].state = 50;
|
parser->stack[++parser->top].state = 51;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -709,7 +700,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
case 41:
|
case 41:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case '_':
|
case '_':
|
||||||
parser->stack[++parser->top].state = 51;
|
parser->stack[++parser->top].state = 52;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -720,7 +711,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
case 42:
|
case 42:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case 'r':
|
case 'r':
|
||||||
parser->stack[++parser->top].state = 52;
|
parser->stack[++parser->top].state = 53;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -731,7 +722,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
case 43:
|
case 43:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case 'e':
|
case 'e':
|
||||||
parser->stack[++parser->top].state = 53;
|
parser->stack[++parser->top].state = 54;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -742,7 +733,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
case 44:
|
case 44:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case TOK_BLOCK:
|
case TOK_BLOCK:
|
||||||
parser->stack[++parser->top].state = 54;
|
parser->stack[++parser->top].state = 55;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -753,7 +744,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
case 45:
|
case 45:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case TOK_BLOCK:
|
case TOK_BLOCK:
|
||||||
parser->stack[++parser->top].state = 55;
|
parser->stack[++parser->top].state = 56;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -764,7 +755,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
case 46:
|
case 46:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case ')':
|
case ')':
|
||||||
parser->stack[++parser->top].state = 56;
|
parser->stack[++parser->top].state = 57;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -776,24 +767,27 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 1;
|
parser->top -= 1;
|
||||||
result.symbol_varname = parse_reduce_24(parser->stack[parser->top + 0].value.token.str, grammar);
|
result.symbol_varname = parse_reduce_25(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_varname = result.symbol_varname;
|
parser->stack[parser->top].value.symbol_varname = result.symbol_varname;
|
||||||
switch (parser->stack[parser->top].state) {
|
switch (parser->stack[parser->top].state) {
|
||||||
case 39:
|
case 39:
|
||||||
parser->stack[++parser->top].state = 46;
|
parser->stack[++parser->top].state = 46;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 54:
|
case 50:
|
||||||
parser->stack[++parser->top].state = 61;
|
parser->stack[++parser->top].state = 58;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 67:
|
case 55:
|
||||||
parser->stack[++parser->top].state = 69;
|
parser->stack[++parser->top].state = 63;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 68:
|
case 70:
|
||||||
parser->stack[++parser->top].state = 70;
|
parser->stack[++parser->top].state = 72;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 71:
|
||||||
|
parser->stack[++parser->top].state = 73;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -804,24 +798,27 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 1;
|
parser->top -= 1;
|
||||||
result.symbol_varname = parse_reduce_22(parser->stack[parser->top + 0].value.token.str, grammar);
|
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);
|
|
||||||
parser->stack[parser->top].value.symbol_varname = result.symbol_varname;
|
parser->stack[parser->top].value.symbol_varname = result.symbol_varname;
|
||||||
switch (parser->stack[parser->top].state) {
|
switch (parser->stack[parser->top].state) {
|
||||||
case 39:
|
case 39:
|
||||||
parser->stack[++parser->top].state = 46;
|
parser->stack[++parser->top].state = 46;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 54:
|
case 50:
|
||||||
parser->stack[++parser->top].state = 61;
|
parser->stack[++parser->top].state = 58;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 67:
|
case 55:
|
||||||
parser->stack[++parser->top].state = 69;
|
parser->stack[++parser->top].state = 63;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 68:
|
case 70:
|
||||||
parser->stack[++parser->top].state = 70;
|
parser->stack[++parser->top].state = 72;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 71:
|
||||||
|
parser->stack[++parser->top].state = 73;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -832,24 +829,27 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 1;
|
parser->top -= 1;
|
||||||
result.symbol_varname = parse_reduce_23(parser->stack[parser->top + 0].value.token.str, grammar);
|
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);
|
|
||||||
parser->stack[parser->top].value.symbol_varname = result.symbol_varname;
|
parser->stack[parser->top].value.symbol_varname = result.symbol_varname;
|
||||||
switch (parser->stack[parser->top].state) {
|
switch (parser->stack[parser->top].state) {
|
||||||
case 39:
|
case 39:
|
||||||
parser->stack[++parser->top].state = 46;
|
parser->stack[++parser->top].state = 46;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 54:
|
case 50:
|
||||||
parser->stack[++parser->top].state = 61;
|
parser->stack[++parser->top].state = 58;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 67:
|
case 55:
|
||||||
parser->stack[++parser->top].state = 69;
|
parser->stack[++parser->top].state = 63;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 68:
|
case 70:
|
||||||
parser->stack[++parser->top].state = 70;
|
parser->stack[++parser->top].state = 72;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 71:
|
||||||
|
parser->stack[++parser->top].state = 73;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -857,50 +857,6 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 50:
|
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) {
|
switch (token) {
|
||||||
case TOK_SYMBOL:
|
case TOK_SYMBOL:
|
||||||
parser->stack[++parser->top].state = 47;
|
parser->stack[++parser->top].state = 47;
|
||||||
|
@ -919,7 +875,70 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
}
|
}
|
||||||
break;
|
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:
|
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) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 7;
|
parser->top -= 7;
|
||||||
|
@ -930,7 +949,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 56:
|
case 57:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 5;
|
parser->top -= 5;
|
||||||
|
@ -942,21 +961,10 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 57:
|
|
||||||
switch (token) {
|
|
||||||
case 't':
|
|
||||||
parser->stack[++parser->top].state = 62;
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 58:
|
case 58:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case 'r':
|
case ')':
|
||||||
parser->stack[++parser->top].state = 63;
|
parser->stack[++parser->top].state = 64;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -965,6 +973,28 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 59:
|
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) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 8;
|
parser->top -= 8;
|
||||||
|
@ -974,7 +1004,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 60:
|
case 62:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 8;
|
parser->top -= 8;
|
||||||
|
@ -984,7 +1014,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 61:
|
case 63:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 8;
|
parser->top -= 8;
|
||||||
|
@ -996,42 +1026,21 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
}
|
}
|
||||||
break;
|
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:
|
case 64:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case 'r':
|
|
||||||
parser->stack[++parser->top].state = 66;
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
default:
|
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;
|
break;
|
||||||
|
|
||||||
case 65:
|
case 65:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case TOK_BLOCK:
|
case 'o':
|
||||||
parser->stack[++parser->top].state = 67;
|
parser->stack[++parser->top].state = 67;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -1041,6 +1050,39 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 66:
|
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) {
|
switch (token) {
|
||||||
case TOK_CHAR:
|
case TOK_CHAR:
|
||||||
parser->stack[++parser->top].state = 28;
|
parser->stack[++parser->top].state = 28;
|
||||||
|
@ -1059,7 +1101,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 67:
|
case 70:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case TOK_SYMBOL:
|
case TOK_SYMBOL:
|
||||||
parser->stack[++parser->top].state = 47;
|
parser->stack[++parser->top].state = 47;
|
||||||
|
@ -1078,7 +1120,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 68:
|
case 71:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case TOK_SYMBOL:
|
case TOK_SYMBOL:
|
||||||
parser->stack[++parser->top].state = 47;
|
parser->stack[++parser->top].state = 47;
|
||||||
|
@ -1097,7 +1139,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 69:
|
case 72:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 12;
|
parser->top -= 12;
|
||||||
|
@ -1108,7 +1150,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 70:
|
case 73:
|
||||||
switch (token) {
|
switch (token) {
|
||||||
default:
|
default:
|
||||||
parser->top -= 13;
|
parser->top -= 13;
|
||||||
|
|
45
src/parse.y
45
src/parse.y
|
@ -3,7 +3,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
%source {
|
%source {
|
||||||
typedef std::pair<std::vector<solar::symbol_t>, std::vector<std::string>> rhs_t;
|
typedef std::vector<std::pair<std::string, bool>> vars_t;
|
||||||
|
typedef std::pair<std::vector<solar::symbol_t>, vars_t> rhs_t;
|
||||||
|
|
||||||
|
|
||||||
static inline void free_string(std::string *v) {
|
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) {
|
static inline void free_rule(solar::rule_t *v) {
|
||||||
delete 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
|
%destructor rule free_rule
|
||||||
|
|
||||||
%type rhs {rhs_t *}
|
%type rhs {rhs_t *}
|
||||||
|
%destructor rhs free_rhs
|
||||||
|
|
||||||
%type action {std::string *}
|
%type action {std::string *}
|
||||||
%destructor action free_string
|
%destructor action free_string
|
||||||
|
@ -94,37 +100,42 @@ directive |= rule(rule) {
|
||||||
if (grammar->rules.empty()) {
|
if (grammar->rules.empty()) {
|
||||||
solar::item_t init("");
|
solar::item_t init("");
|
||||||
init.get_rhs().push_back(solar::symbol_t::make_nonterm(rule->item.get_lhs().c_str()));
|
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>(), std::string()});
|
grammar->rules.emplace_back(solar::rule_t {std::move(init), vars_t(), std::string()});
|
||||||
}
|
}
|
||||||
|
|
||||||
grammar->rules.push_back(*rule);
|
grammar->rules.push_back(*rule);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rule |= SYMBOL_LC(lhs) "|=" rhs(rhs) action(action) {
|
rule |= SYMBOL_LC(lhs) "|=" rhs(rhs) action(action) [
|
||||||
auto *ret = new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action};
|
new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action}
|
||||||
delete rhs;
|
]
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
rhs |= [new rhs_t()]
|
rhs |= [new rhs_t()]
|
||||||
|
|
||||||
rhs |= rhs(rhs) symbol(sym) {
|
rhs |= rhs(=rhs) symbol(sym) {
|
||||||
rhs->first.push_back(*sym);
|
rhs->first.push_back(*sym);
|
||||||
rhs->second.emplace_back();
|
rhs->second.emplace_back();
|
||||||
|
|
||||||
return rhs;
|
return rhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
rhs |= rhs(rhs) symbol(sym) '(' varname(var) ')' {
|
rhs |= rhs(=rhs) symbol(sym) '(' varname(var) ')' {
|
||||||
rhs->first.push_back(*sym);
|
rhs->first.push_back(*sym);
|
||||||
rhs->second.push_back(*var);
|
rhs->second.emplace_back(*var, true);
|
||||||
|
|
||||||
return rhs;
|
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) {
|
for (char c : *str) {
|
||||||
rhs->first.push_back(solar::symbol_t::make_char(c));
|
rhs->first.push_back(solar::symbol_t::make_char(c));
|
||||||
rhs->second.emplace_back();
|
rhs->second.emplace_back();
|
||||||
|
@ -135,16 +146,16 @@ rhs |= rhs(rhs) STRING(str) {
|
||||||
|
|
||||||
|
|
||||||
action |= ';' [new std::string]
|
action |= ';' [new std::string]
|
||||||
action |= BLOCK(v) [new std::string(*v)]
|
action |= BLOCK(=v) [v]
|
||||||
action |= SQBLOCK(v) [new std::string("\n\treturn " + *v + ";\n")]
|
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 |= 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 |= 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))]
|
term |= CHAR(v) [new solar::symbol_t(solar::symbol_t::make_char(v))]
|
||||||
|
|
||||||
varname |= SYMBOL_LC(v) [new std::string(*v)]
|
varname |= SYMBOL_LC(=v) [v]
|
||||||
varname |= SYMBOL_UC(v) [new std::string(*v)]
|
varname |= SYMBOL_UC(=v) [v]
|
||||||
varname |= SYMBOL(v)[new std::string(*v)]
|
varname |= SYMBOL(=v)[v]
|
||||||
|
|
|
@ -33,7 +33,7 @@ namespace solar {
|
||||||
|
|
||||||
struct rule_t {
|
struct rule_t {
|
||||||
item_t item;
|
item_t item;
|
||||||
std::vector<std::string> variables;
|
std::vector<std::pair<std::string, bool>> variables;
|
||||||
std::string action;
|
std::string action;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Reference in a new issue