X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f9bfc42aa704603fc3aeb18be00c78871569a0b4..9ca7f077a0a5ecdd00c5945c7a7bd3cf46e23c13:/src/scan-gram.l?ds=sidebyside diff --git a/src/scan-gram.l b/src/scan-gram.l index 8193ddf2..697f52f0 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 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,10 +16,7 @@ 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 . */ %option debug nodefault nounput noyywrap never-interactive %option prefix="gram_" outfile="lex.yy.c" @@ -58,7 +56,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) @@ -66,10 +64,6 @@ gram_scanner_last_string_free (void) STRING_FREE; } -/* The location of the most recently saved token, if it was a - BRACED_CODE token; otherwise, this has an unspecified value. */ -location gram_last_braced_code_loc; - static void handle_syncline (char *, location); static unsigned long int scan_integer (char const *p, int base, location loc); static int convert_ucn_to_byte (char const *hex_text); @@ -160,16 +154,14 @@ splice (\\[ \f\t\v]*\n)* `----------------------------*/ { - "%after-header" return PERCENT_AFTER_HEADER; - "%before-header" return PERCENT_BEFORE_HEADER; "%binary" return PERCENT_NONASSOC; + "%code" return PERCENT_CODE; "%debug" return PERCENT_DEBUG; "%default"[-_]"prec" return PERCENT_DEFAULT_PREC; "%define" return PERCENT_DEFINE; "%defines" return PERCENT_DEFINES; "%destructor" return PERCENT_DESTRUCTOR; "%dprec" return PERCENT_DPREC; - "%end-header" return PERCENT_END_HEADER; "%error"[-_]"verbose" return PERCENT_ERROR_VERBOSE; "%expect" return PERCENT_EXPECT; "%expect"[-_]"rr" return PERCENT_EXPECT_RR; @@ -177,6 +169,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; @@ -196,7 +189,6 @@ splice (\\[ \f\t\v]*\n)* "%right" return PERCENT_RIGHT; "%skeleton" return PERCENT_SKELETON; "%start" return PERCENT_START; - "%start-header" return PERCENT_START_HEADER; "%term" return PERCENT_TOKEN; "%token" return PERCENT_TOKEN; "%token"[-_]"table" return PERCENT_TOKEN_TABLE; @@ -212,6 +204,8 @@ splice (\\[ \f\t\v]*\n)* "=" return EQUAL; "|" return PIPE; ";" return SEMICOLON; + "<*>" return TYPE_TAG_ANY; + "<>" return TYPE_TAG_NONE; {id} { val->uniqstr = uniqstr_new (yytext); @@ -340,15 +334,23 @@ splice (\\[ \f\t\v]*\n)* { - "\"" { + "\""|"\n" { + if (yytext[0] == '\n') + unexpected_newline (token_start, "\""); + STRING_FINISH; + loc->start = token_start; + val->chars = last_string; + BEGIN INITIAL; + return STRING; + } + <> { + unexpected_eof (token_start, "\""); STRING_FINISH; loc->start = token_start; val->chars = last_string; BEGIN INITIAL; return STRING; } - \n unexpected_newline (token_start, "\""); BEGIN INITIAL; - <> unexpected_eof (token_start, "\""); BEGIN INITIAL; } /*----------------------------------------------------------. @@ -358,7 +360,9 @@ splice (\\[ \f\t\v]*\n)* { - "'" { + "'"|"\n" { + if (yytext[0] == '\n') + unexpected_newline (token_start, "'"); STRING_GROW; STRING_FINISH; loc->start = token_start; @@ -367,8 +371,18 @@ splice (\\[ \f\t\v]*\n)* BEGIN INITIAL; return CHAR; } - \n unexpected_newline (token_start, "'"); BEGIN INITIAL; - <> unexpected_eof (token_start, "'"); BEGIN INITIAL; + <> { + unexpected_eof (token_start, "'"); + STRING_FINISH; + loc->start = token_start; + if (strlen(last_string) > 1) + val->character = last_string[1]; + else + val->character = last_string[0]; + STRING_FREE; + BEGIN INITIAL; + return CHAR; + } } @@ -504,8 +518,7 @@ splice (\\[ \f\t\v]*\n)* { STRING_FINISH; loc->start = code_start; - val->chars = last_string; - gram_last_braced_code_loc = *loc; + val->code = last_string; BEGIN INITIAL; return BRACED_CODE; } @@ -515,7 +528,14 @@ splice (\\[ \f\t\v]*\n)* (as `<' `<%'). */ "<"{splice}"<" STRING_GROW; - <> unexpected_eof (code_start, "}"); BEGIN INITIAL; + <> { + unexpected_eof (code_start, "}"); + STRING_FINISH; + loc->start = code_start; + val->code = last_string; + BEGIN INITIAL; + return BRACED_CODE; + } } @@ -533,7 +553,14 @@ splice (\\[ \f\t\v]*\n)* return PROLOGUE; } - <> unexpected_eof (code_start, "%}"); BEGIN INITIAL; + <> { + unexpected_eof (code_start, "%}"); + STRING_FINISH; + loc->start = code_start; + val->chars = last_string; + BEGIN INITIAL; + return PROLOGUE; + } } @@ -768,5 +795,5 @@ gram_scanner_free (void) { obstack_free (&obstack_for_string, 0); /* Reclaim Flex's buffers. */ - yy_delete_buffer (YY_CURRENT_BUFFER); + yylex_destroy (); }