1.5.3 GLR Semantic Actions
The nature of GLR parsing and the structure of the generated
parsers give rise to certain restrictions on semantic values and actions.
Deferred semantic actions
YYERROR
Restrictions on semantic values and locations
1.5.3.1 Deferred semantic actions
By definition, a deferred semantic action is not performed at the same time as
the associated reduction.
This raises caveats for several Bison features you might use in a semantic
action in a GLR parser.
In any semantic action, you can examine
yychar
to determine the kind
of the lookahead token present at the time of the associated reduction.
After checking that
yychar
is not set to
YYEMPTY
or
YYEOF
, you can then examine
yylval
and
yylloc
to
determine the lookahead token’s semantic value and location, if any. In a
nondeferred semantic action, you can also modify any of these variables to
influence syntax analysis. See
Lookahead Tokens
.
In a deferred semantic action, it’s too late to influence syntax analysis.
In this case,
yychar
,
yylval
, and
yylloc
are set to
shallow copies of the values they had at the time of the associated reduction.
For this reason alone, modifying them is dangerous.
Moreover, the result of modifying them is undefined and subject to change with
future versions of Bison.
For example, if a semantic action might be deferred, you should never write it
to invoke
yyclearin
(see
Special Features for Use in Actions
) or to attempt to free
memory referenced by
yylval
.
1.5.3.2 YYERROR
Another Bison feature requiring special consideration is
YYERROR
(see
Special Features for Use in Actions
), which you can invoke in a semantic action to
initiate error recovery.
During deterministic GLR operation, the effect of
YYERROR
is
the same as its effect in a deterministic parser.
The effect in a deferred action is similar, but the precise point of the
error is undefined; instead, the parser reverts to deterministic operation,
selecting an unspecified stack on which to continue with a syntax error.
In a semantic predicate (see
Controlling a Parse with Arbitrary Predicates
) during nondeterministic
parsing,
YYERROR
silently prunes
the parse that invoked the test.
1.5.3.3 Restrictions on semantic values and locations
GLR parsers require that you use POD (Plain Old Data) types for
semantic values and location types when using the generated parsers as
C++ code.