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++ variants can be used, and redundancy is reduced (<context>
is specified once).