Refactor parser rule variable handling
This commit is contained in:
parent
3818c8c528
commit
a6cf9b0956
3 changed files with 198 additions and 220 deletions
|
@ -74,7 +74,7 @@ void output_source_slr_t::emit_state_reduce_code(const item_t &item, unsigned ru
|
|||
write_line_("result.symbol_", item.get_lhs(), " = ", call(reduce_func));
|
||||
|
||||
for (unsigned i = 0; i < vars.size(); i++) {
|
||||
if (!vars[i].second)
|
||||
if (vars[i].second)
|
||||
continue;
|
||||
|
||||
auto it = get_generator()->get_grammar().destructors.find(rhs[i]);
|
||||
|
|
383
src/parse.cpp
383
src/parse.cpp
|
@ -3,7 +3,8 @@
|
|||
|
||||
namespace solar {
|
||||
|
||||
typedef std::vector<std::pair<std::string, bool>> vars_t;
|
||||
typedef std::pair<std::string, bool> var_t;
|
||||
typedef std::vector<var_t> vars_t;
|
||||
typedef std::pair<std::vector<solar::symbol_t>, vars_t> rhs_t;
|
||||
|
||||
}
|
||||
|
@ -14,11 +15,13 @@ namespace solar {
|
|||
typedef union parse_symbol_value {
|
||||
parse_token_value_t token;
|
||||
std::string *symbol_action;
|
||||
bool symbol_consume;
|
||||
std::string *symbol_csymbol;
|
||||
std::vector<std::string> *symbol_namespace;
|
||||
rhs_t *symbol_rhs;
|
||||
symbol_t *symbol_symbol;
|
||||
symbol_t *symbol_term;
|
||||
var_t *symbol_variable;
|
||||
} parse_symbol_value_t;
|
||||
|
||||
typedef struct parse_context_state {
|
||||
|
@ -85,28 +88,14 @@ static inline void parse_reduce_11(std::string *lhs, unsigned char c1, unsigned
|
|||
|
||||
static inline rhs_t * parse_reduce_12(__attribute__((unused)) grammar_t *grammar) {return new rhs_t();}
|
||||
|
||||
static inline rhs_t * parse_reduce_13(rhs_t *rhs, symbol_t *sym, __attribute__((unused)) grammar_t *grammar) {
|
||||
static inline rhs_t * parse_reduce_13(rhs_t *rhs, symbol_t *sym, var_t *var, __attribute__((unused)) grammar_t *grammar) {
|
||||
rhs->first.push_back(*sym);
|
||||
rhs->second.emplace_back();
|
||||
rhs->second.push_back(*var);
|
||||
|
||||
return rhs;
|
||||
}
|
||||
|
||||
static inline rhs_t * parse_reduce_14(rhs_t *rhs, symbol_t *sym, std::string *var, __attribute__((unused)) grammar_t *grammar) {
|
||||
rhs->first.push_back(*sym);
|
||||
rhs->second.emplace_back(*var, true);
|
||||
|
||||
return rhs;
|
||||
}
|
||||
|
||||
static inline rhs_t * parse_reduce_15(rhs_t *rhs, symbol_t *sym, std::string *var, __attribute__((unused)) grammar_t *grammar) {
|
||||
rhs->first.push_back(*sym);
|
||||
rhs->second.emplace_back(*var, false);
|
||||
|
||||
return rhs;
|
||||
}
|
||||
|
||||
static inline rhs_t * parse_reduce_16(rhs_t *rhs, std::string *str, __attribute__((unused)) grammar_t *grammar) {
|
||||
static inline rhs_t * parse_reduce_14(rhs_t *rhs, std::string *str, __attribute__((unused)) grammar_t *grammar) {
|
||||
for (char c : *str) {
|
||||
rhs->first.push_back(symbol_t::make_char(c));
|
||||
rhs->second.emplace_back();
|
||||
|
@ -115,30 +104,38 @@ static inline rhs_t * parse_reduce_16(rhs_t *rhs, std::string *str, __attribute_
|
|||
return rhs;
|
||||
}
|
||||
|
||||
static inline std::string * parse_reduce_17(__attribute__((unused)) grammar_t *grammar) {return new std::string;}
|
||||
static inline var_t * parse_reduce_15(__attribute__((unused)) grammar_t *grammar) {return new var_t;}
|
||||
|
||||
static inline std::string * parse_reduce_18(std::string *v, __attribute__((unused)) grammar_t *grammar) {return v;}
|
||||
static inline var_t * parse_reduce_16(bool consume, std::string *var, __attribute__((unused)) grammar_t *grammar) {return new var_t(*var, consume);}
|
||||
|
||||
static inline std::string * parse_reduce_19(std::string *v, __attribute__((unused)) grammar_t *grammar) {return new std::string("return " + *v + ";");}
|
||||
static inline bool parse_reduce_17(__attribute__((unused)) grammar_t *grammar) {return false;}
|
||||
|
||||
static inline std::vector<std::string> * parse_reduce_20(std::string *v, __attribute__((unused)) grammar_t *grammar) {return new std::vector<std::string> {*v};}
|
||||
static inline bool parse_reduce_18(__attribute__((unused)) grammar_t *grammar) {return true;}
|
||||
|
||||
static inline std::vector<std::string> * parse_reduce_21(std::vector<std::string> *ns, std::string *v, __attribute__((unused)) grammar_t *grammar) {
|
||||
static inline std::string * parse_reduce_19(__attribute__((unused)) grammar_t *grammar) {return new std::string;}
|
||||
|
||||
static inline std::string * parse_reduce_20(std::string *v, __attribute__((unused)) grammar_t *grammar) {return v;}
|
||||
|
||||
static inline std::string * parse_reduce_21(std::string *v, __attribute__((unused)) grammar_t *grammar) {return new std::string("return " + *v + ";");}
|
||||
|
||||
static inline std::vector<std::string> * parse_reduce_22(std::string *v, __attribute__((unused)) grammar_t *grammar) {return new std::vector<std::string> {*v};}
|
||||
|
||||
static inline std::vector<std::string> * parse_reduce_23(std::vector<std::string> *ns, std::string *v, __attribute__((unused)) grammar_t *grammar) {
|
||||
ns->push_back(*v);
|
||||
return ns;
|
||||
}
|
||||
|
||||
static inline symbol_t * parse_reduce_22(std::string *v, __attribute__((unused)) grammar_t *grammar) {return new symbol_t(symbol_t::make_nonterm(*v));}
|
||||
static inline symbol_t * parse_reduce_24(std::string *v, __attribute__((unused)) grammar_t *grammar) {return new symbol_t(symbol_t::make_nonterm(*v));}
|
||||
|
||||
static inline symbol_t * parse_reduce_23(symbol_t *v, __attribute__((unused)) grammar_t *grammar) {return v;}
|
||||
static inline symbol_t * parse_reduce_25(symbol_t *v, __attribute__((unused)) grammar_t *grammar) {return v;}
|
||||
|
||||
static inline symbol_t * parse_reduce_24(std::string *v, __attribute__((unused)) grammar_t *grammar) {return new symbol_t(symbol_t::make_term(*v));}
|
||||
static inline symbol_t * parse_reduce_26(std::string *v, __attribute__((unused)) grammar_t *grammar) {return new symbol_t(symbol_t::make_term(*v));}
|
||||
|
||||
static inline symbol_t * parse_reduce_25(unsigned char v, __attribute__((unused)) grammar_t *grammar) {return new symbol_t(symbol_t::make_char(v));}
|
||||
static inline symbol_t * parse_reduce_27(unsigned char v, __attribute__((unused)) grammar_t *grammar) {return new symbol_t(symbol_t::make_char(v));}
|
||||
|
||||
static inline std::string * parse_reduce_26(std::string *v, __attribute__((unused)) grammar_t *grammar) {return v;}
|
||||
static inline std::string * parse_reduce_28(std::string *v, __attribute__((unused)) grammar_t *grammar) {return v;}
|
||||
|
||||
static inline std::string * parse_reduce_27(std::string *v, __attribute__((unused)) grammar_t *grammar) {return v;}
|
||||
static inline std::string * parse_reduce_29(std::string *v, __attribute__((unused)) grammar_t *grammar) {return v;}
|
||||
|
||||
|
||||
static int parse_do_push(parse_context_t *parser, int token, __attribute__((unused)) grammar_t *grammar) {
|
||||
|
@ -504,15 +501,13 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 28:
|
||||
switch (token) {
|
||||
case '(':
|
||||
parser->stack[++parser->top].state = 44;
|
||||
parser->stack[++parser->top].state = 45;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
parser->top -= 2;
|
||||
result.symbol_rhs = parse_reduce_13(parser->stack[parser->top + 0].value.symbol_rhs, parser->stack[parser->top + 1].value.symbol_symbol, grammar);
|
||||
delete(parser->stack[parser->top + 1].value.symbol_symbol);
|
||||
parser->stack[parser->top].value.symbol_rhs = result.symbol_rhs;
|
||||
parser->stack[++parser->top].state = 19;
|
||||
result.symbol_variable = parse_reduce_15(grammar);
|
||||
parser->stack[parser->top].value.symbol_variable = result.symbol_variable;
|
||||
parser->stack[++parser->top].state = 44;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -520,7 +515,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
switch (token) {
|
||||
default:
|
||||
parser->top -= 1;
|
||||
result.symbol_symbol = parse_reduce_23(parser->stack[parser->top + 0].value.symbol_term, grammar);
|
||||
result.symbol_symbol = parse_reduce_25(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 19:
|
||||
|
@ -539,7 +534,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_18(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
result.symbol_action = parse_reduce_20(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
parser->stack[parser->top].value.symbol_action = result.symbol_action;
|
||||
parser->stack[++parser->top].state = 27;
|
||||
}
|
||||
|
@ -549,7 +544,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
switch (token) {
|
||||
default:
|
||||
parser->top -= 1;
|
||||
result.symbol_term = parse_reduce_25(parser->stack[parser->top + 0].value.token.c, grammar);
|
||||
result.symbol_term = parse_reduce_27(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 19:
|
||||
|
@ -558,7 +553,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
break;
|
||||
|
||||
case 43:
|
||||
parser->stack[++parser->top].state = 51;
|
||||
parser->stack[++parser->top].state = 52;
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -569,7 +564,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_19(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
result.symbol_action = parse_reduce_21(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
delete(parser->stack[parser->top + 0].value.token.str);
|
||||
parser->stack[parser->top].value.symbol_action = result.symbol_action;
|
||||
parser->stack[++parser->top].state = 27;
|
||||
|
@ -580,7 +575,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_16(parser->stack[parser->top + 0].value.symbol_rhs, parser->stack[parser->top + 1].value.token.str, grammar);
|
||||
result.symbol_rhs = parse_reduce_14(parser->stack[parser->top + 0].value.symbol_rhs, parser->stack[parser->top + 1].value.token.str, grammar);
|
||||
delete(parser->stack[parser->top + 1].value.token.str);
|
||||
parser->stack[parser->top].value.symbol_rhs = result.symbol_rhs;
|
||||
parser->stack[++parser->top].state = 19;
|
||||
|
@ -591,7 +586,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
switch (token) {
|
||||
default:
|
||||
parser->top -= 1;
|
||||
result.symbol_symbol = parse_reduce_22(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
result.symbol_symbol = parse_reduce_24(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
delete(parser->stack[parser->top + 0].value.token.str);
|
||||
parser->stack[parser->top].value.symbol_symbol = result.symbol_symbol;
|
||||
switch (parser->stack[parser->top].state) {
|
||||
|
@ -611,7 +606,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
switch (token) {
|
||||
default:
|
||||
parser->top -= 1;
|
||||
result.symbol_term = parse_reduce_24(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
result.symbol_term = parse_reduce_26(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
delete(parser->stack[parser->top + 0].value.token.str);
|
||||
parser->stack[parser->top].value.symbol_term = result.symbol_term;
|
||||
switch (parser->stack[parser->top].state) {
|
||||
|
@ -621,7 +616,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
break;
|
||||
|
||||
case 43:
|
||||
parser->stack[++parser->top].state = 51;
|
||||
parser->stack[++parser->top].state = 52;
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -632,7 +627,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(grammar);
|
||||
result.symbol_action = parse_reduce_19(grammar);
|
||||
parser->stack[parser->top].value.symbol_action = result.symbol_action;
|
||||
parser->stack[++parser->top].state = 27;
|
||||
}
|
||||
|
@ -641,7 +636,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 37:
|
||||
switch (token) {
|
||||
case '.':
|
||||
parser->stack[++parser->top].state = 45;
|
||||
parser->stack[++parser->top].state = 46;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -652,7 +647,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 38:
|
||||
switch (token) {
|
||||
case 'r':
|
||||
parser->stack[++parser->top].state = 46;
|
||||
parser->stack[++parser->top].state = 47;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -663,7 +658,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 39:
|
||||
switch (token) {
|
||||
case 'a':
|
||||
parser->stack[++parser->top].state = 47;
|
||||
parser->stack[++parser->top].state = 48;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -674,7 +669,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 40:
|
||||
switch (token) {
|
||||
case 'e':
|
||||
parser->stack[++parser->top].state = 48;
|
||||
parser->stack[++parser->top].state = 49;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -685,7 +680,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 41:
|
||||
switch (token) {
|
||||
case 's':
|
||||
parser->stack[++parser->top].state = 49;
|
||||
parser->stack[++parser->top].state = 50;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -696,7 +691,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 42:
|
||||
switch (token) {
|
||||
case 'c':
|
||||
parser->stack[++parser->top].state = 50;
|
||||
parser->stack[++parser->top].state = 51;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -715,7 +710,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
return 1;
|
||||
|
||||
case TOK_SYMBOL:
|
||||
parser->stack[++parser->top].state = 52;
|
||||
parser->stack[++parser->top].state = 53;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -725,38 +720,33 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
|
||||
case 44:
|
||||
switch (token) {
|
||||
case TOK_SYMBOL:
|
||||
parser->stack[++parser->top].state = 54;
|
||||
return 1;
|
||||
|
||||
case TOK_SYMBOL_UC:
|
||||
parser->stack[++parser->top].state = 55;
|
||||
return 1;
|
||||
|
||||
case '=':
|
||||
parser->stack[++parser->top].state = 56;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
return -1;
|
||||
parser->top -= 3;
|
||||
result.symbol_rhs = parse_reduce_13(parser->stack[parser->top + 0].value.symbol_rhs, parser->stack[parser->top + 1].value.symbol_symbol, parser->stack[parser->top + 2].value.symbol_variable, grammar);
|
||||
delete(parser->stack[parser->top + 1].value.symbol_symbol);
|
||||
delete(parser->stack[parser->top + 2].value.symbol_variable);
|
||||
parser->stack[parser->top].value.symbol_rhs = result.symbol_rhs;
|
||||
parser->stack[++parser->top].state = 19;
|
||||
}
|
||||
break;
|
||||
|
||||
case 45:
|
||||
switch (token) {
|
||||
case '.':
|
||||
parser->stack[++parser->top].state = 57;
|
||||
case '=':
|
||||
parser->stack[++parser->top].state = 55;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
return -1;
|
||||
result.symbol_consume = parse_reduce_17(grammar);
|
||||
parser->stack[parser->top].value.symbol_consume = result.symbol_consume;
|
||||
parser->stack[++parser->top].state = 54;
|
||||
}
|
||||
break;
|
||||
|
||||
case 46:
|
||||
switch (token) {
|
||||
case 'u':
|
||||
parser->stack[++parser->top].state = 58;
|
||||
case '.':
|
||||
parser->stack[++parser->top].state = 56;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -766,8 +756,8 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
|
||||
case 47:
|
||||
switch (token) {
|
||||
case '_':
|
||||
parser->stack[++parser->top].state = 59;
|
||||
case 'u':
|
||||
parser->stack[++parser->top].state = 57;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -777,8 +767,8 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
|
||||
case 48:
|
||||
switch (token) {
|
||||
case 'r':
|
||||
parser->stack[++parser->top].state = 60;
|
||||
case '_':
|
||||
parser->stack[++parser->top].state = 58;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -788,8 +778,8 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
|
||||
case 49:
|
||||
switch (token) {
|
||||
case 'p':
|
||||
parser->stack[++parser->top].state = 61;
|
||||
case 'r':
|
||||
parser->stack[++parser->top].state = 59;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -799,8 +789,8 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
|
||||
case 50:
|
||||
switch (token) {
|
||||
case 'e':
|
||||
parser->stack[++parser->top].state = 62;
|
||||
case 'p':
|
||||
parser->stack[++parser->top].state = 60;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -810,8 +800,8 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
|
||||
case 51:
|
||||
switch (token) {
|
||||
case TOK_BLOCK:
|
||||
parser->stack[++parser->top].state = 63;
|
||||
case 'e':
|
||||
parser->stack[++parser->top].state = 61;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -822,7 +812,7 @@ 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 = 64;
|
||||
parser->stack[++parser->top].state = 62;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -832,8 +822,8 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
|
||||
case 53:
|
||||
switch (token) {
|
||||
case ')':
|
||||
parser->stack[++parser->top].state = 65;
|
||||
case TOK_BLOCK:
|
||||
parser->stack[++parser->top].state = 63;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -842,91 +832,13 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
break;
|
||||
|
||||
case 54:
|
||||
switch (token) {
|
||||
default:
|
||||
parser->top -= 1;
|
||||
result.symbol_csymbol = parse_reduce_27(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
parser->stack[parser->top].value.symbol_csymbol = result.symbol_csymbol;
|
||||
switch (parser->stack[parser->top].state) {
|
||||
case 44:
|
||||
parser->stack[++parser->top].state = 53;
|
||||
break;
|
||||
|
||||
case 56:
|
||||
parser->stack[++parser->top].state = 66;
|
||||
break;
|
||||
|
||||
case 63:
|
||||
parser->stack[++parser->top].state = 73;
|
||||
break;
|
||||
|
||||
case 82:
|
||||
parser->stack[++parser->top].state = 86;
|
||||
break;
|
||||
|
||||
case 85:
|
||||
parser->stack[++parser->top].state = 89;
|
||||
break;
|
||||
|
||||
case 88:
|
||||
parser->stack[++parser->top].state = 91;
|
||||
break;
|
||||
|
||||
case 92:
|
||||
parser->stack[++parser->top].state = 93;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 55:
|
||||
switch (token) {
|
||||
default:
|
||||
parser->top -= 1;
|
||||
result.symbol_csymbol = parse_reduce_26(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
parser->stack[parser->top].value.symbol_csymbol = result.symbol_csymbol;
|
||||
switch (parser->stack[parser->top].state) {
|
||||
case 44:
|
||||
parser->stack[++parser->top].state = 53;
|
||||
break;
|
||||
|
||||
case 56:
|
||||
parser->stack[++parser->top].state = 66;
|
||||
break;
|
||||
|
||||
case 63:
|
||||
parser->stack[++parser->top].state = 73;
|
||||
break;
|
||||
|
||||
case 82:
|
||||
parser->stack[++parser->top].state = 86;
|
||||
break;
|
||||
|
||||
case 85:
|
||||
parser->stack[++parser->top].state = 89;
|
||||
break;
|
||||
|
||||
case 88:
|
||||
parser->stack[++parser->top].state = 91;
|
||||
break;
|
||||
|
||||
case 92:
|
||||
parser->stack[++parser->top].state = 93;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 56:
|
||||
switch (token) {
|
||||
case TOK_SYMBOL:
|
||||
parser->stack[++parser->top].state = 54;
|
||||
parser->stack[++parser->top].state = 65;
|
||||
return 1;
|
||||
|
||||
case TOK_SYMBOL_UC:
|
||||
parser->stack[++parser->top].state = 55;
|
||||
parser->stack[++parser->top].state = 66;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -934,7 +846,17 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
}
|
||||
break;
|
||||
|
||||
case 57:
|
||||
case 55:
|
||||
switch (token) {
|
||||
default:
|
||||
parser->top -= 1;
|
||||
result.symbol_consume = parse_reduce_18(grammar);
|
||||
parser->stack[parser->top].value.symbol_consume = result.symbol_consume;
|
||||
parser->stack[++parser->top].state = 54;
|
||||
}
|
||||
break;
|
||||
|
||||
case 56:
|
||||
switch (token) {
|
||||
case '.':
|
||||
parser->stack[++parser->top].state = 67;
|
||||
|
@ -945,7 +867,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
}
|
||||
break;
|
||||
|
||||
case 58:
|
||||
case 57:
|
||||
switch (token) {
|
||||
case 'c':
|
||||
parser->stack[++parser->top].state = 68;
|
||||
|
@ -956,7 +878,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
}
|
||||
break;
|
||||
|
||||
case 59:
|
||||
case 58:
|
||||
switch (token) {
|
||||
case 'a':
|
||||
parser->stack[++parser->top].state = 69;
|
||||
|
@ -967,7 +889,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
}
|
||||
break;
|
||||
|
||||
case 60:
|
||||
case 59:
|
||||
switch (token) {
|
||||
case TOK_BLOCK:
|
||||
parser->stack[++parser->top].state = 70;
|
||||
|
@ -978,7 +900,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
}
|
||||
break;
|
||||
|
||||
case 61:
|
||||
case 60:
|
||||
switch (token) {
|
||||
case 'a':
|
||||
parser->stack[++parser->top].state = 71;
|
||||
|
@ -989,7 +911,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
}
|
||||
break;
|
||||
|
||||
case 62:
|
||||
case 61:
|
||||
switch (token) {
|
||||
case TOK_BLOCK:
|
||||
parser->stack[++parser->top].state = 72;
|
||||
|
@ -1000,14 +922,14 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
}
|
||||
break;
|
||||
|
||||
case 63:
|
||||
case 62:
|
||||
switch (token) {
|
||||
case TOK_SYMBOL:
|
||||
parser->stack[++parser->top].state = 54;
|
||||
parser->stack[++parser->top].state = 65;
|
||||
return 1;
|
||||
|
||||
case TOK_SYMBOL_UC:
|
||||
parser->stack[++parser->top].state = 55;
|
||||
parser->stack[++parser->top].state = 66;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -1015,7 +937,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
}
|
||||
break;
|
||||
|
||||
case 64:
|
||||
case 63:
|
||||
switch (token) {
|
||||
default:
|
||||
parser->top -= 7;
|
||||
|
@ -1026,19 +948,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
}
|
||||
break;
|
||||
|
||||
case 65:
|
||||
switch (token) {
|
||||
default:
|
||||
parser->top -= 5;
|
||||
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 + 3].value.symbol_csymbol, grammar);
|
||||
delete(parser->stack[parser->top + 1].value.symbol_symbol);
|
||||
delete(parser->stack[parser->top + 3].value.symbol_csymbol);
|
||||
parser->stack[parser->top].value.symbol_rhs = result.symbol_rhs;
|
||||
parser->stack[++parser->top].state = 19;
|
||||
}
|
||||
break;
|
||||
|
||||
case 66:
|
||||
case 64:
|
||||
switch (token) {
|
||||
case ')':
|
||||
parser->stack[++parser->top].state = 74;
|
||||
|
@ -1049,6 +959,76 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
}
|
||||
break;
|
||||
|
||||
case 65:
|
||||
switch (token) {
|
||||
default:
|
||||
parser->top -= 1;
|
||||
result.symbol_csymbol = parse_reduce_29(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
parser->stack[parser->top].value.symbol_csymbol = result.symbol_csymbol;
|
||||
switch (parser->stack[parser->top].state) {
|
||||
case 54:
|
||||
parser->stack[++parser->top].state = 64;
|
||||
break;
|
||||
|
||||
case 62:
|
||||
parser->stack[++parser->top].state = 73;
|
||||
break;
|
||||
|
||||
case 82:
|
||||
parser->stack[++parser->top].state = 86;
|
||||
break;
|
||||
|
||||
case 85:
|
||||
parser->stack[++parser->top].state = 89;
|
||||
break;
|
||||
|
||||
case 88:
|
||||
parser->stack[++parser->top].state = 91;
|
||||
break;
|
||||
|
||||
case 92:
|
||||
parser->stack[++parser->top].state = 93;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 66:
|
||||
switch (token) {
|
||||
default:
|
||||
parser->top -= 1;
|
||||
result.symbol_csymbol = parse_reduce_28(parser->stack[parser->top + 0].value.token.str, grammar);
|
||||
parser->stack[parser->top].value.symbol_csymbol = result.symbol_csymbol;
|
||||
switch (parser->stack[parser->top].state) {
|
||||
case 54:
|
||||
parser->stack[++parser->top].state = 64;
|
||||
break;
|
||||
|
||||
case 62:
|
||||
parser->stack[++parser->top].state = 73;
|
||||
break;
|
||||
|
||||
case 82:
|
||||
parser->stack[++parser->top].state = 86;
|
||||
break;
|
||||
|
||||
case 85:
|
||||
parser->stack[++parser->top].state = 89;
|
||||
break;
|
||||
|
||||
case 88:
|
||||
parser->stack[++parser->top].state = 91;
|
||||
break;
|
||||
|
||||
case 92:
|
||||
parser->stack[++parser->top].state = 93;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 67:
|
||||
switch (token) {
|
||||
case TOK_CHAR:
|
||||
|
@ -1128,12 +1108,11 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 74:
|
||||
switch (token) {
|
||||
default:
|
||||
parser->top -= 6;
|
||||
result.symbol_rhs = parse_reduce_15(parser->stack[parser->top + 0].value.symbol_rhs, parser->stack[parser->top + 1].value.symbol_symbol, parser->stack[parser->top + 4].value.symbol_csymbol, grammar);
|
||||
delete(parser->stack[parser->top + 1].value.symbol_symbol);
|
||||
delete(parser->stack[parser->top + 4].value.symbol_csymbol);
|
||||
parser->stack[parser->top].value.symbol_rhs = result.symbol_rhs;
|
||||
parser->stack[++parser->top].state = 19;
|
||||
parser->top -= 4;
|
||||
result.symbol_variable = parse_reduce_16(parser->stack[parser->top + 1].value.symbol_consume, parser->stack[parser->top + 2].value.symbol_csymbol, grammar);
|
||||
delete(parser->stack[parser->top + 2].value.symbol_csymbol);
|
||||
parser->stack[parser->top].value.symbol_variable = result.symbol_variable;
|
||||
parser->stack[++parser->top].state = 44;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1217,11 +1196,11 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 82:
|
||||
switch (token) {
|
||||
case TOK_SYMBOL:
|
||||
parser->stack[++parser->top].state = 54;
|
||||
parser->stack[++parser->top].state = 65;
|
||||
return 1;
|
||||
|
||||
case TOK_SYMBOL_UC:
|
||||
parser->stack[++parser->top].state = 55;
|
||||
parser->stack[++parser->top].state = 66;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -1261,11 +1240,11 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 85:
|
||||
switch (token) {
|
||||
case TOK_SYMBOL:
|
||||
parser->stack[++parser->top].state = 54;
|
||||
parser->stack[++parser->top].state = 65;
|
||||
return 1;
|
||||
|
||||
case TOK_SYMBOL_UC:
|
||||
parser->stack[++parser->top].state = 55;
|
||||
parser->stack[++parser->top].state = 66;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -1277,7 +1256,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
switch (token) {
|
||||
default:
|
||||
parser->top -= 1;
|
||||
result.symbol_namespace = parse_reduce_20(parser->stack[parser->top + 0].value.symbol_csymbol, grammar);
|
||||
result.symbol_namespace = parse_reduce_22(parser->stack[parser->top + 0].value.symbol_csymbol, grammar);
|
||||
delete(parser->stack[parser->top + 0].value.symbol_csymbol);
|
||||
parser->stack[parser->top].value.symbol_namespace = result.symbol_namespace;
|
||||
parser->stack[++parser->top].state = 87;
|
||||
|
@ -1301,11 +1280,11 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 88:
|
||||
switch (token) {
|
||||
case TOK_SYMBOL:
|
||||
parser->stack[++parser->top].state = 54;
|
||||
parser->stack[++parser->top].state = 65;
|
||||
return 1;
|
||||
|
||||
case TOK_SYMBOL_UC:
|
||||
parser->stack[++parser->top].state = 55;
|
||||
parser->stack[++parser->top].state = 66;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -1349,11 +1328,11 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
case 92:
|
||||
switch (token) {
|
||||
case TOK_SYMBOL:
|
||||
parser->stack[++parser->top].state = 54;
|
||||
parser->stack[++parser->top].state = 65;
|
||||
return 1;
|
||||
|
||||
case TOK_SYMBOL_UC:
|
||||
parser->stack[++parser->top].state = 55;
|
||||
parser->stack[++parser->top].state = 66;
|
||||
return 1;
|
||||
|
||||
default:
|
||||
|
@ -1365,7 +1344,7 @@ static int parse_do_push(parse_context_t *parser, int token, __attribute__((unus
|
|||
switch (token) {
|
||||
default:
|
||||
parser->top -= 4;
|
||||
result.symbol_namespace = parse_reduce_21(parser->stack[parser->top + 0].value.symbol_namespace, parser->stack[parser->top + 3].value.symbol_csymbol, grammar);
|
||||
result.symbol_namespace = parse_reduce_23(parser->stack[parser->top + 0].value.symbol_namespace, parser->stack[parser->top + 3].value.symbol_csymbol, grammar);
|
||||
delete(parser->stack[parser->top + 3].value.symbol_csymbol);
|
||||
parser->stack[parser->top].value.symbol_namespace = result.symbol_namespace;
|
||||
parser->stack[++parser->top].state = 87;
|
||||
|
|
33
src/parse.y
33
src/parse.y
|
@ -7,7 +7,8 @@
|
|||
%source {
|
||||
namespace solar {
|
||||
|
||||
typedef std::vector<std::pair<std::string, bool>> vars_t;
|
||||
typedef std::pair<std::string, bool> var_t;
|
||||
typedef std::vector<var_t> vars_t;
|
||||
typedef std::pair<std::vector<solar::symbol_t>, vars_t> rhs_t;
|
||||
|
||||
}
|
||||
|
@ -38,6 +39,9 @@ typedef std::pair<std::vector<solar::symbol_t>, vars_t> rhs_t;
|
|||
%type rhs {rhs_t *}
|
||||
%destructor rhs delete
|
||||
|
||||
%type variable {var_t *}
|
||||
%destructor variable delete
|
||||
|
||||
%type action {std::string *}
|
||||
%destructor action delete
|
||||
|
||||
|
@ -50,6 +54,8 @@ typedef std::pair<std::vector<solar::symbol_t>, vars_t> rhs_t;
|
|||
%type csymbol {std::string *}
|
||||
%destructor csymbol delete
|
||||
|
||||
%type consume {bool}
|
||||
|
||||
|
||||
%extra_arg {__attribute__((unused)) grammar_t *} grammar
|
||||
|
||||
|
@ -100,23 +106,9 @@ directive |= SYMBOL(lhs) "|=" '(' CHAR(c1) "..." CHAR(c2) ')' ';' {
|
|||
|
||||
rhs |= [new rhs_t()]
|
||||
|
||||
rhs |= rhs(=rhs) symbol(sym) {
|
||||
rhs |= rhs(=rhs) symbol(sym) variable(var) {
|
||||
rhs->first.push_back(*sym);
|
||||
rhs->second.emplace_back();
|
||||
|
||||
return rhs;
|
||||
}
|
||||
|
||||
rhs |= rhs(=rhs) symbol(sym) '(' csymbol(var) ')' {
|
||||
rhs->first.push_back(*sym);
|
||||
rhs->second.emplace_back(*var, true);
|
||||
|
||||
return rhs;
|
||||
}
|
||||
|
||||
rhs |= rhs(=rhs) symbol(sym) '(' '=' csymbol(var) ')' {
|
||||
rhs->first.push_back(*sym);
|
||||
rhs->second.emplace_back(*var, false);
|
||||
rhs->second.push_back(*var);
|
||||
|
||||
return rhs;
|
||||
}
|
||||
|
@ -131,6 +123,13 @@ rhs |= rhs(=rhs) STRING(str) {
|
|||
}
|
||||
|
||||
|
||||
variable |= [new var_t]
|
||||
variable |= '(' consume(consume) csymbol(var) ')' [new var_t(*var, consume)]
|
||||
|
||||
consume |= [false]
|
||||
consume |= '=' [true]
|
||||
|
||||
|
||||
action |= ';' [new std::string]
|
||||
action |= BLOCK(=v) [v]
|
||||
action |= SQBLOCK(v) [new std::string("return " + *v + ";")]
|
||||
|
|
Reference in a new issue