In GLR grammars, $N and @N now yield non-modifiable lvalues.

This commit is contained in:
Paul Eggert
2003-10-05 06:46:53 +00:00
parent 66ef8b9d65
commit 0cc3da3a4e
3 changed files with 14 additions and 5 deletions

View File

@@ -1,3 +1,11 @@
2003-10-04 Paul Eggert <eggert@twinsun.com>
* data/glr.c (b4_rhs_value, b4_rhs_location): Yield a
non-modifiable lvalue, instead of a modifiable one.
* doc/bison.texinfo (Actions): Document that $$ can
be assigned to. Do not claim that $$ and $N are
array element references: user code should not rely on this.
2003-10-01 Paul Eggert <eggert@twinsun.com>
* src/parse-gram.h (PERCENT_NO_DEFAULT_PREC): New token.

View File

@@ -111,7 +111,7 @@ m4_define([b4_lhs_value],
# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
# symbols on RHS.
m4_define([b4_rhs_value],
[yyvsp@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3])])
[((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3])])
@@ -131,7 +131,7 @@ m4_define([b4_lhs_location],
# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
# on RHS.
m4_define([b4_rhs_location],
[yyvsp@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc])
[((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc])
# We do want M4 expansion after # for CPP macros.
m4_changecom()

View File

@@ -2797,9 +2797,10 @@ Actions, ,Actions in Mid-Rule}).
The C code in an action can refer to the semantic values of the components
matched by the rule with the construct @code{$@var{n}}, which stands for
the value of the @var{n}th component. The semantic value for the grouping
being constructed is @code{$$}. (Bison translates both of these constructs
into array element references when it copies the actions into the parser
file.)
being constructed is @code{$$}. Bison translates both of these
constructs into expressions of the appropriate type when it copies the
actions into the parser file. @code{$$} is translated to a modifiable
lvalue, so it can be assigned to.
Here is a typical example: