1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Bison Grammar Scanner -*- C -*- 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Copyright (C) 2002-2012 Free Software Foundation, Inc. 4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This file is part of Bison, the GNU Compiler Compiler. 6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is free software: you can redistribute it and/or modify 8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project it under the terms of the GNU General Public License as published by 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang the Free Software Foundation, either version 3 of the License, or 10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (at your option) any later version. 11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This program is distributed in the hope that it will be useful, 13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GNU General Public License for more details. 16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project You should have received a copy of the GNU General Public License 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang%option debug nodefault noinput nounput noyywrap never-interactive 21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%option prefix="gram_" outfile="lex.yy.c" 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%{ 24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Work around a bug in flex 2.5.31. See Debian bug 333231 25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */ 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#undef gram_wrap 27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define gram_wrap() 1 28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define FLEX_PREFIX(Id) gram_ ## Id 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "flex-scanner.h" 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "complain.h" 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "files.h" 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h" 35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "quotearg.h" 36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h" 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "uniqstr.h" 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <c-ctype.h> 4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <mbswidth.h> 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <quote.h> 4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "scan-gram.h" 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define YY_DECL GRAM_LEX_DECL 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define YY_USER_INIT \ 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang code_start = scanner_cursor = loc->start; \ 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Location of scanner cursor. */ 5105436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic boundary scanner_cursor; 52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define YY_USER_ACTION location_compute (loc, &scanner_cursor, yytext, yyleng); 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic size_t no_cr_read (FILE *, char *, size_t); 56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size)) 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define ROLLBACK_CURRENT_TOKEN \ 5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang do { \ 6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0); \ 6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang yyless (0); \ 6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } while (0) 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* A string representing the most recently saved token. */ 6505436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic char *last_string; 66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Bracketed identifier. */ 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic uniqstr bracketed_id_str = 0; 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic location bracketed_id_loc; 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic boundary bracketed_id_start; 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic int bracketed_id_context_state = 0; 72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wanggram_scanner_last_string_free (void) 75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FREE; 77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void handle_syncline (char *, location); 80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic unsigned long int scan_integer (char const *p, int base, location loc); 81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic int convert_ucn_to_byte (char const *hex_text); 82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void unexpected_eof (boundary, char const *); 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void unexpected_newline (boundary, char const *); 84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%} 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* A C-like comment in directives/rules. */ 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang%x SC_YACC_COMMENT 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Strings and characters in directives/rules. */ 89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%x SC_ESCAPED_STRING SC_ESCAPED_CHARACTER 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* A identifier was just read in directives/rules. Special state 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang to capture the sequence 'identifier :'. */ 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang%x SC_AFTER_IDENTIFIER 93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Three types of user code: 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang - prologue (code between '%{' '%}' in the first section, before %%); 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang - actions, printers, union, etc, (between braced in the middle section); 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang - epilogue (everything after the second %%). */ 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang%x SC_PROLOGUE SC_BRACED_CODE SC_EPILOGUE 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* C and C++ comments in code. */ 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang%x SC_COMMENT SC_LINE_COMMENT 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Strings and characters in code. */ 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang%x SC_STRING SC_CHARACTER 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Bracketed identifiers support. */ 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang%x SC_BRACKETED_ID SC_RETURN_BRACKETED_ID 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wangletter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_] 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wangnotletter [^.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]{-}[%\{] 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wangid {letter}({letter}|[-0-9])* 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint [0-9]+ 110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* POSIX says that a tag must be both an id and a C union member, but 112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project historically almost any character is allowed in a tag. We disallow 113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project NUL and newline, as this simplifies our implementation. */ 114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttag [^\0\n>]+ 115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Zero or more instances of backslash-newline. Following GCC, allow 117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project white space between the backslash and the newline. */ 118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsplice (\\[ \f\t\v]*\n)* 119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%% 121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%{ 122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Nesting level of the current code in braces. */ 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang int braces_level PACIFY_CC (= 0); 124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Parent context state, when applicable. */ 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang int context_state PACIFY_CC (= 0); 127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Location of most recent identifier, when applicable. */ 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang location id_loc PACIFY_CC (= empty_location); 130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Where containing code started, when applicable. Its initial 132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project value is relevant only when yylex is invoked in the SC_EPILOGUE 133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project start condition. */ 134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project boundary code_start = scanner_cursor; 135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Where containing comment or string or character literal started, 137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project when applicable. */ 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang boundary token_start PACIFY_CC (= scanner_cursor); 139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%} 140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*-----------------------. 143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning white space. | 144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `-----------------------*/ 145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang<INITIAL,SC_AFTER_IDENTIFIER,SC_BRACKETED_ID,SC_RETURN_BRACKETED_ID> 147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Comments and white space. */ 14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang "," warn_at (*loc, _("stray ',' treated as white space")); 150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project [ \f\n\t\v] | 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang "//".* continue; 152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "/*" { 153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_start = loc->start; 154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project context_state = YY_START; 155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_YACC_COMMENT; 156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* #line directives are not documented, and may be withdrawn or 159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project modified in future versions of Bison. */ 16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang ^"#line "{int}(" \"".*"\"")?"\n" { 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project handle_syncline (yytext + sizeof "#line " - 1, *loc); 162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*----------------------------. 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning Bison directives. | 168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `----------------------------*/ 16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* For directives that are also command line options, the regex must be 17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%..." 17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang after "[-_]"s are removed, and the directive must match the --long 17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang option name, with a single string argument. Otherwise, add exceptions 17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang to ../build-aux/cross-options.pl. */ 17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<INITIAL> 177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%binary" return PERCENT_NONASSOC; 17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%code" return PERCENT_CODE; 18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%debug" return PERCENT_DEBUG; 18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%default"[-_]"prec" return PERCENT_DEFAULT_PREC; 18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%define" return PERCENT_DEFINE; 18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%defines" return PERCENT_DEFINES; 18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%destructor" return PERCENT_DESTRUCTOR; 18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%dprec" return PERCENT_DPREC; 18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%error"[-_]"verbose" return PERCENT_ERROR_VERBOSE; 18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%expect" return PERCENT_EXPECT; 18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%expect"[-_]"rr" return PERCENT_EXPECT_RR; 18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%file-prefix" return PERCENT_FILE_PREFIX; 190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%fixed"[-_]"output"[-_]"files" return PERCENT_YACC; 19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%initial-action" return PERCENT_INITIAL_ACTION; 19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%glr-parser" return PERCENT_GLR_PARSER; 19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%language" return PERCENT_LANGUAGE; 19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%left" return PERCENT_LEFT; 19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%lex-param" return PERCENT_LEX_PARAM; 19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%locations" return PERCENT_LOCATIONS; 19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%merge" return PERCENT_MERGE; 19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%name"[-_]"prefix" return PERCENT_NAME_PREFIX; 19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%no"[-_]"default"[-_]"prec" return PERCENT_NO_DEFAULT_PREC; 20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%no"[-_]"lines" return PERCENT_NO_LINES; 20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%nonassoc" return PERCENT_NONASSOC; 20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%nondeterministic-parser" return PERCENT_NONDETERMINISTIC_PARSER; 20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%nterm" return PERCENT_NTERM; 20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%output" return PERCENT_OUTPUT; 20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%parse-param" return PERCENT_PARSE_PARAM; 20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%prec" return PERCENT_PREC; 20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%printer" return PERCENT_PRINTER; 20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%pure"[-_]"parser" return PERCENT_PURE_PARSER; 20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%require" return PERCENT_REQUIRE; 21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%right" return PERCENT_RIGHT; 21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%skeleton" return PERCENT_SKELETON; 21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%start" return PERCENT_START; 21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%term" return PERCENT_TOKEN; 21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%token" return PERCENT_TOKEN; 21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%token"[-_]"table" return PERCENT_TOKEN_TABLE; 21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%type" return PERCENT_TYPE; 21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%union" return PERCENT_UNION; 21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%verbose" return PERCENT_VERBOSE; 21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%yacc" return PERCENT_YACC; 22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang "%"{id}|"%"{notletter}([[:graph:]])+ { 222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("invalid directive: %s"), quote (yytext)); 223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "=" return EQUAL; 22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang "|" return PIPE; 227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ";" return SEMICOLON; 22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang "<*>" return TYPE_TAG_ANY; 22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang "<>" return TYPE_TAG_NONE; 230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project {id} { 23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->uniqstr = uniqstr_new (yytext); 233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project id_loc = *loc; 23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang bracketed_id_str = NULL; 235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_AFTER_IDENTIFIER; 236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project {int} { 239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->integer = scan_integer (yytext, 10, *loc); 240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return INT; 241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 0[xX][0-9abcdefABCDEF]+ { 243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->integer = scan_integer (yytext, 16, *loc); 244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return INT; 245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Identifiers may not start with a digit. Yet, don't silently 24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang accept "1FOO" as "1 FOO". */ 24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang {int}{id} { 25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang complain_at (*loc, _("invalid identifier: %s"), quote (yytext)); 25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Characters. */ 25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang "'" token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; 255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Strings. */ 257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "\"" token_start = loc->start; BEGIN SC_ESCAPED_STRING; 258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Prologue. */ 260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%{" code_start = loc->start; BEGIN SC_PROLOGUE; 261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Code in between braces. */ 263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "{" { 264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project braces_level = 0; 266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project code_start = loc->start; 267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_BRACED_CODE; 268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* A type. */ 271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "<"{tag}">" { 272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_grow (&obstack_for_string, yytext + 1, yyleng - 2); 273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->uniqstr = uniqstr_new (last_string); 275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FREE; 276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return TYPE; 277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%%" { 280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project static int percent_percent_count; 281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (++percent_percent_count == 2) 282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_EPILOGUE; 283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return PERCENT_PERCENT; 284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 28605436638acc7c010349a69c3395f1a57c642dc62Ying Wang "[" { 28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bracketed_id_str = NULL; 28805436638acc7c010349a69c3395f1a57c642dc62Ying Wang bracketed_id_start = loc->start; 28905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bracketed_id_context_state = YY_START; 29005436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN SC_BRACKETED_ID; 29105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 29305436638acc7c010349a69c3395f1a57c642dc62Ying Wang [^\[%A-Za-z0-9_<>{}\"\'*;|=/, \f\n\t\v]+|. { 29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang complain_at (*loc, "%s: %s", 29505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ngettext ("invalid character", "invalid characters", yyleng), 29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang quote_mem (yytext, yyleng)); 297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> { 300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = loc->end = scanner_cursor; 301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project yyterminate (); 302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*-----------------------------------------------------------------. 307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning after an identifier, checking whether a colon is next. | 308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `-----------------------------------------------------------------*/ 309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_AFTER_IDENTIFIER> 311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang "[" { 31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (bracketed_id_str) 31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 31505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ROLLBACK_CURRENT_TOKEN; 31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN SC_RETURN_BRACKETED_ID; 31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang *loc = id_loc; 31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang return ID; 31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 32005436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 32205436638acc7c010349a69c3395f1a57c642dc62Ying Wang bracketed_id_start = loc->start; 32305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bracketed_id_context_state = YY_START; 32405436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN SC_BRACKETED_ID; 32505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 32605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ":" { 32805436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL); 329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *loc = id_loc; 330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return ID_COLON; 331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project . { 33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ROLLBACK_CURRENT_TOKEN; 33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL); 335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *loc = id_loc; 336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return ID; 337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> { 33905436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL); 340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *loc = id_loc; 341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return ID; 342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 34505436638acc7c010349a69c3395f1a57c642dc62Ying Wang /*--------------------------------. 34605436638acc7c010349a69c3395f1a57c642dc62Ying Wang | Scanning bracketed identifiers. | 34705436638acc7c010349a69c3395f1a57c642dc62Ying Wang `--------------------------------*/ 34805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 34905436638acc7c010349a69c3395f1a57c642dc62Ying Wang<SC_BRACKETED_ID> 35005436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 35105436638acc7c010349a69c3395f1a57c642dc62Ying Wang {id} { 35205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (bracketed_id_str) 35305436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 35405436638acc7c010349a69c3395f1a57c642dc62Ying Wang complain_at (*loc, _("unexpected identifier in bracketed name: %s"), 35505436638acc7c010349a69c3395f1a57c642dc62Ying Wang quote (yytext)); 35605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 35705436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 35805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 35905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bracketed_id_str = uniqstr_new (yytext); 36005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bracketed_id_loc = *loc; 36105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 36205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 36305436638acc7c010349a69c3395f1a57c642dc62Ying Wang "]" { 36405436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN bracketed_id_context_state; 36505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (bracketed_id_str) 36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (INITIAL == bracketed_id_context_state) 36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 36905436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->uniqstr = bracketed_id_str; 37005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bracketed_id_str = 0; 37105436638acc7c010349a69c3395f1a57c642dc62Ying Wang *loc = bracketed_id_loc; 37205436638acc7c010349a69c3395f1a57c642dc62Ying Wang return BRACKETED_ID; 37305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 37405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 37505436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 37605436638acc7c010349a69c3395f1a57c642dc62Ying Wang complain_at (*loc, _("an identifier expected")); 37705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 37805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 37905436638acc7c010349a69c3395f1a57c642dc62Ying Wang [^\].A-Za-z0-9_/ \f\n\t\v]+|. { 38005436638acc7c010349a69c3395f1a57c642dc62Ying Wang complain_at (*loc, "%s: %s", 38105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ngettext ("invalid character in bracketed name", 38205436638acc7c010349a69c3395f1a57c642dc62Ying Wang "invalid characters in bracketed name", yyleng), 38305436638acc7c010349a69c3395f1a57c642dc62Ying Wang quote_mem (yytext, yyleng)); 38405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 38505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 38605436638acc7c010349a69c3395f1a57c642dc62Ying Wang <<EOF>> { 38705436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN bracketed_id_context_state; 38805436638acc7c010349a69c3395f1a57c642dc62Ying Wang unexpected_eof (bracketed_id_start, "]"); 38905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 39005436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 39105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 39205436638acc7c010349a69c3395f1a57c642dc62Ying Wang<SC_RETURN_BRACKETED_ID> 39305436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 39405436638acc7c010349a69c3395f1a57c642dc62Ying Wang . { 39505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ROLLBACK_CURRENT_TOKEN; 39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->uniqstr = bracketed_id_str; 39705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bracketed_id_str = 0; 39805436638acc7c010349a69c3395f1a57c642dc62Ying Wang *loc = bracketed_id_loc; 39905436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN INITIAL; 40005436638acc7c010349a69c3395f1a57c642dc62Ying Wang return BRACKETED_ID; 40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 40305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*---------------------------------------------------------------. 40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang | Scanning a Yacc comment. The initial '/ *' is already eaten. | 407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `---------------------------------------------------------------*/ 408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_YACC_COMMENT> 410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "*/" BEGIN context_state; 41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang .|\n continue; 413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (token_start, "*/"); BEGIN context_state; 414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*------------------------------------------------------------. 41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang | Scanning a C comment. The initial '/ *' is already eaten. | 419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `------------------------------------------------------------*/ 420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_COMMENT> 422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "*"{splice}"/" STRING_GROW; BEGIN context_state; 424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (token_start, "*/"); BEGIN context_state; 425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*--------------------------------------------------------------. 42905436638acc7c010349a69c3395f1a57c642dc62Ying Wang | Scanning a line comment. The initial '//' is already eaten. | 430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `--------------------------------------------------------------*/ 431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_LINE_COMMENT> 433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "\n" STRING_GROW; BEGIN context_state; 435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project {splice} STRING_GROW; 436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> BEGIN context_state; 437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*------------------------------------------------. 441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning a Bison string, including its escapes. | 442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | The initial quote is already eaten. | 443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `------------------------------------------------*/ 444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_ESCAPED_STRING> 446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang "\""|"\n" { 44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (yytext[0] == '\n') 44905436638acc7c010349a69c3395f1a57c642dc62Ying Wang unexpected_newline (token_start, "\""); 45005436638acc7c010349a69c3395f1a57c642dc62Ying Wang STRING_FINISH; 45105436638acc7c010349a69c3395f1a57c642dc62Ying Wang loc->start = token_start; 45205436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->chars = last_string; 45305436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN INITIAL; 45405436638acc7c010349a69c3395f1a57c642dc62Ying Wang return STRING; 45505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 45605436638acc7c010349a69c3395f1a57c642dc62Ying Wang <<EOF>> { 45705436638acc7c010349a69c3395f1a57c642dc62Ying Wang unexpected_eof (token_start, "\""); 458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = token_start; 460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->chars = last_string; 461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return STRING; 463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*----------------------------------------------------------. 467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning a Bison character literal, decoding its escapes. | 468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | The initial quote is already eaten. | 469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `----------------------------------------------------------*/ 470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_ESCAPED_CHARACTER> 472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 47305436638acc7c010349a69c3395f1a57c642dc62Ying Wang "'"|"\n" { 474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = token_start; 47605436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->character = last_string[0]; 47705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* FIXME: Eventually, make these errors. */ 47905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (last_string[0] == '\0') 48005436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang warn_at (*loc, _("empty character literal")); 48205436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* '\0' seems dangerous even if we are about to complain. */ 48305436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->character = '\''; 48405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 48505436638acc7c010349a69c3395f1a57c642dc62Ying Wang else if (last_string[1] != '\0') 48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang warn_at (*loc, _("extra characters in character literal")); 48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 48805436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (yytext[0] == '\n') 48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang unexpected_newline (token_start, "'"); 490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FREE; 491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 49205436638acc7c010349a69c3395f1a57c642dc62Ying Wang return CHAR; 49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 49405436638acc7c010349a69c3395f1a57c642dc62Ying Wang <<EOF>> { 49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang STRING_FINISH; 49605436638acc7c010349a69c3395f1a57c642dc62Ying Wang loc->start = token_start; 49705436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->character = last_string[0]; 49805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* FIXME: Eventually, make these errors. */ 50005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (last_string[0] == '\0') 50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang warn_at (*loc, _("empty character literal")); 50305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* '\0' seems dangerous even if we are about to complain. */ 50405436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->character = '\''; 50505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang else if (last_string[1] != '\0') 50705436638acc7c010349a69c3395f1a57c642dc62Ying Wang warn_at (*loc, _("extra characters in character literal")); 50805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang unexpected_eof (token_start, "'"); 51005436638acc7c010349a69c3395f1a57c642dc62Ying Wang STRING_FREE; 51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN INITIAL; 51205436638acc7c010349a69c3395f1a57c642dc62Ying Wang return CHAR; 513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING> 517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \0 complain_at (*loc, _("invalid null character")); 519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*----------------------------. 523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Decode escaped characters. | 524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `----------------------------*/ 525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER> 527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\[0-7]{1,3} { 529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned long int c = strtoul (yytext + 1, NULL, 8); 53005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!c || UCHAR_MAX < c) 53105436638acc7c010349a69c3395f1a57c642dc62Ying Wang complain_at (*loc, _("invalid number after \\-escape: %s"), 53205436638acc7c010349a69c3395f1a57c642dc62Ying Wang yytext+1); 533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&obstack_for_string, c); 535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\x[0-9abcdefABCDEF]+ { 538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project verify (UCHAR_MAX < ULONG_MAX); 539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned long int c = strtoul (yytext + 2, NULL, 16); 54005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!c || UCHAR_MAX < c) 54105436638acc7c010349a69c3395f1a57c642dc62Ying Wang complain_at (*loc, _("invalid number after \\-escape: %s"), 54205436638acc7c010349a69c3395f1a57c642dc62Ying Wang yytext+1); 543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&obstack_for_string, c); 545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\a obstack_1grow (&obstack_for_string, '\a'); 548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\b obstack_1grow (&obstack_for_string, '\b'); 549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\f obstack_1grow (&obstack_for_string, '\f'); 550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\n obstack_1grow (&obstack_for_string, '\n'); 551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\r obstack_1grow (&obstack_for_string, '\r'); 552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\t obstack_1grow (&obstack_for_string, '\t'); 553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\v obstack_1grow (&obstack_for_string, '\v'); 554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* \\[\"\'?\\] would be shorter, but it confuses xgettext. */ 556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\("\""|"'"|"?"|"\\") obstack_1grow (&obstack_for_string, yytext[1]); 557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} { 559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int c = convert_ucn_to_byte (yytext); 56005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (c <= 0) 56105436638acc7c010349a69c3395f1a57c642dc62Ying Wang complain_at (*loc, _("invalid number after \\-escape: %s"), 56205436638acc7c010349a69c3395f1a57c642dc62Ying Wang yytext+1); 563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&obstack_for_string, c); 565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\(.|\n) { 56705436638acc7c010349a69c3395f1a57c642dc62Ying Wang char const *p = yytext + 1; 56805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Quote only if escaping won't make the character visible. */ 56905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (c_isspace ((unsigned char) *p) && c_isprint ((unsigned char) *p)) 57005436638acc7c010349a69c3395f1a57c642dc62Ying Wang p = quote (p); 57105436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 57205436638acc7c010349a69c3395f1a57c642dc62Ying Wang p = quotearg_style_mem (escape_quoting_style, p, 1); 57305436638acc7c010349a69c3395f1a57c642dc62Ying Wang complain_at (*loc, _("invalid character after \\-escape: %s"), p); 574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*--------------------------------------------. 578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning user-code characters and strings. | 579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `--------------------------------------------*/ 580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_CHARACTER,SC_STRING> 582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 58305436638acc7c010349a69c3395f1a57c642dc62Ying Wang {splice}|\\{splice}[^\n\[\]] STRING_GROW; 584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_CHARACTER> 587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "'" STRING_GROW; BEGIN context_state; 589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \n unexpected_newline (token_start, "'"); BEGIN context_state; 590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (token_start, "'"); BEGIN context_state; 591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_STRING> 594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "\"" STRING_GROW; BEGIN context_state; 596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \n unexpected_newline (token_start, "\""); BEGIN context_state; 597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (token_start, "\""); BEGIN context_state; 598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*---------------------------------------------------. 602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Strings, comments etc. can be found in user code. | 603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `---------------------------------------------------*/ 604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE> 606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "'" { 608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project context_state = YY_START; 610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_start = loc->start; 611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_CHARACTER; 612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "\"" { 614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project context_state = YY_START; 616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_start = loc->start; 617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_STRING; 618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "/"{splice}"*" { 620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project context_state = YY_START; 622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_start = loc->start; 623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_COMMENT; 624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "/"{splice}"/" { 626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project context_state = YY_START; 628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_LINE_COMMENT; 629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 63405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /*-----------------------------------------------------------. 63505436638acc7c010349a69c3395f1a57c642dc62Ying Wang | Scanning some code in braces (actions). The initial "{" is | 63605436638acc7c010349a69c3395f1a57c642dc62Ying Wang | already eaten. | 63705436638acc7c010349a69c3395f1a57c642dc62Ying Wang `-----------------------------------------------------------*/ 638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_BRACED_CODE> 640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "{"|"<"{splice}"%" STRING_GROW; braces_level++; 642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%"{splice}">" STRING_GROW; braces_level--; 643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "}" { 644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&obstack_for_string, '}'); 645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 64605436638acc7c010349a69c3395f1a57c642dc62Ying Wang --braces_level; 64705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (braces_level < 0) 648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = code_start; 65105436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->code = last_string; 652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 65305436638acc7c010349a69c3395f1a57c642dc62Ying Wang return BRACED_CODE; 654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 65705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrrectly 65805436638acc7c010349a69c3395f1a57c642dc62Ying Wang (as '<' '<%'). */ 659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "<"{splice}"<" STRING_GROW; 660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 66105436638acc7c010349a69c3395f1a57c642dc62Ying Wang <<EOF>> { 66205436638acc7c010349a69c3395f1a57c642dc62Ying Wang unexpected_eof (code_start, "}"); 66305436638acc7c010349a69c3395f1a57c642dc62Ying Wang STRING_FINISH; 66405436638acc7c010349a69c3395f1a57c642dc62Ying Wang loc->start = code_start; 66505436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->code = last_string; 66605436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN INITIAL; 66705436638acc7c010349a69c3395f1a57c642dc62Ying Wang return BRACED_CODE; 668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*--------------------------------------------------------------. 673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning some prologue: from "%{" (already scanned) to "%}". | 674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `--------------------------------------------------------------*/ 675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_PROLOGUE> 677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%}" { 679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = code_start; 681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->chars = last_string; 682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return PROLOGUE; 684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 68605436638acc7c010349a69c3395f1a57c642dc62Ying Wang <<EOF>> { 68705436638acc7c010349a69c3395f1a57c642dc62Ying Wang unexpected_eof (code_start, "%}"); 68805436638acc7c010349a69c3395f1a57c642dc62Ying Wang STRING_FINISH; 68905436638acc7c010349a69c3395f1a57c642dc62Ying Wang loc->start = code_start; 69005436638acc7c010349a69c3395f1a57c642dc62Ying Wang val->chars = last_string; 69105436638acc7c010349a69c3395f1a57c642dc62Ying Wang BEGIN INITIAL; 69205436638acc7c010349a69c3395f1a57c642dc62Ying Wang return PROLOGUE; 69305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*---------------------------------------------------------------. 698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning the epilogue (everything after the second "%%", which | 699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | has already been eaten). | 700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `---------------------------------------------------------------*/ 701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_EPILOGUE> 703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> { 705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = code_start; 707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->chars = last_string; 708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return EPILOGUE; 710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*-----------------------------------------------------. 715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | By default, grow the string obstack with the input. | 716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `-----------------------------------------------------*/ 717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>. | 719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>\n STRING_GROW; 720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%% 722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Read bytes from FP into buffer BUF of size SIZE. Return the 724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project number of bytes read. Remove '\r' from input, treating \r\n 725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project and isolated \r as \n. */ 726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic size_t 728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectno_cr_read (FILE *fp, char *buf, size_t size) 729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t bytes_read = fread (buf, 1, size, fp); 731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (bytes_read) 732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *w = memchr (buf, '\r', bytes_read); 734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (w) 735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *r = ++w; 737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *lim = buf + bytes_read; 738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (;;) 740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Found an '\r'. Treat it like '\n', but ignore any 742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '\n' that immediately follows. */ 743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project w[-1] = '\n'; 744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (r == lim) 745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int ch = getc (fp); 747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (ch != '\n' && ungetc (ch, fp) != ch) 748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else if (*r == '\n') 751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project r++; 752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Copy until the next '\r'. */ 754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project do 755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (r == lim) 757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return w - buf; 758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while ((*w++ = *r++) != '\r'); 760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return w - buf; 763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return bytes_read; 767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------. 772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Scan NUMBER for a base-BASE integer at location LOC. | 773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------*/ 774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic unsigned long int 776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectscan_integer (char const *number, int base, location loc) 777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project verify (INT_MAX < ULONG_MAX); 779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned long int num = strtoul (number, NULL, base); 780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (INT_MAX < num) 782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (loc, _("integer out of range: %s"), quote (number)); 784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project num = INT_MAX; 785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return num; 788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------. 792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Convert universal character name UCN to a single-byte character, | 793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| and return that character. Return -1 if UCN does not correspond | 794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| to a single-byte character. | 795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/ 796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic int 798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconvert_ucn_to_byte (char const *ucn) 799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project verify (UCHAR_MAX <= INT_MAX); 801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned long int code = strtoul (ucn + 2, NULL, 16); 802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* FIXME: Currently we assume Unicode-compatible unibyte characters 804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project on ASCII hosts (i.e., Latin-1 on hosts with 8-bit bytes). On 805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project non-ASCII hosts we support only the portable C character set. 806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project These limitations should be removed once we add support for 807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project multibyte characters. */ 808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (UCHAR_MAX < code) 810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return -1; 811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if ! ('$' == 0x24 && '@' == 0x40 && '`' == 0x60 && '~' == 0x7e) 813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* A non-ASCII host. Use CODE to index into a table of the C 815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project basic execution character set, which is guaranteed to exist on 816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project all Standard C platforms. This table also includes '$', '@', 817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project and '`', which are not in the basic execution character set but 818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project which are unibyte characters on all the platforms that we know 819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project about. */ 820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project static signed char const table[] = 821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '\0', -1, -1, -1, -1, -1, -1, '\a', 823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '\b', '\t', '\n', '\v', '\f', '\r', -1, -1, 824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project -1, -1, -1, -1, -1, -1, -1, -1, 825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project -1, -1, -1, -1, -1, -1, -1, -1, 826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ' ', '!', '"', '#', '$', '%', '&', '\'', 827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '(', ')', '*', '+', ',', '-', '.', '/', 828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '0', '1', '2', '3', '4', '5', '6', '7', 829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '8', '9', ':', ';', '<', '=', '>', '?', 830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', 834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'x', 'y', 'z', '{', '|', '}', '~' 838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project }; 839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project code = code < sizeof table ? table[code] : -1; 841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return code; 845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 84805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*---------------------------------------------------------------------. 84905436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Handle '#line INT( "FILE")?\n'. ARGS has already skipped '#line '. | 85005436638acc7c010349a69c3395f1a57c642dc62Ying Wang`---------------------------------------------------------------------*/ 851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthandle_syncline (char *args, location loc) 854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 85505436638acc7c010349a69c3395f1a57c642dc62Ying Wang char *file; 85605436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned long int lineno = strtoul (args, &file, 10); 857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (INT_MAX <= lineno) 858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project warn_at (loc, _("line number overflow")); 860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project lineno = INT_MAX; 861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 862cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 86305436638acc7c010349a69c3395f1a57c642dc62Ying Wang file = mbschr (file, '"'); 86405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (file) 86505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 86605436638acc7c010349a69c3395f1a57c642dc62Ying Wang *mbschr (file + 1, '"') = '\0'; 86705436638acc7c010349a69c3395f1a57c642dc62Ying Wang current_file = uniqstr_new (file + 1); 86805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 86905436638acc7c010349a69c3395f1a57c642dc62Ying Wang boundary_set (&scanner_cursor, current_file, lineno, 1); 870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------------------------------. 874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| For a token or comment starting at START, report message MSGID, | 875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| which should say that an end marker was found before | 876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| the expected TOKEN_END. | 877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------------------------------*/ 878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunexpected_end (boundary start, char const *msgid, char const *token_end) 881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project location loc; 883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc.start = start; 884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc.end = scanner_cursor; 88505436638acc7c010349a69c3395f1a57c642dc62Ying Wang token_end = quote (token_end); 88605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Instead of '\'', display "'". */ 88705436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!strcmp (token_end, "'\\''")) 88805436638acc7c010349a69c3395f1a57c642dc62Ying Wang token_end = "\"'\""; 889cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (loc, _(msgid), token_end); 890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 891cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 892cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------------. 894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report an unexpected EOF in a token or comment starting at START. | 895cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| An end of file was encountered and the expected TOKEN_END was missing. | 896cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------------*/ 897cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunexpected_eof (boundary start, char const *token_end) 900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 90105436638acc7c010349a69c3395f1a57c642dc62Ying Wang unexpected_end (start, N_("missing %s at end of file"), token_end); 902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 903cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 904cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 905cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------. 906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Likewise, but for unexpected newlines. | 907cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------*/ 908cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 909cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunexpected_newline (boundary start, char const *token_end) 911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 91205436638acc7c010349a69c3395f1a57c642dc62Ying Wang unexpected_end (start, N_("missing %s at end of line"), token_end); 913cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 916cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------. 917cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Initialize the scanner. | 918cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------*/ 919cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 920cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 92105436638acc7c010349a69c3395f1a57c642dc62Ying Wanggram_scanner_initialize (void) 922cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 923cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_init (&obstack_for_string); 924cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 925cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 926cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 927cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------------------------------------. 928cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Free all the memory allocated to the scanner. | 929cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------------------------------------*/ 930cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 93205436638acc7c010349a69c3395f1a57c642dc62Ying Wanggram_scanner_free (void) 933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 934cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_free (&obstack_for_string, 0); 935cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Reclaim Flex's buffers. */ 93605436638acc7c010349a69c3395f1a57c642dc62Ying Wang yylex_destroy (); 937cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 938