]> git.saurik.com Git - bison.git/blobdiff - src/scan-gram.l
* tests/actions.at (AT_CHECK_PRINTER_AND_DESTRUCTOR): New.
[bison.git] / src / scan-gram.l
index ad20026711ceb298f850a16789b57c81771f6c9a..4e2e194254d5f186559141c8e7e23947f1a5680e 100644 (file)
@@ -27,6 +27,7 @@
 #include "mbswidth.h"
 #include "complain.h"
 #include "quote.h"
+#include "struniq.h"
 #include "getargs.h"
 #include "gram.h"
 #include "reader.h"
@@ -35,7 +36,7 @@
 #define YY_USER_INIT                           \
 do {                                           \
   LOCATION_RESET (*yylloc);                    \
-  yylloc->file = infile;                       \
+  yylloc->file = current_file;                 \
    /* This is only to avoid GCC warnings. */   \
   if (yycontrol) {;};                          \
 } while (0)
@@ -141,6 +142,10 @@ extend_location (location_t *loc, char const *token, int size)
 
 static struct obstack string_obstack;
 
+/* A string representing the most recently saved token.  */
+static char *last_string;
+
+
 #define YY_OBS_GROW   \
   obstack_grow (&string_obstack, yytext, yyleng)
 
@@ -153,6 +158,11 @@ static struct obstack string_obstack;
 #define YY_OBS_FREE \
   obstack_free (&string_obstack, last_string)
 
+void
+scanner_last_string_free (void)
+{
+  YY_OBS_FREE;
+}
 
 /* Within well-formed rules, RULE_LENGTH is the number of values in
    the current rule so far, which says where to find `$0' with respect
@@ -168,7 +178,7 @@ static void handle_at (braced_code_t code_kind,
                       char *cp, location_t location);
 static void handle_syncline (char *args, location_t *location);
 static int convert_ucn_to_byte (char const *hex_text);
-static void unexpected_end_of_file (location_t, char const *);
+static void unexpected_end_of_file (location_t *, char const *);
 
 %}
 %x SC_COMMENT SC_LINE_COMMENT SC_YACC_COMMENT
@@ -198,9 +208,6 @@ splice       (\\[ \f\t\v]*\n)*
   /* Scanner context when scanning C code.  */
   int c_context IF_LINT (= 0);
 
-  /* A string representing the most recently saved token.  */
-  char *last_string;
-
   /* At each yylex invocation, mark the current position as the
      start of the next token.  */
   YY_STEP;
@@ -301,7 +308,8 @@ splice       (\\[ \f\t\v]*\n)*
   "<"{tag}">" {
     obstack_grow (&string_obstack, yytext + 1, yyleng - 2);
     YY_OBS_FINISH;
-    yylval->string = last_string;
+    yylval->struniq = struniq_new (last_string);
+    YY_OBS_FREE;
     return TYPE;
   }
 
@@ -331,7 +339,7 @@ splice       (\\[ \f\t\v]*\n)*
   }
 
   .|\n    ;
-  <<EOF>>  unexpected_end_of_file (*yylloc, "*/");
+  <<EOF>>  unexpected_end_of_file (yylloc, "*/");
 }
 
 
@@ -342,7 +350,7 @@ splice       (\\[ \f\t\v]*\n)*
 <SC_COMMENT>
 {
   "*"{splice}"/"  YY_OBS_GROW; BEGIN c_context;
-  <<EOF>>        unexpected_end_of_file (*yylloc, "*/");
+  <<EOF>>        unexpected_end_of_file (yylloc, "*/");
 }
 
 
@@ -375,7 +383,7 @@ splice       (\\[ \f\t\v]*\n)*
   }
 
   .|\n     YY_OBS_GROW;
