Don't require the user to specify the symbol type for a reduce rule

This commit is contained in:
Robin Jadoul 2017-01-01 13:16:24 +01:00
parent 85d5142c60
commit 06b1ef75e1
1 changed files with 8 additions and 5 deletions

View File

@ -50,8 +50,8 @@ class {{name}} {
* Apply a reduction (a grammar rule in reverse) * Apply a reduction (a grammar rule in reverse)
*/ */
{{#rules}} {{#rules}}
{{#name}}virtual Token reduce_{{name}}(std::deque<Token> subparts) = 0;{{/name}} {{#name}}virtual Value reduce_{{name}}(std::deque<Token> subparts) = 0;{{/name}}
{{^name}}virtual Token reduce_{{index}}(std::deque<Token> subparts) = 0;{{/name}} {{^name}}virtual Value reduce_{{index}}(std::deque<Token> subparts) = 0;{{/name}}
{{/rules}} {{/rules}}
private: private:
@ -97,7 +97,10 @@ Value {{name}}::parse() {
break; break;
case REDUCE: case REDUCE:
{ {
std::uint64_t rule = act >> 2; std::uint64_t tmp = act >> 2;
Symbol symbol = tmp >> 31;
std::uint32_t rule = tmp & ((1ull << 32) - 1);
std::deque<Token> dq; std::deque<Token> dq;
for (decltype(RECUDE_COUNT[rule]) i = 0; i < REDUCE_COUNT[rule]; i++) { for (decltype(RECUDE_COUNT[rule]) i = 0; i < REDUCE_COUNT[rule]; i++) {
dq.emplace_front(std::move(valueStack.top())); dq.emplace_front(std::move(valueStack.top()));
@ -108,8 +111,8 @@ Value {{name}}::parse() {
switch (rule) { switch (rule) {
{{#rules}} {{#rules}}
case {{index}}: case {{index}}:
{{#name}}valueStack.emplace(reduce_{{name}}(std::move(dq))){{/name}} {{#name}}valueStack.emplace({symbol, reduce_{{name}}(std::move(dq))}){{/name}}
{{^name}}valueStack.emplace(reduce{{index}}(std::move(dq))){{/name}} {{^name}}valueStack.emplace({symbol, reduce_{{index}}(std::move(dq))}){{/name}}
break; break;
{{/rules}} {{/rules}}
default: default: