* NEWS: Fix indentation of code snippets.
Untabify.
The generated headers are now guarded, as is already the case for C++
parsers (lalr1.cc). For intance, with --defines=foo.h:
The generated headers are now guarded, as is already the case for C++
parsers (lalr1.cc). For intance, with --defines=foo.h:
- #ifndef YY_FOO_H
- # define YY_FOO_H
- ...
- #endif /* !YY_FOO_H */
+ #ifndef YY_FOO_H
+ # define YY_FOO_H
+ ...
+ #endif /* !YY_FOO_H */
*** New declarations
The generated header now declares yydebug and yyparse. Both honor
--name-prefix=bar_, and yield
*** New declarations
The generated header now declares yydebug and yyparse. Both honor
--name-prefix=bar_, and yield
- #define yyparse bar_parse
- int yyparse (void);
+ #define yyparse bar_parse
+ int yyparse (void);
in order to facilitate the inclusion of several parser headers inside a
single compilation unit.
in order to facilitate the inclusion of several parser headers inside a
single compilation unit.
The header files such as "parser.hh", "location.hh", etc. used a constant
name for preprocessor guards, for instance:
The header files such as "parser.hh", "location.hh", etc. used a constant
name for preprocessor guards, for instance:
- #ifndef BISON_LOCATION_HH
- # define BISON_LOCATION_HH
- ...
- #endif // !BISON_LOCATION_HH
+ #ifndef BISON_LOCATION_HH
+ # define BISON_LOCATION_HH
+ ...
+ #endif // !BISON_LOCATION_HH
The inclusion guard is now computed from "PREFIX/FILE-NAME", where lower
case characters are converted to upper case, and series of
The inclusion guard is now computed from "PREFIX/FILE-NAME", where lower
case characters are converted to upper case, and series of
With "bison -o lang++/parser.cc", "location.hh" would now include:
With "bison -o lang++/parser.cc", "location.hh" would now include:
- #ifndef YY_LANG_LOCATION_HH
- # define YY_LANG_LOCATION_HH
- ...
- #endif // !YY_LANG_LOCATION_HH
+ #ifndef YY_LANG_LOCATION_HH
+ # define YY_LANG_LOCATION_HH
+ ...
+ #endif // !YY_LANG_LOCATION_HH
to use it. If, for instance, your location structure has "first"
and "last" members, instead of
to use it. If, for instance, your location structure has "first"
and "last" members, instead of
- # define YYLLOC_DEFAULT(Current, Rhs, N) \
- do \
- if (N) \
- { \
- (Current).first = (Rhs)[1].location.first; \
- (Current).last = (Rhs)[N].location.last; \
- } \
- else \
- { \
- (Current).first = (Current).last = (Rhs)[0].location.last; \
- } \
- while (false)
+ # define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (N) \
+ { \
+ (Current).first = (Rhs)[1].location.first; \
+ (Current).last = (Rhs)[N].location.last; \
+ } \
+ else \
+ { \
+ (Current).first = (Current).last = (Rhs)[0].location.last; \
+ } \
+ while (false)
- # define YYLLOC_DEFAULT(Current, Rhs, N) \
- do \
- if (N) \
- { \
- (Current).first = YYRHSLOC (Rhs, 1).first; \
- (Current).last = YYRHSLOC (Rhs, N).last; \
- } \
- else \
- { \
- (Current).first = (Current).last = YYRHSLOC (Rhs, 0).last; \
- } \
- while (false)
+ # define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (N) \
+ { \
+ (Current).first = YYRHSLOC (Rhs, 1).first; \
+ (Current).last = YYRHSLOC (Rhs, N).last; \
+ } \
+ else \
+ { \
+ (Current).first = (Current).last = YYRHSLOC (Rhs, 0).last; \
+ } \
+ while (false)
** YYLLOC_DEFAULT in C++:
** YYLLOC_DEFAULT in C++:
if the symbols have destructors. For instance:
exp: exp "?" exp ":" exp { $1 ? $1 : $3; }
if the symbols have destructors. For instance:
exp: exp "?" exp ":" exp { $1 ? $1 : $3; }
will trigger a warning about $$ and $5 in the first rule, and $3 in
the second ($1 is copied to $$ by the default rule). This example
most likely contains three errors, and could be rewritten as:
exp: exp "?" exp ":" exp
will trigger a warning about $$ and $5 in the first rule, and $3 in
the second ($1 is copied to $$ by the default rule). This example
most likely contains three errors, and could be rewritten as:
exp: exp "?" exp ":" exp
- { $$ = $1 ? $3 : $5; free ($1 ? $5 : $3); free ($1); }
- | exp "+" exp
- { $$ = $1 ? $1 : $3; if ($1) free ($3); }
- ;
+ { $$ = $1 ? $3 : $5; free ($1 ? $5 : $3); free ($1); }
+ | exp "+" exp
+ { $$ = $1 ? $1 : $3; if ($1) free ($3); }
+ ;
However, if the original actions were really intended, memory leaks
and all, the warnings can be suppressed by letting Bison believe the
values are used, e.g.:
exp: exp "?" exp ":" exp { $1 ? $1 : $3; (void) ($$, $5); }
However, if the original actions were really intended, memory leaks
and all, the warnings can be suppressed by letting Bison believe the
values are used, e.g.:
exp: exp "?" exp ":" exp { $1 ? $1 : $3; (void) ($$, $5); }
- | exp "+" exp { $$ = $1; (void) $3; }
- ;
+ | exp "+" exp { $$ = $1; (void) $3; }
+ ;
If there are mid-rule actions, the warning is issued if no action
uses it. The following triggers no warning: $1 and $3 are used.
If there are mid-rule actions, the warning is issued if no action
uses it. The following triggers no warning: $1 and $3 are used.
In agreement with POSIX and with other Yaccs, leaving a default
action is valid when $$ is untyped, and $1 typed:
In agreement with POSIX and with other Yaccs, leaving a default
action is valid when $$ is untyped, and $1 typed:
but the converse remains an error:
but the converse remains an error:
** Values of mid-rule actions
The following code:
** Values of mid-rule actions
The following code:
- foo: { ... } { $$ = $1; } ...
+ foo: { ... } { $$ = $1; } ...
was incorrectly rejected: $1 is defined in the second mid-rule
action, and is equal to the $$ of the first mid-rule action.
was incorrectly rejected: $1 is defined in the second mid-rule
action, and is equal to the $$ of the first mid-rule action.
** Incorrect "Token not used"
On a grammar such as
** Incorrect "Token not used"
On a grammar such as
- %token useless useful
- %%
- exp: '0' %prec useful;
+ %token useless useful
+ %%
+ exp: '0' %prec useful;
where a token was used to set the precedence of the last rule,
bison reported both "useful" and "useless" as useless tokens.
where a token was used to set the precedence of the last rule,
bison reported both "useful" and "useless" as useless tokens.
the user symbol is used in the reports, the graphs, and the verbose
error messages instead of "$end", which remains being the default.
For instance
the user symbol is used in the reports, the graphs, and the verbose
error messages instead of "$end", which remains being the default.
For instance
- %token MYEOF 0 "end of file"
+ %token MYEOF 0 "end of file"
** Semantic parser
This old option, which has been broken for ages, is removed.
** Semantic parser
This old option, which has been broken for ages, is removed.
Previous versions don't complain when there is a type clash on
the default action if the rule has a mid-rule action, such as in:
Previous versions don't complain when there is a type clash on
the default action if the rule has a mid-rule action, such as in:
- %type <foo> bar
- %%
- bar: '0' {} '0';
+ %type <foo> bar
+ %%
+ bar: '0' {} '0';