-  <<EOF>>   unexpected_end_of_file (*yylloc, "\"");
+  <<EOF>>   unexpected_end_of_file (yylloc, "\"");
 }
 
   /*---------------------------------------------------------------.
@@ -399,7 +407,7 @@ splice       (\\[ \f\t\v]*\n)*
   }
 
   .|\n     YY_OBS_GROW;
-  <<EOF>>   unexpected_end_of_file (*yylloc, "'");
+  <<EOF>>   unexpected_end_of_file (yylloc, "'");
 }
 
 
@@ -469,10 +477,9 @@ splice      (\\[ \f\t\v]*\n)*
 
 <SC_CHARACTER>
 {
-  "'"                 YY_OBS_GROW; BEGIN c_context;
-  \\{splice}[^\[\]]    YY_OBS_GROW;
-  {splice}            YY_OBS_GROW;
-  <<EOF>>             unexpected_end_of_file (*yylloc, "'");
+  "'"              YY_OBS_GROW; BEGIN c_context;
+  \\{splice}[\'\\]  YY_OBS_GROW;
+  <<EOF>>          unexpected_end_of_file (yylloc, "'");
 }
 
 
@@ -483,10 +490,9 @@ splice      (\\[ \f\t\v]*\n)*
 
 <SC_STRING>
 {
-  "\""                YY_OBS_GROW; BEGIN c_context;
-  \\{splice}[^\[\]]    YY_OBS_GROW;
-  {splice}            YY_OBS_GROW;
-  <<EOF>>             unexpected_end_of_file (*yylloc, "\"");
+  "\""             YY_OBS_GROW; BEGIN c_context;
+  \\{splice}[\"\\]  YY_OBS_GROW;
+  <<EOF>>          unexpected_end_of_file (yylloc, "\"");
 }
 
 
@@ -534,7 +540,7 @@ splice       (\\[ \f\t\v]*\n)*
   "@"(-?[0-9]+|"$")               { handle_at (current_braced_code,
                                               yytext, *yylloc); }
 
-  <<EOF>>  unexpected_end_of_file (*yylloc, "}");
+  <<EOF>>  unexpected_end_of_file (yylloc, "}");
 }
 
 
@@ -551,7 +557,7 @@ splice       (\\[ \f\t\v]*\n)*
     return PROLOGUE;
   }
 
-  <<EOF>>  unexpected_end_of_file (*yylloc, "%}");
+  <<EOF>>  unexpected_end_of_file (yylloc, "%}");
 }
 
 
@@ -578,8 +584,10 @@ splice      (\\[ \f\t\v]*\n)*
 
 <SC_COMMENT,SC_LINE_COMMENT,SC_STRING,SC_CHARACTER,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>
 {
-  \[   obstack_sgrow (&string_obstack, "@<:@");
-  \]   obstack_sgrow (&string_obstack, "@:>@");
+  \$   obstack_sgrow (&string_obstack, "$][");
+  \@   obstack_sgrow (&string_obstack, "@@");
+  \[   obstack_sgrow (&string_obstack, "@{");
+  \]   obstack_sgrow (&string_obstack, "@}");
   .|\n  YY_OBS_GROW;
 }
 
@@ -827,10 +835,8 @@ handle_syncline (char *args, location_t *location)
   const char *file = NULL;
   file = strchr (args, '"') + 1;
   *strchr (file, '"') = 0;
-  /* FIXME: Leaking...  Can't free, as some locations are still
-     pointing to the old file name.  */
-  infile = xstrdup (file);
-  location->file = infile;
+  current_file = xstrdup (file);
+  location->file = current_file;
   location->last_line = lineno;
 }
 
@@ -842,13 +848,18 @@ handle_syncline (char *args, location_t *location)
 `-------------------------------------------------------------*/
 
 static void
-unexpected_end_of_file (location_t loc, char const *token_end)
+unexpected_end_of_file (location_t *loc, char const *token_end)
 {
-  size_t i;
+  size_t i = strlen (token_end);
+
+  complain_at (*loc, _("missing `%s' at end of file"), token_end);
+
+  /* Adjust location's last column so that any later message does not
+     mention the characters just inserted.  */
+  loc->last_column -= i;
 
-  complain_at (loc, _("missing `%s' at end of file"), token_end);
-  for (i = strlen (token_end); i != 0; i--)
-    unput (token_end[i - 1]);
+  while (i != 0)
+    unput (token_end[--i]);
 }