X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/eb095650011f68858e877e3590f6901bc79ba668..7aaf9ce7582bb4fe33f29c9f2a137f2c774b05f1:/src/scan-gram.l

diff --git a/src/scan-gram.l b/src/scan-gram.l
index 6fa9f220..ee9f1174 100644
--- a/src/scan-gram.l
+++ b/src/scan-gram.l
@@ -1,12 +1,13 @@
 /* Bison Grammar Scanner                             -*- C -*-
 
-   Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 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,
@@ -15,12 +16,9 @@
    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 debug nodefault noinput nounput noyywrap never-interactive
 %option prefix="gram_" outfile="lex.yy.c"
 
 %{
@@ -39,6 +37,7 @@
 #include "reader.h"
 #include "uniqstr.h"
 
+#include <ctype.h>
 #include <mbswidth.h>
 #include <quote.h>
 
@@ -58,7 +57,7 @@ static size_t no_cr_read (FILE *, char *, size_t);
 #define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size))
 
 /* A string representing the most recently saved token.  */
-char *last_string;
+static char *last_string;
 
 void
 gram_scanner_last_string_free (void)
@@ -158,7 +157,6 @@ splice	 (\\[ \f\t\v]*\n)*
 {
   "%binary"               	    return PERCENT_NONASSOC;
   "%code"                           return PERCENT_CODE;
-  "%code-top"                       return PERCENT_CODE_TOP;
   "%debug"                	    return PERCENT_DEBUG;
   "%default"[-_]"prec"    	    return PERCENT_DEFAULT_PREC;
   "%define"               	    return PERCENT_DEFINE;
@@ -172,6 +170,7 @@ splice	 (\\[ \f\t\v]*\n)*
   "%fixed"[-_]"output"[-_]"files"   return PERCENT_YACC;
   "%initial-action"       	    return PERCENT_INITIAL_ACTION;
   "%glr-parser"           	    return PERCENT_GLR_PARSER;
+  "%language"                 	    return PERCENT_LANGUAGE;
   "%left"                 	    return PERCENT_LEFT;
   "%lex-param"		  	    return PERCENT_LEX_PARAM;
   "%locations"            	    return PERCENT_LOCATIONS;
@@ -186,11 +185,8 @@ splice	 (\\[ \f\t\v]*\n)*
   "%parse-param"	  	    return PERCENT_PARSE_PARAM;
   "%prec"                 	    return PERCENT_PREC;
   "%printer"              	    return PERCENT_PRINTER;
-  "%provides"                       return PERCENT_PROVIDES;
   "%pure"[-_]"parser"     	    return PERCENT_PURE_PARSER;
-  "%push"[-_]"parser"		    return PERCENT_PUSH_PARSER;
   "%require"              	    return PERCENT_REQUIRE;
-  "%requires"                       return PERCENT_REQUIRES;
   "%right"                	    return PERCENT_RIGHT;
   "%skeleton"             	    return PERCENT_SKELETON;
   "%start"                	    return PERCENT_START;
@@ -210,7 +206,7 @@ splice	 (\\[ \f\t\v]*\n)*
   "|"                     return PIPE;
   ";"                     return SEMICOLON;
   "<*>"                   return TYPE_TAG_ANY;
-  "<!>"                   return TYPE_TAG_NONE;
+  "<>"                    return TYPE_TAG_NONE;
 
   {id} {
     val->uniqstr = uniqstr_new (yytext);
@@ -404,10 +400,9 @@ splice	 (\\[ \f\t\v]*\n)*
 {
   \\[0-7]{1,3} {
     unsigned long int c = strtoul (yytext + 1, NULL, 8);
-    if (UCHAR_MAX < c)
-      complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext));
-    else if (! c)
-      complain_at (*loc, _("invalid null character: %s"), quote (yytext));
+    if (!c || UCHAR_MAX < c)
+      complain_at (*loc, _("invalid number after \\-escape: %s"),
+                   yytext+1);
     else
       obstack_1grow (&obstack_for_string, c);
   }
@@ -415,10 +410,9 @@ splice	 (\\[ \f\t\v]*\n)*
   \\x[0-9abcdefABCDEF]+ {
     verify (UCHAR_MAX < ULONG_MAX);
     unsigned long int c = strtoul (yytext + 2, NULL, 16);
-    if (UCHAR_MAX < c)
-      complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext));
-    else if (! c)
-      complain_at (*loc, _("invalid null character: %s"), quote (yytext));
+    if (!c || UCHAR_MAX < c)
+      complain_at (*loc, _("invalid number after \\-escape: %s"),
+                   yytext+1);
     else
       obstack_1grow (&obstack_for_string, c);
   }
@@ -436,16 +430,20 @@ splice	 (\\[ \f\t\v]*\n)*
 
   \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
     int c = convert_ucn_to_byte (yytext);
-    if (c < 0)
-      complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext));
-    else if (! c)
-      complain_at (*loc, _("invalid null character: %s"), quote (yytext));
+    if (c <= 0)
+      complain_at (*loc, _("invalid number after \\-escape: %s"),
+                   yytext+1);
     else
       obstack_1grow (&obstack_for_string, c);
   }
   \\(.|\n)	{
-    complain_at (*loc, _("unrecognized escape sequence: %s"), quote (yytext));
-    STRING_GROW;
+    char const *p = yytext + 1;
+    /* Quote only if escaping won't make the character visible.  */
+    if (isspace ((unsigned char) *p) && isprint ((unsigned char) *p))
+      p = quote (p);
+    else
+      p = quotearg_style_mem (escape_quoting_style, p, 1);
+    complain_at (*loc, _("invalid character after \\-escape: %s"), p);
   }
 }
 
@@ -800,5 +798,5 @@ gram_scanner_free (void)
 {
   obstack_free (&obstack_for_string, 0);
   /* Reclaim Flex's buffers.  */
-  yy_delete_buffer (YY_CURRENT_BUFFER);
+  yylex_destroy ();
 }