add support for typed mid-rule actions

Prompted on Piotr Marcińczyk's message:
http://lists.gnu.org/archive/html/bug-bison/2017-06/msg00000.html.
See also http://lists.gnu.org/archive/html/bug-bison/2018-06/msg00001.html.

Because their type is unknown to Bison, the values of midrule actions are
not treated like the others: they don't have %printer and %destructor
support.  In addition, in C++, (Bison) variants cannot work properly.

Typed midrule actions address these issues.  Instead of:

    exp: { $<ival>$ = 1; } { $<ival>$ = 2; }   { $$ = $<ival>1 + $<ival>2; }

write:

    exp: <ival>{ $$ = 1; } <ival>{ $$ = 2; }   { $$ = $1 + $2; }

* src/scan-code.h, src/scan-code.l (code_props): Add a `type` field to
record the declared type of an action.
(code_props_rule_action_init): Add a type argument.
* src/parse-gram.y: Accept an optional type tag for actions.
* src/reader.h, src/reader.c (grammar_current_rule_action_append): Add
a type argument.
(grammar_midrule_action): When a mid-rule is typed, pass its type to
the defined dummy non terminal symbol.
This commit is contained in:
Akim Demaille
2018-06-17 18:15:05 +02:00
parent 0d06a966f8
commit 7b24c424b5
6 changed files with 27 additions and 12 deletions

View File

@@ -825,7 +825,8 @@ code_props_symbol_action_init (code_props *self, char const *code,
void
code_props_rule_action_init (code_props *self, char const *code,
location code_loc, symbol_list *rule,
named_ref *name, bool is_predicate)
named_ref *name, uniqstr type,
bool is_predicate)
{
code_props_none_init (self);
self->kind = CODE_PROPS_RULE_ACTION;
@@ -833,6 +834,7 @@ code_props_rule_action_init (code_props *self, char const *code,
self->location = code_loc;
self->rule = rule;
self->named_ref = name;
self->type = type;
self->is_predicate = is_predicate;
}