diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-04-11 03:18:22 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-04-11 03:18:22 +0200 |
commit | 1a79d217af4b7403b6567c269bf115bb1fad9495 (patch) | |
tree | b9c07942a0ba592e1ab2b17cede2fac82a2314a1 /src/parse.y | |
parent | d91b60407ce812de60f0700ffc15712cb9a05d15 (diff) | |
download | solar-1a79d217af4b7403b6567c269bf115bb1fad9495.tar solar-1a79d217af4b7403b6567c269bf115bb1fad9495.zip |
Allow skipping the destructor selectively
Diffstat (limited to 'src/parse.y')
-rw-r--r-- | src/parse.y | 45 |
1 files changed, 28 insertions, 17 deletions
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<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) { @@ -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>(), std::string()}); + grammar->rules.emplace_back(solar::rule_t {std::move(init), vars_t(), std::string()}); } grammar->rules.push_back(*rule); } -rule |= SYMBOL_LC(lhs) "|=" rhs(rhs) action(action) { - auto *ret = new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action}; - delete rhs; - return ret; -} +rule |= SYMBOL_LC(lhs) "|=" rhs(rhs) action(action) [ + new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action} +] rhs |= [new rhs_t()] -rhs |= rhs(rhs) symbol(sym) { +rhs |= rhs(=rhs) symbol(sym) { rhs->first.push_back(*sym); rhs->second.emplace_back(); return rhs; } -rhs |= rhs(rhs) symbol(sym) '(' varname(var) ')' { +rhs |= rhs(=rhs) symbol(sym) '(' varname(var) ')' { + rhs->first.push_back(*sym); + rhs->second.emplace_back(*var, true); + + return rhs; +} + +rhs |= rhs(=rhs) symbol(sym) '(' '=' varname(var) ')' { rhs->first.push_back(*sym); - rhs->second.push_back(*var); + rhs->second.emplace_back(*var, false); return rhs; } -rhs |= rhs(rhs) STRING(str) { +rhs |= rhs(=rhs) STRING(str) { for (char c : *str) { rhs->first.push_back(solar::symbol_t::make_char(c)); rhs->second.emplace_back(); @@ -135,16 +146,16 @@ rhs |= rhs(rhs) STRING(str) { action |= ';' [new std::string] -action |= BLOCK(v) [new std::string(*v)] -action |= SQBLOCK(v) [new std::string("\n\treturn " + *v + ";\n")] +action |= BLOCK(=v) [v] +action |= SQBLOCK(v) [new std::string("return " + *v + ";")] -symbol |= term(v) [new solar::symbol_t(*v)] symbol |= SYMBOL_LC(v) [new solar::symbol_t(solar::symbol_t::make_nonterm(*v))] +symbol |= term(=v) [v] term |= SYMBOL_UC(v) [new solar::symbol_t(solar::symbol_t::make_term(*v))] term |= CHAR(v) [new solar::symbol_t(solar::symbol_t::make_char(v))] -varname |= SYMBOL_LC(v) [new std::string(*v)] -varname |= SYMBOL_UC(v) [new std::string(*v)] -varname |= SYMBOL(v)[new std::string(*v)] +varname |= SYMBOL_LC(=v) [v] +varname |= SYMBOL_UC(=v) [v] +varname |= SYMBOL(=v)[v] |