1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Bison Grammar Scanner -*- C -*- 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Copyright (C) 2002, 2003, 2004, 2005, 2006 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 7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 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 9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the Free Software Foundation; either version 2 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 18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project along with this program; if not, write to the Free Software 19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 02110-1301 USA 21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project*/ 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%option debug nodefault nounput noyywrap never-interactive 24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%option prefix="gram_" outfile="lex.yy.c" 25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%{ 27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Work around a bug in flex 2.5.31. See Debian bug 333231 28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */ 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#undef gram_wrap 30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define gram_wrap() 1 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h" 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <mbswidth.h> 35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <quote.h> 36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "complain.h" 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "files.h" 39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h" 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gram.h" 41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "quotearg.h" 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "reader.h" 43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "uniqstr.h" 44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define YY_USER_INIT \ 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project do \ 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { \ 48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scanner_cursor.file = current_file; \ 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scanner_cursor.line = 1; \ 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scanner_cursor.column = 1; \ 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project code_start = scanner_cursor; \ 52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } \ 53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (0) 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Pacify "gcc -Wmissing-prototypes" when flex 2.5.31 is used. */ 56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint gram_get_lineno (void); 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFILE *gram_get_in (void); 58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectFILE *gram_get_out (void); 59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint gram_get_leng (void); 60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *gram_get_text (void); 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid gram_set_lineno (int); 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid gram_set_in (FILE *); 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid gram_set_out (FILE *); 64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint gram_get_debug (void); 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid gram_set_debug (int); 66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint gram_lex_destroy (void); 67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Location of scanner cursor. */ 69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectboundary scanner_cursor; 70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void adjust_location (location *, char const *, size_t); 72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define YY_USER_ACTION adjust_location (loc, yytext, yyleng); 73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic size_t no_cr_read (FILE *, char *, size_t); 75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size)) 76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* OBSTACK_FOR_STRING -- Used to store all the characters that we need to 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project keep (to construct ID, STRINGS etc.). Use the following macros to 80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project use it. 81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Use STRING_GROW to append what has just been matched, and 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH to end the string (it puts the ending 0). 84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH also stores this string in LAST_STRING, which can be 85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project used, and which is used by STRING_FREE to free the last string. */ 86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic struct obstack obstack_for_string; 88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* A string representing the most recently saved token. */ 90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *last_string; 91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The location of the most recently saved token, if it was a 93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BRACED_CODE token; otherwise, this has an unspecified value. */ 94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlocation last_braced_code_loc; 95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define STRING_GROW \ 97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_grow (&obstack_for_string, yytext, yyleng) 98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define STRING_FINISH \ 100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project do { \ 101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&obstack_for_string, '\0'); \ 102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project last_string = obstack_finish (&obstack_for_string); \ 103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } while (0) 104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define STRING_FREE \ 106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_free (&obstack_for_string, last_string) 107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectscanner_last_string_free (void) 110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FREE; 112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Within well-formed rules, RULE_LENGTH is the number of values in 115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the current rule so far, which says where to find `$0' with respect 116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project to the top of the stack. It is not the same as the rule->length in 117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the case of mid rule actions. 118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Outside of well-formed rules, RULE_LENGTH has an undefined value. */ 120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic int rule_length; 121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void rule_length_overflow (location) __attribute__ ((__noreturn__)); 123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Increment the rule length by one, checking for overflow. */ 125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline void 126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectincrement_rule_length (location loc) 127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_length++; 129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Don't allow rule_length == INT_MAX, since that might cause 131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project confusion with strtol if INT_MAX == LONG_MAX. */ 132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (rule_length == INT_MAX) 133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_length_overflow (loc); 134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void handle_dollar (int token_type, char *cp, location loc); 137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void handle_at (int token_type, char *cp, location loc); 138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void handle_syncline (char *, location); 139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic unsigned long int scan_integer (char const *p, int base, location loc); 140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic int convert_ucn_to_byte (char const *hex_text); 141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void unexpected_eof (boundary, char const *); 142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void unexpected_newline (boundary, char const *); 143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%} 145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%x SC_COMMENT SC_LINE_COMMENT SC_YACC_COMMENT 146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%x SC_STRING SC_CHARACTER 147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%x SC_AFTER_IDENTIFIER 148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%x SC_ESCAPED_STRING SC_ESCAPED_CHARACTER 149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%x SC_PRE_CODE SC_BRACED_CODE SC_PROLOGUE SC_EPILOGUE 150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectletter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_] 152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectid {letter}({letter}|[0-9])* 153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdirective %{letter}({letter}|[0-9]|-)* 154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint [0-9]+ 155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* POSIX says that a tag must be both an id and a C union member, but 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project historically almost any character is allowed in a tag. We disallow 158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project NUL and newline, as this simplifies our implementation. */ 159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttag [^\0\n>]+ 160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Zero or more instances of backslash-newline. Following GCC, allow 162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project white space between the backslash and the newline. */ 163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsplice (\\[ \f\t\v]*\n)* 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%% 166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%{ 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Nesting level of the current code in braces. */ 168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int braces_level IF_LINT (= 0); 169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Parent context state, when applicable. */ 171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int context_state IF_LINT (= 0); 172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Token type to return, when applicable. */ 174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int token_type IF_LINT (= 0); 175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Location of most recent identifier, when applicable. */ 177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project location id_loc IF_LINT (= empty_location); 178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Where containing code started, when applicable. Its initial 180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project value is relevant only when yylex is invoked in the SC_EPILOGUE 181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project start condition. */ 182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project boundary code_start = scanner_cursor; 183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Where containing comment or string or character literal started, 185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project when applicable. */ 186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project boundary token_start IF_LINT (= scanner_cursor); 187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%} 188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*-----------------------. 191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning white space. | 192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `-----------------------*/ 193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<INITIAL,SC_AFTER_IDENTIFIER,SC_PRE_CODE> 195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Comments and white space. */ 197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "," warn_at (*loc, _("stray `,' treated as white space")); 198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project [ \f\n\t\v] | 199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "//".* ; 200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "/*" { 201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_start = loc->start; 202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project context_state = YY_START; 203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_YACC_COMMENT; 204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* #line directives are not documented, and may be withdrawn or 207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project modified in future versions of Bison. */ 208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ^"#line "{int}" \"".*"\"\n" { 209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project handle_syncline (yytext + sizeof "#line " - 1, *loc); 210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*----------------------------. 215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning Bison directives. | 216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `----------------------------*/ 217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<INITIAL> 218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%binary" return PERCENT_NONASSOC; 220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%debug" return PERCENT_DEBUG; 221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%default"[-_]"prec" return PERCENT_DEFAULT_PREC; 222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%define" return PERCENT_DEFINE; 223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%defines" return PERCENT_DEFINES; 224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%destructor" token_type = PERCENT_DESTRUCTOR; BEGIN SC_PRE_CODE; 225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%dprec" return PERCENT_DPREC; 226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%error"[-_]"verbose" return PERCENT_ERROR_VERBOSE; 227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%expect" return PERCENT_EXPECT; 228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%expect"[-_]"rr" return PERCENT_EXPECT_RR; 229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%file-prefix" return PERCENT_FILE_PREFIX; 230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%fixed"[-_]"output"[-_]"files" return PERCENT_YACC; 231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%initial-action" token_type = PERCENT_INITIAL_ACTION; BEGIN SC_PRE_CODE; 232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%glr-parser" return PERCENT_GLR_PARSER; 233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%left" return PERCENT_LEFT; 234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%lex-param" token_type = PERCENT_LEX_PARAM; BEGIN SC_PRE_CODE; 235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%locations" return PERCENT_LOCATIONS; 236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%merge" return PERCENT_MERGE; 237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%name"[-_]"prefix" return PERCENT_NAME_PREFIX; 238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%no"[-_]"default"[-_]"prec" return PERCENT_NO_DEFAULT_PREC; 239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%no"[-_]"lines" return PERCENT_NO_LINES; 240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%nonassoc" return PERCENT_NONASSOC; 241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%nondeterministic-parser" return PERCENT_NONDETERMINISTIC_PARSER; 242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%nterm" return PERCENT_NTERM; 243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%output" return PERCENT_OUTPUT; 244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%parse-param" token_type = PERCENT_PARSE_PARAM; BEGIN SC_PRE_CODE; 245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%prec" rule_length--; return PERCENT_PREC; 246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%printer" token_type = PERCENT_PRINTER; BEGIN SC_PRE_CODE; 247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%pure"[-_]"parser" return PERCENT_PURE_PARSER; 248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%require" return PERCENT_REQUIRE; 249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%right" return PERCENT_RIGHT; 250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%skeleton" return PERCENT_SKELETON; 251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%start" return PERCENT_START; 252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%term" return PERCENT_TOKEN; 253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%token" return PERCENT_TOKEN; 254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%token"[-_]"table" return PERCENT_TOKEN_TABLE; 255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%type" return PERCENT_TYPE; 256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%union" token_type = PERCENT_UNION; BEGIN SC_PRE_CODE; 257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%verbose" return PERCENT_VERBOSE; 258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%yacc" return PERCENT_YACC; 259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project {directive} { 261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("invalid directive: %s"), quote (yytext)); 262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "=" return EQUAL; 265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "|" rule_length = 0; return PIPE; 266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ";" return SEMICOLON; 267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project {id} { 269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->symbol = symbol_get (yytext, *loc); 270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project id_loc = *loc; 271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project increment_rule_length (*loc); 272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_AFTER_IDENTIFIER; 273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project {int} { 276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->integer = scan_integer (yytext, 10, *loc); 277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return INT; 278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 0[xX][0-9abcdefABCDEF]+ { 280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->integer = scan_integer (yytext, 16, *loc); 281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return INT; 282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Characters. We don't check there is only one. */ 285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "'" STRING_GROW; token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; 286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Strings. */ 288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "\"" token_start = loc->start; BEGIN SC_ESCAPED_STRING; 289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Prologue. */ 291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%{" code_start = loc->start; BEGIN SC_PROLOGUE; 292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Code in between braces. */ 294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "{" { 295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (current_rule && current_rule->action) 296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project grammar_midrule_action (); 297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_type = BRACED_CODE; 299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project braces_level = 0; 300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project code_start = loc->start; 301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_BRACED_CODE; 302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* A type. */ 305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "<"{tag}">" { 306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_grow (&obstack_for_string, yytext + 1, yyleng - 2); 307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->uniqstr = uniqstr_new (last_string); 309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FREE; 310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return TYPE; 311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%%" { 314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project static int percent_percent_count; 315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (++percent_percent_count == 2) 316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_EPILOGUE; 317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return PERCENT_PERCENT; 318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project . { 321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("invalid character: %s"), quote (yytext)); 322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> { 325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = loc->end = scanner_cursor; 326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project yyterminate (); 327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*-----------------------------------------------------------------. 332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning after an identifier, checking whether a colon is next. | 333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `-----------------------------------------------------------------*/ 334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_AFTER_IDENTIFIER> 336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ":" { 338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_length = 0; 339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *loc = id_loc; 340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return ID_COLON; 342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project . { 344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0); 345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project yyless (0); 346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *loc = id_loc; 347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return ID; 349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> { 351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *loc = id_loc; 352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return ID; 354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*---------------------------------------------------------------. 359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning a Yacc comment. The initial `/ *' is already eaten. | 360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `---------------------------------------------------------------*/ 361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_YACC_COMMENT> 363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "*/" BEGIN context_state; 365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project .|\n ; 366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (token_start, "*/"); BEGIN context_state; 367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*------------------------------------------------------------. 371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning a C comment. The initial `/ *' is already eaten. | 372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `------------------------------------------------------------*/ 373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_COMMENT> 375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "*"{splice}"/" STRING_GROW; BEGIN context_state; 377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (token_start, "*/"); BEGIN context_state; 378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*--------------------------------------------------------------. 382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning a line comment. The initial `//' is already eaten. | 383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `--------------------------------------------------------------*/ 384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_LINE_COMMENT> 386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "\n" STRING_GROW; BEGIN context_state; 388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project {splice} STRING_GROW; 389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> BEGIN context_state; 390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*------------------------------------------------. 394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning a Bison string, including its escapes. | 395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | The initial quote is already eaten. | 396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `------------------------------------------------*/ 397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_ESCAPED_STRING> 399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "\"" { 401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = token_start; 403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->chars = last_string; 404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project increment_rule_length (*loc); 405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return STRING; 407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \n unexpected_newline (token_start, "\""); BEGIN INITIAL; 409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (token_start, "\""); BEGIN INITIAL; 410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*----------------------------------------------------------. 413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning a Bison character literal, decoding its escapes. | 414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | The initial quote is already eaten. | 415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `----------------------------------------------------------*/ 416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_ESCAPED_CHARACTER> 418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "'" { 420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned char last_string_1; 421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = token_start; 424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->symbol = symbol_get (quotearg_style (escape_quoting_style, 425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project last_string), 426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *loc); 427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_class_set (val->symbol, token_sym, *loc, false); 428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project last_string_1 = last_string[1]; 429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_user_token_number_set (val->symbol, last_string_1, *loc); 430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FREE; 431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project increment_rule_length (*loc); 432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return ID; 434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \n unexpected_newline (token_start, "'"); BEGIN INITIAL; 436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (token_start, "'"); BEGIN INITIAL; 437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING> 440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \0 complain_at (*loc, _("invalid null character")); 442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*----------------------------. 446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Decode escaped characters. | 447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `----------------------------*/ 448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER> 450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\[0-7]{1,3} { 452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned long int c = strtoul (yytext + 1, NULL, 8); 453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (UCHAR_MAX < c) 454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); 455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else if (! c) 456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("invalid null character: %s"), quote (yytext)); 457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&obstack_for_string, c); 459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\x[0-9abcdefABCDEF]+ { 462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project verify (UCHAR_MAX < ULONG_MAX); 463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned long int c = strtoul (yytext + 2, NULL, 16); 464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (UCHAR_MAX < c) 465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); 466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else if (! c) 467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("invalid null character: %s"), quote (yytext)); 468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&obstack_for_string, c); 470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\a obstack_1grow (&obstack_for_string, '\a'); 473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\b obstack_1grow (&obstack_for_string, '\b'); 474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\f obstack_1grow (&obstack_for_string, '\f'); 475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\n obstack_1grow (&obstack_for_string, '\n'); 476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\r obstack_1grow (&obstack_for_string, '\r'); 477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\t obstack_1grow (&obstack_for_string, '\t'); 478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\v obstack_1grow (&obstack_for_string, '\v'); 479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* \\[\"\'?\\] would be shorter, but it confuses xgettext. */ 481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\("\""|"'"|"?"|"\\") obstack_1grow (&obstack_for_string, yytext[1]); 482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} { 484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int c = convert_ucn_to_byte (yytext); 485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (c < 0) 486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); 487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else if (! c) 488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("invalid null character: %s"), quote (yytext)); 489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&obstack_for_string, c); 491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \\(.|\n) { 493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("unrecognized escape sequence: %s"), quote (yytext)); 494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*--------------------------------------------. 499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning user-code characters and strings. | 500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `--------------------------------------------*/ 501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_CHARACTER,SC_STRING> 503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project {splice}|\\{splice}[^\n$@\[\]] STRING_GROW; 505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_CHARACTER> 508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "'" STRING_GROW; BEGIN context_state; 510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \n unexpected_newline (token_start, "'"); BEGIN context_state; 511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (token_start, "'"); BEGIN context_state; 512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_STRING> 515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "\"" STRING_GROW; BEGIN context_state; 517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \n unexpected_newline (token_start, "\""); BEGIN context_state; 518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (token_start, "\""); BEGIN context_state; 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 | Strings, comments etc. can be found in user code. | 524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `---------------------------------------------------*/ 525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE> 527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "'" { 529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project context_state = YY_START; 531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_start = loc->start; 532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_CHARACTER; 533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "\"" { 535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project context_state = YY_START; 537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_start = loc->start; 538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_STRING; 539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "/"{splice}"*" { 541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project context_state = YY_START; 543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_start = loc->start; 544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_COMMENT; 545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "/"{splice}"/" { 547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_GROW; 548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project context_state = YY_START; 549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_LINE_COMMENT; 550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*---------------------------------------------------------------. 555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning after %union etc., possibly followed by white space. | 556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | For %union only, allow arbitrary C code to appear before the | 557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | following brace, as an extension to POSIX. | 558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `---------------------------------------------------------------*/ 559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_PRE_CODE> 561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project . { 563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bool valid = yytext[0] == '{' || token_type == PERCENT_UNION; 564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0); 565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project yyless (0); 566cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 567cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (valid) 568cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 569cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project braces_level = -1; 570cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project code_start = loc->start; 571cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN SC_BRACED_CODE; 572cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 573cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 574cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 575cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (*loc, _("missing `{' in %s"), 576cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project token_name (token_type)); 577cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_sgrow (&obstack_for_string, "{}"); 578cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 579cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->chars = last_string; 580cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 581cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return token_type; 582cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 583cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 584cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 585cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (scanner_cursor, "{}"); BEGIN INITIAL; 586cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 587cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 588cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 589cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*---------------------------------------------------------------. 590cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning some code in braces (%union and actions). The initial | 591cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | "{" is already eaten. | 592cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `---------------------------------------------------------------*/ 593cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 594cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_BRACED_CODE> 595cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 596cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "{"|"<"{splice}"%" STRING_GROW; braces_level++; 597cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%"{splice}">" STRING_GROW; braces_level--; 598cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "}" { 599cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bool outer_brace = --braces_level < 0; 600cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 601cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* As an undocumented Bison extension, append `;' before the last 602cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project brace in braced code, so that the user code can omit trailing 603cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `;'. But do not append `;' if emulating Yacc, since Yacc does 604cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project not append one. 605cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 606cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project FIXME: Bison should warn if a semicolon seems to be necessary 607cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project here, and should omit the semicolon if it seems unnecessary 608cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (e.g., after ';', '{', or '}', each followed by comments or 609cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project white space). Such a warning shouldn't depend on --yacc; it 610cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project should depend on a new --pedantic option, which would cause 611cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Bison to warn if it detects an extension to POSIX. --pedantic 612cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project should also diagnose other Bison extensions like %yacc. 613cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Perhaps there should also be a GCC-style --pedantic-errors 614cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project option, so that such warnings are diagnosed as errors. */ 615cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (outer_brace && token_type == BRACED_CODE && ! yacc_flag) 616cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&obstack_for_string, ';'); 617cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 618cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_1grow (&obstack_for_string, '}'); 619cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 620cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (outer_brace) 621cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 622cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 623cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = code_start; 624cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->chars = last_string; 625cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project increment_rule_length (*loc); 626cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project last_braced_code_loc = *loc; 627cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 628cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return token_type; 629cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 630cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 631cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 632cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Tokenize `<<%' correctly (as `<<' `%') rather than incorrrectly 633cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project (as `<' `<%'). */ 634cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "<"{splice}"<" STRING_GROW; 635cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 636cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "$"("<"{tag}">")?(-?[0-9]+|"$") handle_dollar (token_type, yytext, *loc); 637cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "@"(-?[0-9]+|"$") handle_at (token_type, yytext, *loc); 638cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 639cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "$" { 640cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project warn_at (*loc, _("stray `$'")); 641cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_sgrow (&obstack_for_string, "$]["); 642cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 643cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "@" { 644cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project warn_at (*loc, _("stray `@'")); 645cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_sgrow (&obstack_for_string, "@@"); 646cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 647cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 648cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (code_start, "}"); BEGIN INITIAL; 649cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 650cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 651cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 652cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*--------------------------------------------------------------. 653cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning some prologue: from "%{" (already scanned) to "%}". | 654cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `--------------------------------------------------------------*/ 655cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 656cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_PROLOGUE> 657cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 658cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "%}" { 659cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 660cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = code_start; 661cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->chars = last_string; 662cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 663cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return PROLOGUE; 664cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 665cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 666cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> unexpected_eof (code_start, "%}"); BEGIN INITIAL; 667cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 668cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 669cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 670cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*---------------------------------------------------------------. 671cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Scanning the epilogue (everything after the second "%%", which | 672cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | has already been eaten). | 673cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `---------------------------------------------------------------*/ 674cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 675cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_EPILOGUE> 676cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 677cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <<EOF>> { 678cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project STRING_FINISH; 679cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = code_start; 680cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project val->chars = last_string; 681cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project BEGIN INITIAL; 682cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return EPILOGUE; 683cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 684cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 685cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 686cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 687cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*-----------------------------------------. 688cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | Escape M4 quoting characters in C code. | 689cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `-----------------------------------------*/ 690cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 691cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_COMMENT,SC_LINE_COMMENT,SC_STRING,SC_CHARACTER,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE> 692cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 693cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \$ obstack_sgrow (&obstack_for_string, "$]["); 694cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \@ obstack_sgrow (&obstack_for_string, "@@"); 695cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \[ obstack_sgrow (&obstack_for_string, "@{"); 696cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project \] obstack_sgrow (&obstack_for_string, "@}"); 697cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 698cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 699cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 700cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /*-----------------------------------------------------. 701cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project | By default, grow the string obstack with the input. | 702cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project `-----------------------------------------------------*/ 703cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 704cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The 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>. | 705cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>\n STRING_GROW; 706cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 707cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project%% 708cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 709cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Keeps track of the maximum number of semantic values to the left of 710cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project a handle (those referenced by $0, $-1, etc.) are required by the 711cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project semantic actions of this grammar. */ 712cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint max_left_semantic_context = 0; 713cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 714cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* If BUF is null, add BUFSIZE (which in this case must be less than 715cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project INT_MAX) to COLUMN; otherwise, add mbsnwidth (BUF, BUFSIZE, 0) to 716cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project COLUMN. If an overflow occurs, or might occur but is undetectable, 717cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return INT_MAX. Assume COLUMN is nonnegative. */ 718cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 719cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline int 720cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadd_column_width (int column, char const *buf, size_t bufsize) 721cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 722cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t width; 723cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned int remaining_columns = INT_MAX - column; 724cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 725cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (buf) 726cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 727cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (INT_MAX / 2 <= bufsize) 728cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return INT_MAX; 729cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project width = mbsnwidth (buf, bufsize, 0); 730cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 731cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 732cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project width = bufsize; 733cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 734cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return width <= remaining_columns ? column + width : INT_MAX; 735cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 736cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 737cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Set *LOC and adjust scanner cursor to account for token TOKEN of 738cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size SIZE. */ 739cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 740cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 741cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectadjust_location (location *loc, char const *token, size_t size) 742cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 743cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int line = scanner_cursor.line; 744cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int column = scanner_cursor.column; 745cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *p0 = token; 746cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *p = token; 747cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *lim = token + size; 748cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 749cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->start = scanner_cursor; 750cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 751cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (p = token; p < lim; p++) 752cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project switch (*p) 753cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 754cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case '\n': 755cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project line += line < INT_MAX; 756cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project column = 1; 757cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project p0 = p + 1; 758cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 759cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 760cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case '\t': 761cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project column = add_column_width (column, p0, p - p0); 762cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project column = add_column_width (column, NULL, 8 - ((column - 1) & 7)); 763cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project p0 = p + 1; 764cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 765cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 766cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project default: 767cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 768cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 769cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 770cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scanner_cursor.line = line; 771cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scanner_cursor.column = column = add_column_width (column, p0, p - p0); 772cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 773cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc->end = scanner_cursor; 774cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 775cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (line == INT_MAX && loc->start.line != INT_MAX) 776cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project warn_at (*loc, _("line number overflow")); 777cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (column == INT_MAX && loc->start.column != INT_MAX) 778cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project warn_at (*loc, _("column number overflow")); 779cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 780cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 781cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 782cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Read bytes from FP into buffer BUF of size SIZE. Return the 783cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project number of bytes read. Remove '\r' from input, treating \r\n 784cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project and isolated \r as \n. */ 785cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 786cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic size_t 787cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectno_cr_read (FILE *fp, char *buf, size_t size) 788cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 789cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t bytes_read = fread (buf, 1, size, fp); 790cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (bytes_read) 791cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 792cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *w = memchr (buf, '\r', bytes_read); 793cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (w) 794cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 795cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *r = ++w; 796cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char const *lim = buf + bytes_read; 797cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 798cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (;;) 799cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 800cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Found an '\r'. Treat it like '\n', but ignore any 801cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '\n' that immediately follows. */ 802cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project w[-1] = '\n'; 803cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (r == lim) 804cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 805cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int ch = getc (fp); 806cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (ch != '\n' && ungetc (ch, fp) != ch) 807cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 808cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 809cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else if (*r == '\n') 810cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project r++; 811cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 812cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Copy until the next '\r'. */ 813cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project do 814cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 815cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (r == lim) 816cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return w - buf; 817cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 818cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while ((*w++ = *r++) != '\r'); 819cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 820cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 821cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return w - buf; 822cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 823cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 824cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 825cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return bytes_read; 826cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 827cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 828cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 829cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------. 830cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| TEXT is pointing to a wannabee semantic value (i.e., a `$'). | 831cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| | 832cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Possible inputs: $[<TYPENAME>]($|integer) | 833cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| | 834cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output to OBSTACK_FOR_STRING a reference to this semantic value. | 835cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/ 836cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 837cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline bool 838cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthandle_action_dollar (char *text, location loc) 839cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 840cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project const char *type_name = NULL; 841cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *cp = text + 1; 842cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 843cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (! current_rule) 844cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return false; 845cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 846cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Get the type name if explicit. */ 847cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (*cp == '<') 848cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 849cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project type_name = ++cp; 850cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project while (*cp != '>') 851cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ++cp; 852cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *cp = '\0'; 853cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ++cp; 854cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 855cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 856cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (*cp == '$') 857cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 858cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!type_name) 859cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project type_name = symbol_list_n_type_name_get (current_rule, loc, 0); 860cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!type_name && typed) 861cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (loc, _("$$ of `%s' has no declared type"), 862cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project current_rule->sym->tag); 863cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!type_name) 864cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project type_name = ""; 865cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_fgrow1 (&obstack_for_string, 866cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "]b4_lhs_value([%s])[", type_name); 867cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project current_rule->used = true; 868cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 869cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 870cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 871cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project long int num = strtol (cp, NULL, 10); 872cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 873cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (1 - INT_MAX + rule_length <= num && num <= rule_length) 874cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 875cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int n = num; 876cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (max_left_semantic_context < 1 - n) 877cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project max_left_semantic_context = 1 - n; 878cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!type_name && 0 < n) 879cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project type_name = symbol_list_n_type_name_get (current_rule, loc, n); 880cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!type_name && typed) 881cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (loc, _("$%d of `%s' has no declared type"), 882cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project n, current_rule->sym->tag); 883cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!type_name) 884cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project type_name = ""; 885cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_fgrow3 (&obstack_for_string, 886cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project "]b4_rhs_value(%d, %d, [%s])[", 887cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_length, n, type_name); 888cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project symbol_list_n_used_set (current_rule, n, true); 889cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 890cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 891cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (loc, _("integer out of range: %s"), quote (text)); 892cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 893cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 894cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return true; 895cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 896cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 897cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 898cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------------------------------. 899cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Map `$?' onto the proper M4 symbol, depending on its TOKEN_TYPE | 900cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| (are we in an action?). | 901cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------------------------------*/ 902cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 903cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 904cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthandle_dollar (int token_type, char *text, location loc) 905cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 906cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project switch (token_type) 907cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 908cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case BRACED_CODE: 909cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (handle_action_dollar (text, loc)) 910cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return; 911cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 912cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 913cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case PERCENT_DESTRUCTOR: 914cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case PERCENT_INITIAL_ACTION: 915cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case PERCENT_PRINTER: 916cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (text[1] == '$') 917cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 918cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar["); 919cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return; 920cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 921cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 922cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 923cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project default: 924cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 925cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 926cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 927cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (loc, _("invalid value: %s"), quote (text)); 928cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 929cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 930cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 931cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------. 932cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| TEXT is a location token (i.e., a `@...'). Output to | 933cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| OBSTACK_FOR_STRING a reference to this location. | 934cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------*/ 935cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 936cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline bool 937cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthandle_action_at (char *text, location loc) 938cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 939cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *cp = text + 1; 940cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project locations_flag = true; 941cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 942cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (! current_rule) 943cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return false; 944cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 945cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (*cp == '$') 946cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_sgrow (&obstack_for_string, "]b4_lhs_location["); 947cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 948cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 949cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project long int num = strtol (cp, NULL, 10); 950cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 951cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (1 - INT_MAX + rule_length <= num && num <= rule_length) 952cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 953cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int n = num; 954cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_fgrow2 (&obstack_for_string, "]b4_rhs_location(%d, %d)[", 955cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project rule_length, n); 956cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 957cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 958cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (loc, _("integer out of range: %s"), quote (text)); 959cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 960cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 961cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return true; 962cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 963cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 964cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 965cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------------------------------. 966cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Map `@?' onto the proper M4 symbol, depending on its TOKEN_TYPE | 967cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| (are we in an action?). | 968cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------------------------------*/ 969cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 970cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 971cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthandle_at (int token_type, char *text, location loc) 972cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 973cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project switch (token_type) 974cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 975cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case BRACED_CODE: 976cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project handle_action_at (text, loc); 977cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return; 978cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 979cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case PERCENT_INITIAL_ACTION: 980cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case PERCENT_DESTRUCTOR: 981cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project case PERCENT_PRINTER: 982cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (text[1] == '$') 983cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 984cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_sgrow (&obstack_for_string, "]b4_at_dollar["); 985cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return; 986cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 987cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 988cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 989cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project default: 990cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project break; 991cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 992cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 993cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (loc, _("invalid value: %s"), quote (text)); 994cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 995cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 996cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 997cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------. 998cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Scan NUMBER for a base-BASE integer at location LOC. | 999cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------*/ 1000cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1001cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic unsigned long int 1002cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectscan_integer (char const *number, int base, location loc) 1003cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 1004cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project verify (INT_MAX < ULONG_MAX); 1005cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned long int num = strtoul (number, NULL, base); 1006cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1007cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (INT_MAX < num) 1008cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 1009cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (loc, _("integer out of range: %s"), quote (number)); 1010cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project num = INT_MAX; 1011cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 1012cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1013cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return num; 1014cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 1015cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1016cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1017cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------. 1018cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Convert universal character name UCN to a single-byte character, | 1019cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| and return that character. Return -1 if UCN does not correspond | 1020cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| to a single-byte character. | 1021cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/ 1022cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1023cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic int 1024cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconvert_ucn_to_byte (char const *ucn) 1025cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 1026cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project verify (UCHAR_MAX <= INT_MAX); 1027cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned long int code = strtoul (ucn + 2, NULL, 16); 1028cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1029cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* FIXME: Currently we assume Unicode-compatible unibyte characters 1030cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project on ASCII hosts (i.e., Latin-1 on hosts with 8-bit bytes). On 1031cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project non-ASCII hosts we support only the portable C character set. 1032cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project These limitations should be removed once we add support for 1033cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project multibyte characters. */ 1034cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1035cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (UCHAR_MAX < code) 1036cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return -1; 1037cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1038cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if ! ('$' == 0x24 && '@' == 0x40 && '`' == 0x60 && '~' == 0x7e) 1039cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 1040cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* A non-ASCII host. Use CODE to index into a table of the C 1041cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project basic execution character set, which is guaranteed to exist on 1042cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project all Standard C platforms. This table also includes '$', '@', 1043cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project and '`', which are not in the basic execution character set but 1044cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project which are unibyte characters on all the platforms that we know 1045cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project about. */ 1046cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project static signed char const table[] = 1047cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 1048cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '\0', -1, -1, -1, -1, -1, -1, '\a', 1049cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '\b', '\t', '\n', '\v', '\f', '\r', -1, -1, 1050cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project -1, -1, -1, -1, -1, -1, -1, -1, 1051cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project -1, -1, -1, -1, -1, -1, -1, -1, 1052cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ' ', '!', '"', '#', '$', '%', '&', '\'', 1053cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '(', ')', '*', '+', ',', '-', '.', '/', 1054cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '0', '1', '2', '3', '4', '5', '6', '7', 1055cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '8', '9', ':', ';', '<', '=', '>', '?', 1056cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 1057cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 1058cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 1059cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', 1060cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 1061cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 1062cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 1063cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 'x', 'y', 'z', '{', '|', '}', '~' 1064cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project }; 1065cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1066cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project code = code < sizeof table ? table[code] : -1; 1067cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 1068cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 1069cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1070cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return code; 1071cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 1072cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1073cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1074cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------------------------------. 1075cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Handle `#line INT "FILE"'. ARGS has already skipped `#line '. | 1076cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------------------------------*/ 1077cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1078cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 1079cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthandle_syncline (char *args, location loc) 1080cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 1081cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *after_num; 1082cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unsigned long int lineno = strtoul (args, &after_num, 10); 1083cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project char *file = strchr (after_num, '"') + 1; 1084cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *strchr (file, '"') = '\0'; 1085cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (INT_MAX <= lineno) 1086cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 1087cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project warn_at (loc, _("line number overflow")); 1088cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project lineno = INT_MAX; 1089cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 1090cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scanner_cursor.file = current_file = uniqstr_new (file); 1091cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scanner_cursor.line = lineno; 1092cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project scanner_cursor.column = 1; 1093cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 1094cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1095cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1096cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*---------------------------------. 1097cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report a rule that is too long. | 1098cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`---------------------------------*/ 1099cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 1101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectrule_length_overflow (location loc) 1102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 1103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fatal_at (loc, _("rule is too long")); 1104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 1105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------------------------------. 1108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| For a token or comment starting at START, report message MSGID, | 1109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| which should say that an end marker was found before | 1110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| the expected TOKEN_END. | 1111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------------------------------*/ 1112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 1114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunexpected_end (boundary start, char const *msgid, char const *token_end) 1115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 1116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project location loc; 1117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc.start = start; 1118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project loc.end = scanner_cursor; 1119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project complain_at (loc, _(msgid), token_end); 1120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 1121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------------. 1124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Report an unexpected EOF in a token or comment starting at START. | 1125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| An end of file was encountered and the expected TOKEN_END was missing. | 1126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------------*/ 1127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 1129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunexpected_eof (boundary start, char const *token_end) 1130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 1131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unexpected_end (start, N_("missing `%s' at end of file"), token_end); 1132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 1133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------. 1136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Likewise, but for unexpected newlines. | 1137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------*/ 1138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void 1140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectunexpected_newline (boundary start, char const *token_end) 1141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 1142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project unexpected_end (start, N_("missing `%s' at end of line"), token_end); 1143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 1144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------. 1147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Initialize the scanner. | 1148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------*/ 1149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 1151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectscanner_initialize (void) 1152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 1153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_init (&obstack_for_string); 1154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 1155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------------------------------------. 1158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Free all the memory allocated to the scanner. | 1159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------------------------------------*/ 1160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid 1162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectscanner_free (void) 1163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 1164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project obstack_free (&obstack_for_string, 0); 1165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Reclaim Flex's buffers. */ 1166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project yy_delete_buffer (YY_CURRENT_BUFFER); 1167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 1168