]> git.saurik.com Git - bison.git/blobdiff - src/scan-code.l
remove useless variable.
[bison.git] / src / scan-code.l
index b54f4c9a2d1fbc8109eaf45dc2415221ab86208d..88f899021b6315065e137efd60dfa417f52e8c22 100644 (file)
@@ -1,12 +1,12 @@
 /* Bison Action Scanner                             -*- C -*-
 
-   Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
-   This program is free software; you can redistribute it and/or modify
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301  USA
-*/
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 %option debug nodefault nounput noyywrap never-interactive
 %option prefix="code_" outfile="lex.yy.c"
 #define code_wrap() 1
 
 #define FLEX_PREFIX(Id) code_ ## Id
-#include "flex-scanner.h"
+#include <src/flex-scanner.h>
 
-#include "complain.h"
-#include "reader.h"
-#include "getargs.h"
+#include <src/complain.h>
+#include <src/reader.h>
+#include <src/getargs.h>
 #include <get-errno.h>
 #include <quote.h>
-
-#include "scan-code.h"
-#include "symlist.h"
+#include <src/muscle-tab.h>
+#include <src/scan-code.h>
+#include <src/symlist.h>
 
 /* The current calling start condition: SC_RULE_ACTION or
    SC_SYMBOL_ACTION. */
@@ -84,6 +81,19 @@ splice        (\\[ \f\t\v]*\n)*
   /* 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 direcive, but don't bother.  */
+  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
      is expected to return only once.  This initialization is
      therefore done once per action to translate. */
@@ -138,10 +148,12 @@ splice     (\\[ \f\t\v]*\n)*
   "'" {
     STRING_GROW;
     BEGIN SC_CHARACTER;
+    need_semicolon = true;
   }
   "\"" {
     STRING_GROW;
     BEGIN SC_STRING;
+    need_semicolon = true;
   }
   "/"{splice}"*" {
     STRING_GROW;
@@ -157,43 +169,63 @@ splice     (\\[ \f\t\v]*\n)*
 {
   "$"("<"{tag}">")?(-?[0-9]+|"$")  {
     handle_action_dollar (self->rule, yytext, *loc);
+    need_semicolon = true;
   }
   "@"(-?[0-9]+|"$") {
     handle_action_at (self->rule, yytext, *loc);
+    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; ++braces_level;
+  ";"  STRING_GROW;                 need_semicolon = false;
+  "{"  STRING_GROW; ++braces_level; need_semicolon = false;
   "}"  {
-    bool outer_brace = --braces_level < 0;
+    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.
-
-       FIXME: Bison should warn if a semicolon seems to be necessary
-       here, and should omit the semicolon if it seems unnecessary
-       (e.g., after ';', '{', or '}', each followed by comments or
-       white space).  Such a warning shouldn't depend on --yacc; it
-       should depend on a new --pedantic option, which would cause
-       Bison to warn if it detects an extension to POSIX.  --pedantic
-       should also diagnose other Bison extensions like %yacc.
-       Perhaps there should also be a GCC-style --pedantic-errors
-       option, so that such warnings are diagnosed as errors.  */
-    if (outer_brace && ! yacc_flag)
-      obstack_1grow (&obstack_for_string, ';');
+       not append one.  */
+    if (outer_brace && !yacc_flag && language_prio == default_prio
+        && skeleton_prio == default_prio && need_semicolon && ! in_cpp)
+      {
+       warn_at (*loc, _("a `;' might be needed at the end of action code"));
+       warn_at (*loc, _("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>
@@ -202,7 +234,10 @@ splice      (\\[ \f\t\v]*\n)*
     obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar[");
     self->is_value_used = true;
   }
-  "@$"   obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
+  "@$" {
+    obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
+    muscle_percent_define_ensure("locations", the_location, true);
+  }
 }
 
 
@@ -356,7 +391,7 @@ handle_action_at (symbol_list *rule, char *text, location at_loc)
      ? rule->midrule_parent_rhs_index - 1
      : symbol_list_length (rule->next));
 
-  locations_flag = true;
+  muscle_percent_define_ensure("locations", at_loc, true);
 
   if (*cp == '$')
     obstack_sgrow (&obstack_for_string, "]b4_lhs_location[");