diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-04-17 23:10:47 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-04-17 23:14:17 +0200 |
commit | 9cbf364a463acf6fe8a7e69d19f1df864a80c851 (patch) | |
tree | beb6a9c522c9c10642cedc63f2f9f0aeef82399d /src/parse.y | |
parent | 59db91599c0097b80a7ed61c6bb71e046f4d9f54 (diff) | |
download | solar-9cbf364a463acf6fe8a7e69d19f1df864a80c851.tar solar-9cbf364a463acf6fe8a7e69d19f1df864a80c851.zip |
Add support for character terminal group rules
Diffstat (limited to 'src/parse.y')
-rw-r--r-- | src/parse.y | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/src/parse.y b/src/parse.y index 8d8a081..4fcba12 100644 --- a/src/parse.y +++ b/src/parse.y @@ -15,10 +15,6 @@ static inline void free_symbol(solar::symbol_t *v) { delete v; } -static inline void free_rule(solar::rule_t *v) { - delete v; -} - static inline void free_rhs(rhs_t *v) { delete v; } @@ -40,12 +36,9 @@ static inline void free_rhs(rhs_t *v) { %type STRING {std::string *} str %destructor STRING free_string -%type CHAR {char} c +%type CHAR {unsigned char} c -%type rule {solar::rule_t *} -%destructor rule free_rule - %type rhs {rhs_t *} %destructor rhs free_rhs @@ -93,13 +86,17 @@ directive |= "%extra_arg" BLOCK(type) varname(name) { grammar->extra_args.push_back(std::make_pair(*type, *name)); } -directive |= rule(rule) { - grammar->add_rule(*rule); +directive |= SYMBOL(lhs) "|=" rhs(rhs) action(action) { + grammar->add_rule({solar::item_t(*lhs, rhs->first), rhs->second, *action}); } +directive |= SYMBOL(lhs) "|=" '(' CHAR(c1) "..." CHAR(c2) ')' ';' { + vars_t vars; + vars.emplace_back(); -rule |= SYMBOL(lhs) "|=" rhs(rhs) action(action) - [new solar::rule_t {solar::item_t(*lhs, rhs->first), rhs->second, *action}] + for (unsigned int c = c1; c <= c2; c++) + grammar->add_rule({solar::item_t(*lhs, {solar::symbol_t::make_char(c)}), vars, std::string()}); +} rhs |= [new rhs_t()] |