X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/91a2af97537949caab7fd8fdb330eb92401f390c..c826013fb38c98861ef0fc5d4dc3fb3fb4f555be:/src/scan-gram.l diff --git a/src/scan-gram.l b/src/scan-gram.l index a6bd5e2f..52762508 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -1,7 +1,6 @@ /* Bison Grammar Scanner -*- C -*- - Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 - Free Software Foundation, Inc. + Copyright (C) 2002-2010 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -18,7 +17,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -%option debug nodefault nounput noyywrap never-interactive +%option debug nodefault noinput nounput noyywrap never-interactive %option prefix="gram_" outfile="lex.yy.c" %{ @@ -37,6 +36,7 @@ #include #include +#include #include #include @@ -55,10 +55,16 @@ static boundary scanner_cursor; static size_t no_cr_read (FILE *, char *, size_t); #define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size)) -#define RETURN_PERCENT_FLAG(Value) \ +#define RETURN_PERCENT_PARAM(Value) \ + RETURN_VALUE(PERCENT_PARAM, param, param_ ## Value) + +#define RETURN_PERCENT_FLAG(Value) \ + RETURN_VALUE(PERCENT_FLAG, uniqstr, uniqstr_new (Value)) + +#define RETURN_VALUE(Token, Field, Value) \ do { \ - val->uniqstr = uniqstr_new (Value); \ - return PERCENT_FLAG; \ + val->Field = Value; \ + return Token; \ } while (0) #define ROLLBACK_CURRENT_TOKEN \ @@ -203,7 +209,7 @@ splice (\\[ \f\t\v]*\n)* "%glr-parser" return PERCENT_GLR_PARSER; "%language" return PERCENT_LANGUAGE; "%left" return PERCENT_LEFT; - "%lex-param" return PERCENT_LEX_PARAM; + "%lex-param" RETURN_PERCENT_PARAM(lex); "%locations" RETURN_PERCENT_FLAG("locations"); "%merge" return PERCENT_MERGE; "%name"[-_]"prefix" return PERCENT_NAME_PREFIX; @@ -213,7 +219,8 @@ splice (\\[ \f\t\v]*\n)* "%nondeterministic-parser" return PERCENT_NONDETERMINISTIC_PARSER; "%nterm" return PERCENT_NTERM; "%output" return PERCENT_OUTPUT; - "%parse-param" return PERCENT_PARSE_PARAM; + "%param" RETURN_PERCENT_PARAM(both); + "%parse-param" RETURN_PERCENT_PARAM(parse); "%prec" return PERCENT_PREC; "%precedence" return PERCENT_PRECEDENCE; "%printer" return PERCENT_PRINTER; @@ -261,7 +268,7 @@ splice (\\[ \f\t\v]*\n)* } /* Characters. */ - "'" STRING_GROW; token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; + "'" token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; /* Strings. */ "\"" token_start = loc->start; BEGIN SC_ESCAPED_STRING; @@ -493,16 +500,18 @@ splice (\\[ \f\t\v]*\n)* { "'"|"\n" { - STRING_GROW; STRING_FINISH; loc->start = token_start; - val->character = last_string[1]; + val->character = last_string[0]; { /* FIXME: Eventually, make these errors. */ - size_t length = strlen (last_string); - if (length < 3) - warn_at (*loc, _("empty character literal")); - else if (length > 3) + if (last_string[0] == '\0') + { + warn_at (*loc, _("empty character literal")); + /* '\0' seems dangerous even if we are about to complain. */ + val->character = '\''; + } + else if (last_string[1] != '\0') warn_at (*loc, _("extra characters in character literal")); } if (yytext[0] == '\n') @@ -514,17 +523,17 @@ splice (\\[ \f\t\v]*\n)* <> { STRING_FINISH; loc->start = token_start; + val->character = last_string[0]; { - size_t length = strlen (last_string); /* FIXME: Eventually, make these errors. */ - if (length < 2) - warn_at (*loc, _("empty character literal")); - else if (length > 2) + if (last_string[0] == '\0') + { + warn_at (*loc, _("empty character literal")); + /* '\0' seems dangerous even if we are about to complain. */ + val->character = '\''; + } + else if (last_string[1] != '\0') warn_at (*loc, _("extra characters in character literal")); - if (length > 1) - val->character = last_string[1]; - else - val->character = last_string[0]; } unexpected_eof (token_start, "'"); STRING_FREE; @@ -576,10 +585,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); } @@ -587,10 +595,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); } @@ -608,16 +615,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); } }