Next: Midrule Action Translation, Previous: Using Midrule Actions, Up: Actions in Midrule [Contents][Index]
In the above example, if the parser initiates error recovery (see Error Recovery) while parsing the tokens in the embedded statement stmt
,
it might discard the previous semantic context $<context>5
without
restoring it. Thus, $<context>5
needs a destructor
(see Freeing Discarded Symbols), and Bison needs the
type of the semantic value (context
) to select the right destructor.
As an extension to Yacc’s midrule actions, Bison offers a means to type their semantic value: specify its type tag (‘<...>’ before the midrule action.
Consider the previous example, with an untyped midrule action:
stmt: "let" '(' var ')' { $<context>$ = push_context (); // *** declare_variable ($3); } stmt { $$ = $6; pop_context ($<context>5); // *** }
If instead you write:
stmt: "let" '(' var ')' <context>{ // *** $$ = push_context (); // *** declare_variable ($3); } stmt { $$ = $6; pop_context ($5); // *** }
then %printer
and %destructor
work properly (no more leaks!),
C++ variant
s can be used, and redundancy is reduced (<context>
is specified once).