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