summaryrefslogtreecommitdiffstats
path: root/src/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.y')
-rw-r--r--src/parse.y33
1 files changed, 16 insertions, 17 deletions
diff --git a/src/parse.y b/src/parse.y
index 9e445e7..9959b0b 100644
--- a/src/parse.y
+++ b/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->first.push_back(*sym);
- rhs->second.emplace_back();
-
- return rhs;
-}
-
-rhs |= rhs(=rhs) symbol(sym) '(' csymbol(var) ')' {
+rhs |= rhs(=rhs) symbol(sym) variable(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 + ";")]