From 263137264fa5e5a9fb03bc75f941c14bedfe47c4 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 27 Jul 2012 11:22:22 +0200 Subject: [PATCH] factor the handling of m4 escaping The conversion from @ to @@ and so forth is coded is too many different places. Factor, a bit. * src/scan-code.l: Instead of duplicating the logic of obstack_escape, use it. It sure is less efficient, but the cost is negligible. This allows to factor rules that are alike. And to factor some start-condition clauses. * tests/input.at (Stray $ or @): New. * NEWS: Document it. --- NEWS | 6 +++++ src/scan-code.l | 58 +++++++++++++++++-------------------------------- tests/input.at | 30 +++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/NEWS b/NEWS index 5a9d314a..b62aac6d 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,12 @@ GNU Bison NEWS *** glr.cc: set_debug_level and debug_level work as expected. +*** Stray @ or $ in actions + + While Bison used to warn about stray $ or @ in action rules, it did not + for other actions such as printers, destructors, or initial actions. It + now does. + ** Type names in printers and destructors For consistency with rule actions, it is now possible to qualify $$ by a diff --git a/src/scan-code.l b/src/scan-code.l index 31b44298..31befe91 100644 --- a/src/scan-code.l +++ b/src/scan-code.l @@ -103,7 +103,10 @@ ref -?[0-9]+|{id}|"["{id}"]"|"$" ';', 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. */ + 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 @@ -181,6 +184,15 @@ ref -?[0-9]+|{id}|"["{id}"]"|"$" STRING_GROW; BEGIN SC_LINE_COMMENT; } + [$@] { + warn_at (*loc, _("stray '%s'"), yytext); + obstack_escape (&obstack_for_string, yytext); + need_semicolon = true; + } + [\[\]] { + obstack_escape (&obstack_for_string, yytext); + need_semicolon = true; + } } @@ -199,24 +211,6 @@ ref -?[0-9]+|{id}|"["{id}"]"|"$" obstack_sgrow (&obstack_for_string, ref_tail_fields); need_semicolon = true; } - "$" { - warn_at (*loc, _("stray '$'")); - obstack_sgrow (&obstack_for_string, "$]["); - need_semicolon = true; - } - "@" { - warn_at (*loc, _("stray '@'")); - obstack_sgrow (&obstack_for_string, "@@"); - need_semicolon = true; - } - "[" { - obstack_sgrow (&obstack_for_string, "@{"); - need_semicolon = true; - } - "]" { - obstack_sgrow (&obstack_for_string, "@}"); - need_semicolon = true; - } ";" STRING_GROW; need_semicolon = false; "{" STRING_GROW; ++braces_level; need_semicolon = false; @@ -281,29 +275,17 @@ ref -?[0-9]+|{id}|"["{id}"]"|"$" } - /*-----------------------------------------. - | Escape M4 quoting characters in C code. | - `-----------------------------------------*/ - <*> { - \$ obstack_sgrow (&obstack_for_string, "$]["); - \@ obstack_sgrow (&obstack_for_string, "@@"); - \[ obstack_sgrow (&obstack_for_string, "@{"); - \] obstack_sgrow (&obstack_for_string, "@}"); -} + /* Escape M4 quoting characters in C code. */ + [$@\[\]] obstack_escape (&obstack_for_string, yytext); - /*-----------------------------------------------------. - | By default, grow the string obstack with the input. | - `-----------------------------------------------------*/ + /* By default, grow the string obstack with the input. */ + .|\n STRING_GROW; -<*>.|\n STRING_GROW; - - /* End of processing. */ -<*><> { - STRING_FINISH; - return last_string; - } + /* End of processing. */ + <> STRING_FINISH; return last_string; +} %% diff --git a/tests/input.at b/tests/input.at index 82d97f53..6b90b21e 100644 --- a/tests/input.at +++ b/tests/input.at @@ -1371,6 +1371,36 @@ m4_popdef([AT_TEST]) AT_CLEANUP +## -------------- ## +## Stray $ or @. ## +## -------------- ## + +AT_SETUP([[Stray $ or @]]) + +AT_DATA_GRAMMAR([[input.y]], +[[%token TOK +%destructor { $%; @%; } <*>; +%initial-action { $%; @%; }; +%printer { $%; @%; } <*>; +%% +exp: TOK { $%; @%; }; +]]) + +AT_BISON_CHECK([[input.y]], 0, [], +[[input.y:10.19: warning: stray '$' +input.y:10.23: warning: stray '@' +input.y:11.19: warning: stray '$' +input.y:11.23: warning: stray '@' +input.y:12.19: warning: stray '$' +input.y:12.23: warning: stray '@' +input.y:14.19: warning: stray '$' +input.y:14.23: warning: stray '@' +]]) + +AT_CLEANUP + + + ## ---------------- ## ## Code injection. ## ## ---------------- ## -- 2.45.2