summaryrefslogtreecommitdiffstats
path: root/src/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.y')
-rw-r--r--src/parse.y121
1 files changed, 62 insertions, 59 deletions
diff --git a/src/parse.y b/src/parse.y
index ed946e0..dba747e 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -1,22 +1,60 @@
+%header {
+#include "grammar.hpp"
+}
+
+%source {
+static inline void free_string(std::string *v) {
+ delete v;
+}
+
+static inline void free_symbol(solar::symbol_t *v) {
+ delete v;
+}
+
+static inline void free_rule(solar::rule_t *v) {
+ delete v;
+}
+}
+
+
%type SYMBOL {std::string *} str
+%destructor SYMBOL free_string
+
%type SYMBOL_UC {std::string *} str
+%destructor SYMBOL_UC free_string
+
%type SYMBOL_LC {std::string *} str
+%destructor SYMBOL_LC free_string
+
%type BLOCK {std::string *} str
+%destructor BLOCK free_string
+
%type SQBLOCK {std::string *} str
+%destructor SQBLOCK free_string
+
%type STRING {std::string *} str
+%destructor STRING free_string
+
%type CHAR {char} c
+
%type rule {solar::rule_t *}
+%destructor rule free_rule
+
%type rhs {std::pair<std::vector<solar::symbol_t>, std::vector<std::string>> *}
+
%type action {std::string *}
+%destructor action free_string
+
%type symbol {solar::symbol_t *}
+%destructor symbol free_symbol
+
%type term {solar::symbol_t *}
-%type varname {std::string *}
+%destructor term free_symbol
+%type varname {std::string *}
+%destructor varname free_string
-%header {
-#include "grammar.hpp"
-}
%extra_arg {__attribute__((unused)) solar::grammar_t *} grammar
@@ -24,57 +62,45 @@
grammar |=;
grammar |= grammar directive;
-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.push_back(*rule);
- delete rule;
-}
directive |= "%type" SYMBOL_LC(nonterm) BLOCK(type) {
grammar->nonterm_types.insert(std::make_pair(*nonterm, *type));
-
- delete nonterm;
- delete type;
}
directive |= "%type" term(term) BLOCK(type) varname(name) {
grammar->term_types.insert(std::make_pair(*term, std::make_pair(*type, *name)));
+}
- delete term;
- delete type;
- delete name;
+directive |= "%destructor" symbol(sym) varname(name) {
+ grammar->destructors.insert(std::make_pair(*sym, *name));
}
directive |= "%source" BLOCK(block) {
grammar->source_block = *block;
- delete block;
}
directive |= "%header" BLOCK(block) {
grammar->header_block = *block;
- delete block;
}
directive |= "%extra_arg" BLOCK(type) varname(name) {
grammar->extra_args.push_back(std::make_pair(*type, *name));
+}
- delete type;
- delete name;
+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.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 lhs;
delete rhs;
- delete action;
-
return ret;
}
@@ -84,7 +110,6 @@ rhs |= [new std::pair<std::vector<solar::symbol_t>, std::vector<std::string>>()]
rhs |= rhs(rhs) symbol(sym) {
rhs->first.push_back(*sym);
rhs->second.emplace_back();
- delete sym;
return rhs;
}
@@ -93,9 +118,6 @@ rhs |= rhs(rhs) symbol(sym) '(' varname(var) ')' {
rhs->first.push_back(*sym);
rhs->second.push_back(*var);
- delete sym;
- delete var;
-
return rhs;
}
@@ -105,40 +127,21 @@ rhs |= rhs(rhs) STRING(str) {
rhs->second.emplace_back();
}
- delete str;
-
return rhs;
}
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) {
- *v = "\n\treturn " + *v + ";\n";
- return v;
-}
-
-
-symbol |= term(v) [v]
-
-symbol |= SYMBOL_LC(v) {
- solar::symbol_t *ret = new solar::symbol_t(solar::symbol_t::make_nonterm(*v));
- delete v;
- return ret;
-}
-
-
-term |= SYMBOL_UC(v) {
- solar::symbol_t *ret = new solar::symbol_t(solar::symbol_t::make_term(*v));
- delete v;
- return ret;
-}
+symbol |= term(v) [new solar::symbol_t(*v)]
+symbol |= SYMBOL_LC(v) [new solar::symbol_t(solar::symbol_t::make_nonterm(*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) [v]
-varname |= SYMBOL_UC(v) [v]
-varname |= SYMBOL(v) [v]
+varname |= SYMBOL_LC(v) [new std::string(*v)]
+varname |= SYMBOL_UC(v) [new std::string(*v)]
+varname |= SYMBOL(v)[new std::string(*v)]