X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/e4ab12542b8819c7333377c3fd16f2bd6329b572..230a3db428622bb964807111b46812879b7ee726:/NEWS diff --git a/NEWS b/NEWS index 27c4974a..72e4b6b3 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,49 @@ -Bison News ----------- +GNU Bison NEWS -* Changes in version 2.5.1_rc1 (2012-05-14): +* Noteworthy changes in release ?.? (????-??-??) [?] + +** Future changes: + + The next major release will drop support for generating parsers in K&R C, + and remove the definitions of yystype and yyltype (removal announced since + Bison 1.875). YYPARSE_PARAM and YYLEX_PARAM, which were deprecated in + favor of %parse-param and %lex-param (introduced in Bison 1.875 too), will + no longer be supported. + +** The generated header is included (yacc.c) + + Instead of duplicating the content of the generated header (definition of + YYSTYPE, yyltype etc.), the generated parser now includes it, as was + already the case for GLR or C++ parsers. + +** Headers (yacc.c, glr.c, glr.cc) + +*** Guards + + 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 */ + +*** New declarations + + The generated header now declares yydebug and yyparse. Both honor + --name-prefix=bar_, and yield + + int bar_parse (void); + + rather than + + #define yyparse bar_parse + int yyparse (void); + + in order to facilitate the inclusion of several parser headers inside a + single compilation unit. + +* Noteworthy changes in release 2.5.1 (2012-06-05) [stable] ** Future changes: @@ -26,12 +68,35 @@ Bison News The Java parser no longer throws ArrayIndexOutOfBoundsException if the first token leads to a syntax error. Some minor clean ups. -** C++11 compatibility: +** Changes for C++: + +*** C++11 compatibility: C and C++ parsers use "nullptr" instead of "0" when __cplusplus is 201103L or higher. -** C++ locations: +*** Header guards + + 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 + + The inclusion guard is now computed from "PREFIX/FILE-NAME", where lower + case characters are converted to upper case, and series of + non-alphanumerical characters are converted to an underscore. + + 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 + +*** C++ locations: The position and location constructors (and their initialize methods) accept new arguments for line and column. Several issues in the @@ -70,7 +135,7 @@ Bison News This includes warnings with some compilers, unexpected behavior of tools such as diff, warning messages from the test suite itself, etc. -*** The install-pdf target work properly: +*** The install-pdf target works properly: Running "make install-pdf" (or -dvi, -html, -info, and -ps) no longer halts in the middle of its course. @@ -260,33 +325,33 @@ Bison News 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) use: - # 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++: @@ -905,26 +970,26 @@ Bison News if the symbols have destructors. For instance: exp: exp "?" exp ":" exp { $1 ? $1 : $3; } - | 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); } - | 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. @@ -1139,6 +1204,33 @@ Bison News - "parsing stack overflow..." -> "parser stack overflow" GLR parsers now report "parser stack overflow" as per the Bison manual. +** %parse-param and %lex-param + The macros YYPARSE_PARAM and YYLEX_PARAM provide a means to pass + additional context to yyparse and yylex. They suffer from several + shortcomings: + + - a single argument only can be added, + - their types are weak (void *), + - this context is not passed to anciliary functions such as yyerror, + - only yacc.c parsers support them. + + The new %parse-param/%lex-param directives provide a more precise control. + For instance: + + %parse-param {int *nastiness} + %lex-param {int *nastiness} + %parse-param {int *randomness} + + results in the following signatures: + + int yylex (int *nastiness); + int yyparse (int *nastiness, int *randomness); + + or, if both %pure-parser and %locations are used: + + int yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness); + int yyparse (int *nastiness, int *randomness); + ** Bison now warns if it detects conflicting outputs to the same file, e.g., it generates a warning for "bison -d -o foo.h foo.y" since that command outputs both code and header to foo.h. @@ -1168,16 +1260,16 @@ Bison News In agreement with POSIX and with other Yaccs, leaving a default action is valid when $$ is untyped, and $1 typed: - untyped: ... typed; + untyped: ... typed; but the converse remains an error: - typed: ... untyped; + typed: ... untyped; ** 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. @@ -1259,9 +1351,9 @@ Bison News ** 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. @@ -1280,9 +1372,9 @@ Bison News 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 + %token MYEOF 0 or - %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. @@ -1318,9 +1410,9 @@ Bison News 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 bar - %% - bar: '0' {} '0'; + %type bar + %% + bar: '0' {} '0'; This is fixed.