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