diff options
Diffstat (limited to 'src/parse.y')
-rw-r--r-- | src/parse.y | 121 |
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)] |