mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 04:13:03 +00:00
grammar: no longer detect and cure missing semicolon at end of actions
Bison 3.0 is already breaking backward compatibility with other
features. It is an appropriate time to drop this feature. Note that
it was disabled when --yacc is passed. See
http://lists.gnu.org/archive/html/bison-patches/2013-02/msg00102.html
Basically, revert e8cd1ad655.
* src/scan-code.l (braces_level, need_semicolon, in_cpp): Remove.
Remove every rule needed to detect and add missing semicolon.
* tests/actions.at (Fix user actions without a trailing semicolon):
Remove.
* NEWS: Adjust.
This commit is contained in:
11
NEWS
11
NEWS
@@ -4,14 +4,6 @@ GNU Bison NEWS
|
|||||||
|
|
||||||
** WARNING: Future backward-incompatibilities!
|
** WARNING: Future backward-incompatibilities!
|
||||||
|
|
||||||
Bison will stop adding a semicolon at the end of the actions (as announced
|
|
||||||
in the release 2.5):
|
|
||||||
|
|
||||||
foo.y:2.25: warning: a ';' might be needed at the end of action code
|
|
||||||
exp: "number" { $$ = $1 }
|
|
||||||
^
|
|
||||||
foo.y:2.25: future versions of Bison will not add the ';'
|
|
||||||
|
|
||||||
Like other GNU packages, Bison will start using some of the C99 features
|
Like other GNU packages, Bison will start using some of the C99 features
|
||||||
for its own code, especially the definition of variables after statements.
|
for its own code, especially the definition of variables after statements.
|
||||||
The generated C parsers still aim at C90.
|
The generated C parsers still aim at C90.
|
||||||
@@ -28,6 +20,9 @@ GNU Bison NEWS
|
|||||||
Support for YYLEX_PARAM and YYPARSE_PARAM is removed (deprecated in Bison
|
Support for YYLEX_PARAM and YYPARSE_PARAM is removed (deprecated in Bison
|
||||||
1.875): use %lex-param, %parse-param, or %param.
|
1.875): use %lex-param, %parse-param, or %param.
|
||||||
|
|
||||||
|
Missing semicolons at the end of actions are no longer added (as announced
|
||||||
|
in the release 2.5).
|
||||||
|
|
||||||
** Bug fixes
|
** Bug fixes
|
||||||
|
|
||||||
*** The epilogue is no longer affected by internal #defines (glr.c)
|
*** The epilogue is no longer affected by internal #defines (glr.c)
|
||||||
|
|||||||
@@ -95,26 +95,6 @@ ref -?[0-9]+|{id}|"["{id}"]"|"$"
|
|||||||
%%
|
%%
|
||||||
|
|
||||||
%{
|
%{
|
||||||
/* Nesting level of the current code in braces. */
|
|
||||||
int braces_level = 0;
|
|
||||||
|
|
||||||
/* Whether a semicolon is probably needed.
|
|
||||||
|
|
||||||
The heuristic is that a semicolon is not needed after '{', '}',
|
|
||||||
';', or a C preprocessor directive, and that whitespaces and
|
|
||||||
comments do not affect this flag. Note that '{' does not need a
|
|
||||||
semicolon because of '{}'. A semicolon may be needed before a
|
|
||||||
cpp directive, but don't bother.
|
|
||||||
|
|
||||||
While it is maintained in several start-conditions (factoring
|
|
||||||
opportunities), it is meaningful only for SC_RULE_ACTION. */
|
|
||||||
bool need_semicolon = false;
|
|
||||||
|
|
||||||
/* Whether in a C preprocessor directive. Don't use a start condition
|
|
||||||
for this because, at the end of strings and comments, we still need
|
|
||||||
to know whether we're in a directive. */
|
|
||||||
bool in_cpp = false;
|
|
||||||
|
|
||||||
/* This scanner is special: it is invoked only once, henceforth
|
/* This scanner is special: it is invoked only once, henceforth
|
||||||
is expected to return only once. This initialization is
|
is expected to return only once. This initialization is
|
||||||
therefore done once per action to translate. */
|
therefore done once per action to translate. */
|
||||||
@@ -167,32 +147,14 @@ ref -?[0-9]+|{id}|"["{id}"]"|"$"
|
|||||||
|
|
||||||
<SC_RULE_ACTION,SC_SYMBOL_ACTION>
|
<SC_RULE_ACTION,SC_SYMBOL_ACTION>
|
||||||
{
|
{
|
||||||
"'" {
|
"'" STRING_GROW; BEGIN SC_CHARACTER;
|
||||||
STRING_GROW;
|
"\"" STRING_GROW; BEGIN SC_STRING;
|
||||||
BEGIN SC_CHARACTER;
|
"/"{splice}"*" STRING_GROW; BEGIN SC_COMMENT;
|
||||||
need_semicolon = true;
|
"/"{splice}"/" STRING_GROW; BEGIN SC_LINE_COMMENT;
|
||||||
}
|
|
||||||
"\"" {
|
|
||||||
STRING_GROW;
|
|
||||||
BEGIN SC_STRING;
|
|
||||||
need_semicolon = true;
|
|
||||||
}
|
|
||||||
"/"{splice}"*" {
|
|
||||||
STRING_GROW;
|
|
||||||
BEGIN SC_COMMENT;
|
|
||||||
}
|
|
||||||
"/"{splice}"/" {
|
|
||||||
STRING_GROW;
|
|
||||||
BEGIN SC_LINE_COMMENT;
|
|
||||||
}
|
|
||||||
[$@] {
|
[$@] {
|
||||||
complain (loc, Wother, _("stray '%s'"), yytext);
|
complain (loc, Wother, _("stray '%s'"), yytext);
|
||||||
obstack_escape (&obstack_for_string, yytext);
|
obstack_escape (&obstack_for_string, yytext);
|
||||||
need_semicolon = true;
|
|
||||||
}
|
|
||||||
[\[\]] {
|
|
||||||
obstack_escape (&obstack_for_string, yytext);
|
|
||||||
need_semicolon = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,51 +165,13 @@ ref -?[0-9]+|{id}|"["{id}"]"|"$"
|
|||||||
handle_action_dollar (self->rule, yytext, *loc);
|
handle_action_dollar (self->rule, yytext, *loc);
|
||||||
if (ref_tail_fields)
|
if (ref_tail_fields)
|
||||||
obstack_sgrow (&obstack_for_string, ref_tail_fields);
|
obstack_sgrow (&obstack_for_string, ref_tail_fields);
|
||||||
need_semicolon = true;
|
|
||||||
}
|
}
|
||||||
"@"{ref} {
|
"@"{ref} {
|
||||||
ref_tail_fields = NULL;
|
ref_tail_fields = NULL;
|
||||||
handle_action_at (self->rule, yytext, *loc);
|
handle_action_at (self->rule, yytext, *loc);
|
||||||
if (ref_tail_fields)
|
if (ref_tail_fields)
|
||||||
obstack_sgrow (&obstack_for_string, ref_tail_fields);
|
obstack_sgrow (&obstack_for_string, ref_tail_fields);
|
||||||
need_semicolon = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
";" STRING_GROW; need_semicolon = false;
|
|
||||||
"{" STRING_GROW; ++braces_level; need_semicolon = false;
|
|
||||||
"}" {
|
|
||||||
bool outer_brace = --braces_level == 0;
|
|
||||||
|
|
||||||
/* As an undocumented Bison extension, append ';' before the last
|
|
||||||
brace in braced code, so that the user code can omit trailing
|
|
||||||
';'. But do not append ';' if emulating Yacc, since Yacc does
|
|
||||||
not append one. This is deprecated since release 2.4.1. */
|
|
||||||
if (outer_brace && !yacc_flag && language_prio == default_prio
|
|
||||||
&& skeleton_prio == default_prio && need_semicolon && ! in_cpp)
|
|
||||||
{
|
|
||||||
unsigned int indent = 0;
|
|
||||||
complain_indent (loc, Wdeprecated, &indent,
|
|
||||||
_("a ';' might be needed at the end of action code"));
|
|
||||||
indent += SUB_INDENT;
|
|
||||||
complain_indent (loc, Wdeprecated | silent | no_caret, &indent,
|
|
||||||
_("future versions of Bison will not add the ';'"));
|
|
||||||
obstack_1grow (&obstack_for_string, ';');
|
|
||||||
}
|
|
||||||
|
|
||||||
STRING_GROW;
|
|
||||||
need_semicolon = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Preprocessing directives should only be recognized at the beginning
|
|
||||||
of lines, allowing whitespace including comments, but in C/C++,
|
|
||||||
'#' can only be the start of preprocessor directives or within
|
|
||||||
'#define' directives anyway, so don't bother with begin of line. */
|
|
||||||
"#" STRING_GROW; in_cpp = true;
|
|
||||||
|
|
||||||
{splice} STRING_GROW;
|
|
||||||
[\n\r] STRING_GROW; if (in_cpp) in_cpp = need_semicolon = false;
|
|
||||||
[ \t\f] STRING_GROW;
|
|
||||||
. STRING_GROW; need_semicolon = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
<SC_SYMBOL_ACTION>
|
<SC_SYMBOL_ACTION>
|
||||||
|
|||||||
109
tests/actions.at
109
tests/actions.at
@@ -1607,115 +1607,6 @@ AT_TEST([glr.cc])
|
|||||||
|
|
||||||
m4_popdef([AT_TEST])
|
m4_popdef([AT_TEST])
|
||||||
|
|
||||||
## ----------------------------------------------- ##
|
|
||||||
## Fix user actions without a trailing semicolon. ##
|
|
||||||
## ----------------------------------------------- ##
|
|
||||||
|
|
||||||
AT_SETUP([[Fix user actions without a trailing semicolon]])
|
|
||||||
|
|
||||||
# This feature is undocumented, but we accidentally broke it in 2.3a,
|
|
||||||
# and there was a complaint at:
|
|
||||||
# <http://lists.gnu.org/archive/html/bug-bison/2008-11/msg00001.html>.
|
|
||||||
AT_BISON_OPTION_PUSHDEFS
|
|
||||||
AT_DATA([input.y],
|
|
||||||
[[%%
|
|
||||||
start: test2 test1 test0 testc;
|
|
||||||
|
|
||||||
test2
|
|
||||||
: 'a' { semi; /* TEST:N:2 */ }
|
|
||||||
| 'b' { if (0) {no_semi} /* TEST:N:2 */ }
|
|
||||||
| 'c' { if (0) {semi;} /* TEST:N:2 */ }
|
|
||||||
| 'd' { semi; no_semi /* TEST:Y:2 */ }
|
|
||||||
| 'e' { semi(); no_semi() /* TEST:Y:2 */ }
|
|
||||||
| 'f' { semi[]; no_semi[] /* TEST:Y:2 */ }
|
|
||||||
| 'g' { semi++; no_semi++ /* TEST:Y:2 */ }
|
|
||||||
| 'h' { {no_semi} no_semi /* TEST:Y:2 */ }
|
|
||||||
| 'i' { {semi;} no_semi /* TEST:Y:2 */ }
|
|
||||||
;
|
|
||||||
test1
|
|
||||||
: 'a' { semi; // TEST:N:1 ;
|
|
||||||
} | 'b' { if (0) {no_semi} // TEST:N:1 ;
|
|
||||||
} | 'c' { if (0) {semi;} // TEST:N:1 ;
|
|
||||||
} | 'd' { semi; no_semi // TEST:Y:1 ;
|
|
||||||
} | 'e' { semi(); no_semi() // TEST:Y:1 ;
|
|
||||||
} | 'f' { semi[]; no_semi[] // TEST:Y:1 ;
|
|
||||||
} | 'g' { semi++; no_semi++ // TEST:Y:1 ;
|
|
||||||
} | 'h' { {no_semi} no_semi // TEST:Y:1 ;
|
|
||||||
} | 'i' { {semi;} no_semi // TEST:Y:1 ;
|
|
||||||
} ;
|
|
||||||
test0
|
|
||||||
: 'a' { semi; // TEST:N:1 {}
|
|
||||||
} | 'b' { if (0) {no_semi} // TEST:N:1 {}
|
|
||||||
} | 'c' { if (0) {semi;} // TEST:N:1 {}
|
|
||||||
} | 'd' { semi; no_semi // TEST:Y:1 {}
|
|
||||||
} | 'e' { semi(); no_semi() // TEST:Y:1 {}
|
|
||||||
} | 'f' { semi[]; no_semi[] // TEST:Y:1 {}
|
|
||||||
} | 'g' { semi++; no_semi++ // TEST:Y:1 {}
|
|
||||||
} | 'h' { {no_semi} no_semi // TEST:Y:1 {}
|
|
||||||
} | 'i' { {semi;} no_semi // TEST:Y:1 {}
|
|
||||||
} ;
|
|
||||||
|
|
||||||
testc
|
|
||||||
: 'a' {
|
|
||||||
#define TEST_MACRO_N \
|
|
||||||
[]"broken\" $ @ $$ @$ [];\
|
|
||||||
string;"}
|
|
||||||
| 'b' {
|
|
||||||
no_semi
|
|
||||||
#define TEST_MACRO_N \
|
|
||||||
[]"broken\" $ @ $$ @$ [];\
|
|
||||||
string;"}
|
|
||||||
]])
|
|
||||||
AT_BISON_OPTION_POPDEFS
|
|
||||||
|
|
||||||
AT_BISON_CHECK([[-o input.c input.y]], [0], [],
|
|
||||||
[[input.y:8.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:8.48: future versions of Bison will not add the ';'
|
|
||||||
input.y:9.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:9.48: future versions of Bison will not add the ';'
|
|
||||||
input.y:10.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:10.48: future versions of Bison will not add the ';'
|
|
||||||
input.y:11.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:11.48: future versions of Bison will not add the ';'
|
|
||||||
input.y:12.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:12.48: future versions of Bison will not add the ';'
|
|
||||||
input.y:13.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:13.48: future versions of Bison will not add the ';'
|
|
||||||
input.y:20.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:20.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:21.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:21.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:22.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:22.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:23.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:23.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:24.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:24.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:25.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:25.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:31.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:31.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:32.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:32.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:33.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:33.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:34.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:34.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:35.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:35.1: future versions of Bison will not add the ';'
|
|
||||||
input.y:36.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
|
|
||||||
input.y:36.1: future versions of Bison will not add the ';'
|
|
||||||
]])
|
|
||||||
|
|
||||||
AT_MATCHES_CHECK([input.c], [[/\* TEST:N:2 \*/ \}$]], [[3]])
|
|
||||||
AT_MATCHES_CHECK([input.c], [[/\* TEST:Y:2 \*/ ;\}$]], [[6]])
|
|
||||||
AT_MATCHES_CHECK([input.c], [[// TEST:N:1 [;{}]*\n\}$]], [[6]])
|
|
||||||
AT_MATCHES_CHECK([input.c], [[// TEST:Y:1 [;{}]*\n;\}$]], [[12]])
|
|
||||||
AT_MATCHES_CHECK([input.c], [[#define TEST_MACRO_N \\\n\[\]"broken\\" \$ \@ \$\$ \@\$ \[\];\\\nstring;"\}]], [[2]])
|
|
||||||
|
|
||||||
AT_CLEANUP
|
|
||||||
|
|
||||||
|
|
||||||
## -------------------------------------------------- ##
|
## -------------------------------------------------- ##
|
||||||
## Destroying lookahead assigned by semantic action. ##
|
## Destroying lookahead assigned by semantic action. ##
|
||||||
## -------------------------------------------------- ##
|
## -------------------------------------------------- ##
|
||||||
|
|||||||
Reference in New Issue
Block a user