summaryrefslogtreecommitdiffstats
path: root/src/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.y')
-rw-r--r--src/parse.y45
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]