xref: /aosp_15_r20/external/mesa3d/src/compiler/glsl/glcpp/glcpp-lex.l (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker %{
2*61046927SAndroid Build Coastguard Worker /*
3*61046927SAndroid Build Coastguard Worker  * Copyright © 2010 Intel Corporation
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*61046927SAndroid Build Coastguard Worker  *
12*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
13*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
14*61046927SAndroid Build Coastguard Worker  * Software.
15*61046927SAndroid Build Coastguard Worker  *
16*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22*61046927SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker  */
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker #include <stdio.h>
26*61046927SAndroid Build Coastguard Worker #include <string.h>
27*61046927SAndroid Build Coastguard Worker #include <ctype.h>
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #include "glcpp.h"
30*61046927SAndroid Build Coastguard Worker #include "glcpp-parse.h"
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker /* Flex annoyingly generates some functions without making them
33*61046927SAndroid Build Coastguard Worker  * static. Let's declare them here. */
34*61046927SAndroid Build Coastguard Worker int glcpp_get_column  (yyscan_t yyscanner);
35*61046927SAndroid Build Coastguard Worker void glcpp_set_column (int  column_no , yyscan_t yyscanner);
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker #ifdef _MSC_VER
38*61046927SAndroid Build Coastguard Worker #define YY_NO_UNISTD_H
39*61046927SAndroid Build Coastguard Worker #endif
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker #define YY_NO_INPUT
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker #define YY_USER_ACTION							\
44*61046927SAndroid Build Coastguard Worker 	do {								\
45*61046927SAndroid Build Coastguard Worker 		if (parser->has_new_line_number)			\
46*61046927SAndroid Build Coastguard Worker 			yylineno = parser->new_line_number;		\
47*61046927SAndroid Build Coastguard Worker 		if (parser->has_new_source_number)			\
48*61046927SAndroid Build Coastguard Worker 			yylloc->source = parser->new_source_number;	\
49*61046927SAndroid Build Coastguard Worker 		yylloc->first_column = yycolumn + 1;			\
50*61046927SAndroid Build Coastguard Worker 		yylloc->first_line = yylloc->last_line = yylineno;	\
51*61046927SAndroid Build Coastguard Worker 		yycolumn += yyleng;					\
52*61046927SAndroid Build Coastguard Worker 		yylloc->last_column = yycolumn + 1;			\
53*61046927SAndroid Build Coastguard Worker 		parser->has_new_line_number = 0;			\
54*61046927SAndroid Build Coastguard Worker 		parser->has_new_source_number = 0;			\
55*61046927SAndroid Build Coastguard Worker 	} while(0);
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker #define YY_USER_INIT			\
58*61046927SAndroid Build Coastguard Worker 	do {				\
59*61046927SAndroid Build Coastguard Worker 		yylineno = 1;		\
60*61046927SAndroid Build Coastguard Worker 		yycolumn = 0;		\
61*61046927SAndroid Build Coastguard Worker 		yylloc->source = 0;	\
62*61046927SAndroid Build Coastguard Worker 	} while(0)
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker /* It's ugly to have macros that have return statements inside of
65*61046927SAndroid Build Coastguard Worker  * them, but flex-based lexer generation is all built around the
66*61046927SAndroid Build Coastguard Worker  * return statement.
67*61046927SAndroid Build Coastguard Worker  *
68*61046927SAndroid Build Coastguard Worker  * To mitigate the ugliness, we defer as much of the logic as possible
69*61046927SAndroid Build Coastguard Worker  * to an actual function, not a macro (see
70*61046927SAndroid Build Coastguard Worker  * glcpplex_update_state_per_token) and we make the word RETURN
71*61046927SAndroid Build Coastguard Worker  * prominent in all of the macros which may return.
72*61046927SAndroid Build Coastguard Worker  *
73*61046927SAndroid Build Coastguard Worker  * The most-commonly-used macro is RETURN_TOKEN which will perform all
74*61046927SAndroid Build Coastguard Worker  * necessary state updates based on the provided token,, then
75*61046927SAndroid Build Coastguard Worker  * conditionally return the token. It will not return a token if the
76*61046927SAndroid Build Coastguard Worker  * parser is currently skipping tokens, (such as within #if
77*61046927SAndroid Build Coastguard Worker  * 0...#else).
78*61046927SAndroid Build Coastguard Worker  *
79*61046927SAndroid Build Coastguard Worker  * The RETURN_TOKEN_NEVER_SKIP macro is a lower-level variant that
80*61046927SAndroid Build Coastguard Worker  * makes the token returning unconditional. This is needed for things
81*61046927SAndroid Build Coastguard Worker  * like #if and the tokens of its condition, (since these must be
82*61046927SAndroid Build Coastguard Worker  * evaluated by the parser even when otherwise skipping).
83*61046927SAndroid Build Coastguard Worker  *
84*61046927SAndroid Build Coastguard Worker  * Finally, RETURN_STRING_TOKEN is a simple convenience wrapper on top
85*61046927SAndroid Build Coastguard Worker  * of RETURN_TOKEN that performs a string copy of yytext before the
86*61046927SAndroid Build Coastguard Worker  * return.
87*61046927SAndroid Build Coastguard Worker  */
88*61046927SAndroid Build Coastguard Worker #define RETURN_TOKEN_NEVER_SKIP(token)					\
89*61046927SAndroid Build Coastguard Worker 	do {								\
90*61046927SAndroid Build Coastguard Worker 		if (glcpp_lex_update_state_per_token (parser, token))	\
91*61046927SAndroid Build Coastguard Worker 			return token;					\
92*61046927SAndroid Build Coastguard Worker 	} while (0)
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker #define RETURN_TOKEN(token)						\
95*61046927SAndroid Build Coastguard Worker 	do {								\
96*61046927SAndroid Build Coastguard Worker 		if (! parser->skipping) {				\
97*61046927SAndroid Build Coastguard Worker 			RETURN_TOKEN_NEVER_SKIP(token);			\
98*61046927SAndroid Build Coastguard Worker 		}							\
99*61046927SAndroid Build Coastguard Worker 	} while(0)
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker #define RETURN_STRING_TOKEN(token)					\
102*61046927SAndroid Build Coastguard Worker 	do {								\
103*61046927SAndroid Build Coastguard Worker 		if (! parser->skipping) {				\
104*61046927SAndroid Build Coastguard Worker 			/* We're not doing linear_strdup here, to avoid \
105*61046927SAndroid Build Coastguard Worker 			 * an implicit call on strlen() for the length  \
106*61046927SAndroid Build Coastguard Worker 			 * of the string, as this is already found by   \
107*61046927SAndroid Build Coastguard Worker 			 * flex and stored in yyleng */                 \
108*61046927SAndroid Build Coastguard Worker 			linear_ctx *mem_ctx = yyextra->linalloc;	\
109*61046927SAndroid Build Coastguard Worker 			yylval->str = linear_alloc_child(mem_ctx,	\
110*61046927SAndroid Build Coastguard Worker 							 yyleng + 1);	\
111*61046927SAndroid Build Coastguard Worker 			memcpy(yylval->str, yytext, yyleng + 1);        \
112*61046927SAndroid Build Coastguard Worker 			RETURN_TOKEN_NEVER_SKIP (token);		\
113*61046927SAndroid Build Coastguard Worker 		}							\
114*61046927SAndroid Build Coastguard Worker 	} while(0)
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker /* Update all state necessary for each token being returned.
118*61046927SAndroid Build Coastguard Worker  *
119*61046927SAndroid Build Coastguard Worker  * Here we'll be tracking newlines and spaces so that the lexer can
120*61046927SAndroid Build Coastguard Worker  * alter its behavior as necessary, (for example, '#' has special
121*61046927SAndroid Build Coastguard Worker  * significance if it is the first non-whitespace, non-comment token
122*61046927SAndroid Build Coastguard Worker  * in a line, but does not otherwise).
123*61046927SAndroid Build Coastguard Worker  *
124*61046927SAndroid Build Coastguard Worker  * NOTE: If this function returns FALSE, then no token should be
125*61046927SAndroid Build Coastguard Worker  * returned at all. This is used to suprress duplicate SPACE tokens.
126*61046927SAndroid Build Coastguard Worker  */
127*61046927SAndroid Build Coastguard Worker static int
glcpp_lex_update_state_per_token(glcpp_parser_t * parser,int token)128*61046927SAndroid Build Coastguard Worker glcpp_lex_update_state_per_token (glcpp_parser_t *parser, int token)
129*61046927SAndroid Build Coastguard Worker {
130*61046927SAndroid Build Coastguard Worker 	if (token != NEWLINE && token != SPACE && token != HASH_TOKEN &&
131*61046927SAndroid Build Coastguard Worker 	    !parser->lexing_version_directive) {
132*61046927SAndroid Build Coastguard Worker 		glcpp_parser_resolve_implicit_version(parser);
133*61046927SAndroid Build Coastguard Worker 	}
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker 	/* After the first non-space token in a line, we won't
136*61046927SAndroid Build Coastguard Worker 	 * allow any '#' to introduce a directive. */
137*61046927SAndroid Build Coastguard Worker 	if (token == NEWLINE) {
138*61046927SAndroid Build Coastguard Worker 		parser->first_non_space_token_this_line = 1;
139*61046927SAndroid Build Coastguard Worker 	} else if (token != SPACE) {
140*61046927SAndroid Build Coastguard Worker 		parser->first_non_space_token_this_line = 0;
141*61046927SAndroid Build Coastguard Worker 	}
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker 	/* Track newlines just to know whether a newline needs
144*61046927SAndroid Build Coastguard Worker 	 * to be inserted if end-of-file comes early. */
145*61046927SAndroid Build Coastguard Worker 	if (token == NEWLINE) {
146*61046927SAndroid Build Coastguard Worker 		parser->last_token_was_newline = 1;
147*61046927SAndroid Build Coastguard Worker 	} else {
148*61046927SAndroid Build Coastguard Worker 		parser->last_token_was_newline = 0;
149*61046927SAndroid Build Coastguard Worker 	}
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker 	/* Track spaces to avoid emitting multiple SPACE
152*61046927SAndroid Build Coastguard Worker 	 * tokens in a row. */
153*61046927SAndroid Build Coastguard Worker 	if (token == SPACE) {
154*61046927SAndroid Build Coastguard Worker 		if (! parser->last_token_was_space) {
155*61046927SAndroid Build Coastguard Worker 			parser->last_token_was_space = 1;
156*61046927SAndroid Build Coastguard Worker 			return 1;
157*61046927SAndroid Build Coastguard Worker 		} else {
158*61046927SAndroid Build Coastguard Worker 			parser->last_token_was_space = 1;
159*61046927SAndroid Build Coastguard Worker 			return 0;
160*61046927SAndroid Build Coastguard Worker 		}
161*61046927SAndroid Build Coastguard Worker 	} else {
162*61046927SAndroid Build Coastguard Worker 		parser->last_token_was_space = 0;
163*61046927SAndroid Build Coastguard Worker 		return 1;
164*61046927SAndroid Build Coastguard Worker 	}
165*61046927SAndroid Build Coastguard Worker }
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker %}
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker %option bison-bridge bison-locations reentrant noyywrap
171*61046927SAndroid Build Coastguard Worker %option extra-type="glcpp_parser_t *"
172*61046927SAndroid Build Coastguard Worker %option prefix="glcpp_"
173*61046927SAndroid Build Coastguard Worker %option stack
174*61046927SAndroid Build Coastguard Worker %option never-interactive
175*61046927SAndroid Build Coastguard Worker %option warn nodefault
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker 	/* Note: When adding any start conditions to this list, you must also
178*61046927SAndroid Build Coastguard Worker 	 * update the "Internal compiler error" catch-all rule near the end of
179*61046927SAndroid Build Coastguard Worker 	 * this file. */
180*61046927SAndroid Build Coastguard Worker 
181*61046927SAndroid Build Coastguard Worker %x COMMENT DEFINE DONE HASH NEWLINE_CATCHUP UNREACHABLE
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker SPACE		[[:space:]]
184*61046927SAndroid Build Coastguard Worker NONSPACE	[^[:space:]]
185*61046927SAndroid Build Coastguard Worker HSPACE		[ \t\v\f]
186*61046927SAndroid Build Coastguard Worker HASH		#
187*61046927SAndroid Build Coastguard Worker NEWLINE		(\r\n|\n\r|\r|\n)
188*61046927SAndroid Build Coastguard Worker IDENTIFIER	[_a-zA-Z][_a-zA-Z0-9]*
189*61046927SAndroid Build Coastguard Worker PP_NUMBER	[.]?[0-9]([._a-zA-Z0-9]|[eEpP][-+])*
190*61046927SAndroid Build Coastguard Worker PUNCTUATION	[][(){}.&*~!/%<>^|;,=+-]
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker /* The OTHER class is simply a catch-all for things that the CPP
193*61046927SAndroid Build Coastguard Worker parser just doesn't care about. Since flex regular expressions that
194*61046927SAndroid Build Coastguard Worker match longer strings take priority over those matching shorter
195*61046927SAndroid Build Coastguard Worker strings, we have to be careful to avoid OTHER matching and hiding
196*61046927SAndroid Build Coastguard Worker something that CPP does care about. So we simply exclude all
197*61046927SAndroid Build Coastguard Worker characters that appear in any other expressions. */
198*61046927SAndroid Build Coastguard Worker 
199*61046927SAndroid Build Coastguard Worker OTHER		[^][_#[:space:]#a-zA-Z0-9(){}.&*~!/%<>^|;,=+-]
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker DIGITS			[0-9][0-9]*
202*61046927SAndroid Build Coastguard Worker DECIMAL_INTEGER		[1-9][0-9]*[uU]?
203*61046927SAndroid Build Coastguard Worker OCTAL_INTEGER		0[0-7]*[uU]?
204*61046927SAndroid Build Coastguard Worker HEXADECIMAL_INTEGER	0[xX][0-9a-fA-F]+[uU]?
205*61046927SAndroid Build Coastguard Worker PATH			["][]^./ _A-Za-z0-9+*%[(){}|&~=!:;,?-]*["]
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker %%
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker 	glcpp_parser_t *parser = yyextra;
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker 	/* When we lex a multi-line comment, we replace it (as
212*61046927SAndroid Build Coastguard Worker 	 * specified) with a single space. But if the comment spanned
213*61046927SAndroid Build Coastguard Worker 	 * multiple lines, then subsequent parsing stages will not
214*61046927SAndroid Build Coastguard Worker 	 * count correct line numbers. To avoid this problem we keep
215*61046927SAndroid Build Coastguard Worker 	 * track of all newlines that were commented out by a
216*61046927SAndroid Build Coastguard Worker 	 * multi-line comment, and we emit a NEWLINE token for each at
217*61046927SAndroid Build Coastguard Worker 	 * the next legal opportunity, (which is when the lexer would
218*61046927SAndroid Build Coastguard Worker 	 * be emitting a NEWLINE token anyway).
219*61046927SAndroid Build Coastguard Worker 	 */
220*61046927SAndroid Build Coastguard Worker 	if (YY_START == NEWLINE_CATCHUP) {
221*61046927SAndroid Build Coastguard Worker 		if (parser->commented_newlines)
222*61046927SAndroid Build Coastguard Worker 			parser->commented_newlines--;
223*61046927SAndroid Build Coastguard Worker 		if (parser->commented_newlines == 0)
224*61046927SAndroid Build Coastguard Worker 			BEGIN INITIAL;
225*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN_NEVER_SKIP (NEWLINE);
226*61046927SAndroid Build Coastguard Worker 	}
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker 	/* Set up the parser->skipping bit here before doing any lexing.
229*61046927SAndroid Build Coastguard Worker 	 *
230*61046927SAndroid Build Coastguard Worker 	 * This bit controls whether tokens are skipped, (as implemented by
231*61046927SAndroid Build Coastguard Worker          * RETURN_TOKEN), such as between "#if 0" and "#endif".
232*61046927SAndroid Build Coastguard Worker 	 *
233*61046927SAndroid Build Coastguard Worker 	 * The parser maintains a skip_stack indicating whether we should be
234*61046927SAndroid Build Coastguard Worker          * skipping, (and nested levels of #if/#ifdef/#ifndef/#endif) will
235*61046927SAndroid Build Coastguard Worker          * push and pop items from the stack.
236*61046927SAndroid Build Coastguard Worker 	 *
237*61046927SAndroid Build Coastguard Worker 	 * Here are the rules for determining whether we are skipping:
238*61046927SAndroid Build Coastguard Worker 	 *
239*61046927SAndroid Build Coastguard Worker 	 *	1. If the skip stack is NULL, we are outside of all #if blocks
240*61046927SAndroid Build Coastguard Worker 	 *         and we are not skipping.
241*61046927SAndroid Build Coastguard Worker 	 *
242*61046927SAndroid Build Coastguard Worker 	 *	2. If the skip stack is non-NULL, the type of the top node in
243*61046927SAndroid Build Coastguard Worker 	 *	   the stack determines whether to skip. A type of
244*61046927SAndroid Build Coastguard Worker 	 *	   SKIP_NO_SKIP is used for blocks wheere we are emitting
245*61046927SAndroid Build Coastguard Worker 	 *	   tokens, (such as between #if 1 and #endif, or after the
246*61046927SAndroid Build Coastguard Worker 	 *	   #else of an #if 0, etc.).
247*61046927SAndroid Build Coastguard Worker 	 *
248*61046927SAndroid Build Coastguard Worker 	 *	3. The lexing_directive bit overrides the skip stack. This bit
249*61046927SAndroid Build Coastguard Worker 	 *	   is set when we are actively lexing the expression for a
250*61046927SAndroid Build Coastguard Worker 	 *	   pre-processor condition, (such as #if, #elif, or #else). In
251*61046927SAndroid Build Coastguard Worker 	 *	   this case, even if otherwise skipping, we need to emit the
252*61046927SAndroid Build Coastguard Worker 	 *	   tokens for this condition so that the parser can evaluate
253*61046927SAndroid Build Coastguard Worker 	 *	   the expression. (For, #else, there's no expression, but we
254*61046927SAndroid Build Coastguard Worker 	 *	   emit tokens so the parser can generate a nice error message
255*61046927SAndroid Build Coastguard Worker 	 *	   if there are any tokens here).
256*61046927SAndroid Build Coastguard Worker 	 */
257*61046927SAndroid Build Coastguard Worker 	if (parser->skip_stack &&
258*61046927SAndroid Build Coastguard Worker 	    parser->skip_stack->type != SKIP_NO_SKIP &&
259*61046927SAndroid Build Coastguard Worker 	    ! parser->lexing_directive)
260*61046927SAndroid Build Coastguard Worker 	{
261*61046927SAndroid Build Coastguard Worker 		parser->skipping = 1;
262*61046927SAndroid Build Coastguard Worker 	} else {
263*61046927SAndroid Build Coastguard Worker 		parser->skipping = 0;
264*61046927SAndroid Build Coastguard Worker 	}
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker 	/* Single-line comments */
267*61046927SAndroid Build Coastguard Worker <INITIAL,DEFINE,HASH>"//"[^\r\n]* {
268*61046927SAndroid Build Coastguard Worker }
269*61046927SAndroid Build Coastguard Worker 
270*61046927SAndroid Build Coastguard Worker 	/* Multi-line comments */
271*61046927SAndroid Build Coastguard Worker <INITIAL,DEFINE,HASH>"/*"   { yy_push_state(COMMENT, yyscanner); }
272*61046927SAndroid Build Coastguard Worker <COMMENT>[^*\r\n]*
273*61046927SAndroid Build Coastguard Worker <COMMENT>[^*\r\n]*{NEWLINE} { yylineno++; yycolumn = 0; parser->commented_newlines++; }
274*61046927SAndroid Build Coastguard Worker <COMMENT>"*"+[^*/\r\n]*
275*61046927SAndroid Build Coastguard Worker <COMMENT>"*"+[^*/\r\n]*{NEWLINE} { yylineno++; yycolumn = 0; parser->commented_newlines++; }
276*61046927SAndroid Build Coastguard Worker <COMMENT>"*"+"/"        {
277*61046927SAndroid Build Coastguard Worker 	yy_pop_state(yyscanner);
278*61046927SAndroid Build Coastguard Worker 	/* In the <HASH> start condition, we don't want any SPACE token. */
279*61046927SAndroid Build Coastguard Worker 	if (yyextra->space_tokens && YY_START != HASH)
280*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN (SPACE);
281*61046927SAndroid Build Coastguard Worker }
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker {HASH} {
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker 	/* If the '#' is the first non-whitespace, non-comment token on this
286*61046927SAndroid Build Coastguard Worker 	 * line, then it introduces a directive, switch to the <HASH> start
287*61046927SAndroid Build Coastguard Worker 	 * condition.
288*61046927SAndroid Build Coastguard Worker 	 *
289*61046927SAndroid Build Coastguard Worker 	 * Otherwise, this is just punctuation, so return the HASH_TOKEN
290*61046927SAndroid Build Coastguard Worker          * token. */
291*61046927SAndroid Build Coastguard Worker 	if (parser->first_non_space_token_this_line) {
292*61046927SAndroid Build Coastguard Worker 		BEGIN HASH;
293*61046927SAndroid Build Coastguard Worker 		yyextra->in_define = false;
294*61046927SAndroid Build Coastguard Worker 	}
295*61046927SAndroid Build Coastguard Worker 
296*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN_NEVER_SKIP (HASH_TOKEN);
297*61046927SAndroid Build Coastguard Worker }
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker <HASH>version{HSPACE}+ {
300*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
301*61046927SAndroid Build Coastguard Worker 	yyextra->space_tokens = 0;
302*61046927SAndroid Build Coastguard Worker 	yyextra->lexing_version_directive = 1;
303*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (VERSION_TOKEN);
304*61046927SAndroid Build Coastguard Worker }
305*61046927SAndroid Build Coastguard Worker 
306*61046927SAndroid Build Coastguard Worker 	/* Swallow empty #pragma directives, (to avoid confusing the
307*61046927SAndroid Build Coastguard Worker 	 * downstream compiler).
308*61046927SAndroid Build Coastguard Worker 	 *
309*61046927SAndroid Build Coastguard Worker 	 * Note: We use a simple regular expression for the lookahead
310*61046927SAndroid Build Coastguard Worker 	 * here. Specifically, we cannot use the complete {NEWLINE} expression
311*61046927SAndroid Build Coastguard Worker 	 * since it uses alternation and we've found that there's a flex bug
312*61046927SAndroid Build Coastguard Worker 	 * where using alternation in the lookahead portion of a pattern
313*61046927SAndroid Build Coastguard Worker 	 * triggers a buffer overrun. */
314*61046927SAndroid Build Coastguard Worker <HASH>pragma{HSPACE}*/[\r\n] {
315*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
316*61046927SAndroid Build Coastguard Worker }
317*61046927SAndroid Build Coastguard Worker 
318*61046927SAndroid Build Coastguard Worker 	/* glcpp doesn't handle #extension, #version, or #pragma directives.
319*61046927SAndroid Build Coastguard Worker 	 * Simply pass them through to the main compiler's lexer/parser. */
320*61046927SAndroid Build Coastguard Worker <HASH>(extension|pragma)[^\r\n]* {
321*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
322*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (PRAGMA);
323*61046927SAndroid Build Coastguard Worker }
324*61046927SAndroid Build Coastguard Worker 
325*61046927SAndroid Build Coastguard Worker <HASH>include{HSPACE}+["<][]^./ _A-Za-z0-9+*%[(){}|&~=!:;,?-]+[">] {
326*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
327*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (INCLUDE);
328*61046927SAndroid Build Coastguard Worker }
329*61046927SAndroid Build Coastguard Worker 
330*61046927SAndroid Build Coastguard Worker <HASH>line{HSPACE}+ {
331*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
332*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (LINE);
333*61046927SAndroid Build Coastguard Worker }
334*61046927SAndroid Build Coastguard Worker 
335*61046927SAndroid Build Coastguard Worker <HASH>{NEWLINE} {
336*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
337*61046927SAndroid Build Coastguard Worker 	yyextra->space_tokens = 0;
338*61046927SAndroid Build Coastguard Worker 	yylineno++;
339*61046927SAndroid Build Coastguard Worker 	yycolumn = 0;
340*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN_NEVER_SKIP (NEWLINE);
341*61046927SAndroid Build Coastguard Worker }
342*61046927SAndroid Build Coastguard Worker 
343*61046927SAndroid Build Coastguard Worker 	/* For the pre-processor directives, we return these tokens
344*61046927SAndroid Build Coastguard Worker 	 * even when we are otherwise skipping. */
345*61046927SAndroid Build Coastguard Worker <HASH>ifdef {
346*61046927SAndroid Build Coastguard Worker 	if (!yyextra->in_define) {
347*61046927SAndroid Build Coastguard Worker 		BEGIN INITIAL;
348*61046927SAndroid Build Coastguard Worker 		yyextra->lexing_directive = 1;
349*61046927SAndroid Build Coastguard Worker 		yyextra->space_tokens = 0;
350*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN_NEVER_SKIP (IFDEF);
351*61046927SAndroid Build Coastguard Worker 	}
352*61046927SAndroid Build Coastguard Worker }
353*61046927SAndroid Build Coastguard Worker 
354*61046927SAndroid Build Coastguard Worker <HASH>ifndef {
355*61046927SAndroid Build Coastguard Worker 	if (!yyextra->in_define) {
356*61046927SAndroid Build Coastguard Worker 		BEGIN INITIAL;
357*61046927SAndroid Build Coastguard Worker 		yyextra->lexing_directive = 1;
358*61046927SAndroid Build Coastguard Worker 		yyextra->space_tokens = 0;
359*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN_NEVER_SKIP (IFNDEF);
360*61046927SAndroid Build Coastguard Worker 	}
361*61046927SAndroid Build Coastguard Worker }
362*61046927SAndroid Build Coastguard Worker 
363*61046927SAndroid Build Coastguard Worker <HASH>if/[^_a-zA-Z0-9] {
364*61046927SAndroid Build Coastguard Worker 	if (!yyextra->in_define) {
365*61046927SAndroid Build Coastguard Worker 		BEGIN INITIAL;
366*61046927SAndroid Build Coastguard Worker 		yyextra->lexing_directive = 1;
367*61046927SAndroid Build Coastguard Worker 		yyextra->space_tokens = 0;
368*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN_NEVER_SKIP (IF);
369*61046927SAndroid Build Coastguard Worker 	}
370*61046927SAndroid Build Coastguard Worker }
371*61046927SAndroid Build Coastguard Worker 
372*61046927SAndroid Build Coastguard Worker <HASH>elif/[^_a-zA-Z0-9] {
373*61046927SAndroid Build Coastguard Worker 	if (!yyextra->in_define) {
374*61046927SAndroid Build Coastguard Worker 		BEGIN INITIAL;
375*61046927SAndroid Build Coastguard Worker 		yyextra->lexing_directive = 1;
376*61046927SAndroid Build Coastguard Worker 		yyextra->space_tokens = 0;
377*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN_NEVER_SKIP (ELIF);
378*61046927SAndroid Build Coastguard Worker 	}
379*61046927SAndroid Build Coastguard Worker }
380*61046927SAndroid Build Coastguard Worker 
381*61046927SAndroid Build Coastguard Worker <HASH>else {
382*61046927SAndroid Build Coastguard Worker 	if (!yyextra->in_define) {
383*61046927SAndroid Build Coastguard Worker 		BEGIN INITIAL;
384*61046927SAndroid Build Coastguard Worker 		yyextra->space_tokens = 0;
385*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN_NEVER_SKIP (ELSE);
386*61046927SAndroid Build Coastguard Worker 	}
387*61046927SAndroid Build Coastguard Worker }
388*61046927SAndroid Build Coastguard Worker 
389*61046927SAndroid Build Coastguard Worker <HASH>endif {
390*61046927SAndroid Build Coastguard Worker 	if (!yyextra->in_define) {
391*61046927SAndroid Build Coastguard Worker 		BEGIN INITIAL;
392*61046927SAndroid Build Coastguard Worker 		yyextra->space_tokens = 0;
393*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN_NEVER_SKIP (ENDIF);
394*61046927SAndroid Build Coastguard Worker 	}
395*61046927SAndroid Build Coastguard Worker }
396*61046927SAndroid Build Coastguard Worker 
397*61046927SAndroid Build Coastguard Worker <HASH>error[^\r\n]* {
398*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
399*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (ERROR_TOKEN);
400*61046927SAndroid Build Coastguard Worker }
401*61046927SAndroid Build Coastguard Worker 
402*61046927SAndroid Build Coastguard Worker 	/* After we see a "#define" we enter the <DEFINE> start state
403*61046927SAndroid Build Coastguard Worker 	 * for the lexer. Within <DEFINE> we are looking for the first
404*61046927SAndroid Build Coastguard Worker 	 * identifier and specifically checking whether the identifier
405*61046927SAndroid Build Coastguard Worker 	 * is followed by a '(' or not, (to lex either a
406*61046927SAndroid Build Coastguard Worker 	 * FUNC_IDENTIFIER or an OBJ_IDENITIFIER token).
407*61046927SAndroid Build Coastguard Worker 	 *
408*61046927SAndroid Build Coastguard Worker 	 * While in the <DEFINE> state we also need to explicitly
409*61046927SAndroid Build Coastguard Worker 	 * handle a few other things that may appear before the
410*61046927SAndroid Build Coastguard Worker 	 * identifier:
411*61046927SAndroid Build Coastguard Worker 	 *
412*61046927SAndroid Build Coastguard Worker 	 * 	* Comments, (handled above with the main support for
413*61046927SAndroid Build Coastguard Worker 	 * 	  comments).
414*61046927SAndroid Build Coastguard Worker 	 *
415*61046927SAndroid Build Coastguard Worker 	 *	* Whitespace (simply ignored)
416*61046927SAndroid Build Coastguard Worker 	 *
417*61046927SAndroid Build Coastguard Worker 	 *	* Anything else, (not an identifier, not a comment,
418*61046927SAndroid Build Coastguard Worker 	 *	  and not whitespace). This will generate an error.
419*61046927SAndroid Build Coastguard Worker 	 */
420*61046927SAndroid Build Coastguard Worker <HASH>define{HSPACE}* {
421*61046927SAndroid Build Coastguard Worker 	yyextra->in_define = true;
422*61046927SAndroid Build Coastguard Worker 	if (!parser->skipping) {
423*61046927SAndroid Build Coastguard Worker 		BEGIN DEFINE;
424*61046927SAndroid Build Coastguard Worker 		yyextra->space_tokens = 0;
425*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN (DEFINE_TOKEN);
426*61046927SAndroid Build Coastguard Worker 	}
427*61046927SAndroid Build Coastguard Worker }
428*61046927SAndroid Build Coastguard Worker 
429*61046927SAndroid Build Coastguard Worker <HASH>undef {
430*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
431*61046927SAndroid Build Coastguard Worker 	yyextra->space_tokens = 0;
432*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (UNDEF);
433*61046927SAndroid Build Coastguard Worker }
434*61046927SAndroid Build Coastguard Worker 
435*61046927SAndroid Build Coastguard Worker <HASH>{HSPACE}+ {
436*61046927SAndroid Build Coastguard Worker 	/* Nothing to do here. Importantly, don't leave the <HASH>
437*61046927SAndroid Build Coastguard Worker 	 * start condition, since it's legal to have space between the
438*61046927SAndroid Build Coastguard Worker 	 * '#' and the directive.. */
439*61046927SAndroid Build Coastguard Worker }
440*61046927SAndroid Build Coastguard Worker 
441*61046927SAndroid Build Coastguard Worker 	/* This will catch any non-directive garbage after a HASH */
442*61046927SAndroid Build Coastguard Worker <HASH>{NONSPACE} {
443*61046927SAndroid Build Coastguard Worker 	if (!parser->skipping) {
444*61046927SAndroid Build Coastguard Worker 		BEGIN INITIAL;
445*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN (GARBAGE);
446*61046927SAndroid Build Coastguard Worker 	}
447*61046927SAndroid Build Coastguard Worker }
448*61046927SAndroid Build Coastguard Worker 
449*61046927SAndroid Build Coastguard Worker 	/* An identifier immediately followed by '(' */
450*61046927SAndroid Build Coastguard Worker <DEFINE>{IDENTIFIER}/"(" {
451*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
452*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (FUNC_IDENTIFIER);
453*61046927SAndroid Build Coastguard Worker }
454*61046927SAndroid Build Coastguard Worker 
455*61046927SAndroid Build Coastguard Worker 	/* An identifier not immediately followed by '(' */
456*61046927SAndroid Build Coastguard Worker <DEFINE>{IDENTIFIER} {
457*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
458*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (OBJ_IDENTIFIER);
459*61046927SAndroid Build Coastguard Worker }
460*61046927SAndroid Build Coastguard Worker 
461*61046927SAndroid Build Coastguard Worker 	/* Whitespace */
462*61046927SAndroid Build Coastguard Worker <DEFINE>{HSPACE}+ {
463*61046927SAndroid Build Coastguard Worker 	/* Just ignore it. Nothing to do here. */
464*61046927SAndroid Build Coastguard Worker }
465*61046927SAndroid Build Coastguard Worker 
466*61046927SAndroid Build Coastguard Worker 	/* '/' not followed by '*', so not a comment. This is an error. */
467*61046927SAndroid Build Coastguard Worker <DEFINE>[/][^*]{NONSPACE}* {
468*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
469*61046927SAndroid Build Coastguard Worker 	glcpp_error(yylloc, yyextra, "#define followed by a non-identifier: %s", yytext);
470*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (INTEGER_STRING);
471*61046927SAndroid Build Coastguard Worker }
472*61046927SAndroid Build Coastguard Worker 
473*61046927SAndroid Build Coastguard Worker 	/* A character that can't start an identifier, comment, or
474*61046927SAndroid Build Coastguard Worker 	 * space. This is an error. */
475*61046927SAndroid Build Coastguard Worker <DEFINE>[^_a-zA-Z/[:space:]]{NONSPACE}* {
476*61046927SAndroid Build Coastguard Worker 	BEGIN INITIAL;
477*61046927SAndroid Build Coastguard Worker 	glcpp_error(yylloc, yyextra, "#define followed by a non-identifier: %s", yytext);
478*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (INTEGER_STRING);
479*61046927SAndroid Build Coastguard Worker }
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker {DECIMAL_INTEGER} {
482*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (INTEGER_STRING);
483*61046927SAndroid Build Coastguard Worker }
484*61046927SAndroid Build Coastguard Worker 
485*61046927SAndroid Build Coastguard Worker {OCTAL_INTEGER} {
486*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (INTEGER_STRING);
487*61046927SAndroid Build Coastguard Worker }
488*61046927SAndroid Build Coastguard Worker 
489*61046927SAndroid Build Coastguard Worker {HEXADECIMAL_INTEGER} {
490*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (INTEGER_STRING);
491*61046927SAndroid Build Coastguard Worker }
492*61046927SAndroid Build Coastguard Worker 
493*61046927SAndroid Build Coastguard Worker "<<"  {
494*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (LEFT_SHIFT);
495*61046927SAndroid Build Coastguard Worker }
496*61046927SAndroid Build Coastguard Worker 
497*61046927SAndroid Build Coastguard Worker ">>" {
498*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (RIGHT_SHIFT);
499*61046927SAndroid Build Coastguard Worker }
500*61046927SAndroid Build Coastguard Worker 
501*61046927SAndroid Build Coastguard Worker "<=" {
502*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (LESS_OR_EQUAL);
503*61046927SAndroid Build Coastguard Worker }
504*61046927SAndroid Build Coastguard Worker 
505*61046927SAndroid Build Coastguard Worker ">=" {
506*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (GREATER_OR_EQUAL);
507*61046927SAndroid Build Coastguard Worker }
508*61046927SAndroid Build Coastguard Worker 
509*61046927SAndroid Build Coastguard Worker "==" {
510*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (EQUAL);
511*61046927SAndroid Build Coastguard Worker }
512*61046927SAndroid Build Coastguard Worker 
513*61046927SAndroid Build Coastguard Worker "!=" {
514*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (NOT_EQUAL);
515*61046927SAndroid Build Coastguard Worker }
516*61046927SAndroid Build Coastguard Worker 
517*61046927SAndroid Build Coastguard Worker "&&" {
518*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (AND);
519*61046927SAndroid Build Coastguard Worker }
520*61046927SAndroid Build Coastguard Worker 
521*61046927SAndroid Build Coastguard Worker "||" {
522*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (OR);
523*61046927SAndroid Build Coastguard Worker }
524*61046927SAndroid Build Coastguard Worker 
525*61046927SAndroid Build Coastguard Worker "++" {
526*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (PLUS_PLUS);
527*61046927SAndroid Build Coastguard Worker }
528*61046927SAndroid Build Coastguard Worker 
529*61046927SAndroid Build Coastguard Worker "--" {
530*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (MINUS_MINUS);
531*61046927SAndroid Build Coastguard Worker }
532*61046927SAndroid Build Coastguard Worker 
533*61046927SAndroid Build Coastguard Worker "##" {
534*61046927SAndroid Build Coastguard Worker 	if (! parser->skipping) {
535*61046927SAndroid Build Coastguard Worker 		if (parser->is_gles)
536*61046927SAndroid Build Coastguard Worker 			glcpp_error(yylloc, yyextra, "Token pasting (##) is illegal in GLES");
537*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN (PASTE);
538*61046927SAndroid Build Coastguard Worker 	}
539*61046927SAndroid Build Coastguard Worker }
540*61046927SAndroid Build Coastguard Worker 
541*61046927SAndroid Build Coastguard Worker "defined" {
542*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (DEFINED);
543*61046927SAndroid Build Coastguard Worker }
544*61046927SAndroid Build Coastguard Worker 
545*61046927SAndroid Build Coastguard Worker {IDENTIFIER} {
546*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (IDENTIFIER);
547*61046927SAndroid Build Coastguard Worker }
548*61046927SAndroid Build Coastguard Worker 
549*61046927SAndroid Build Coastguard Worker {PP_NUMBER} {
550*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (OTHER);
551*61046927SAndroid Build Coastguard Worker }
552*61046927SAndroid Build Coastguard Worker 
553*61046927SAndroid Build Coastguard Worker {PUNCTUATION} {
554*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN (yytext[0]);
555*61046927SAndroid Build Coastguard Worker }
556*61046927SAndroid Build Coastguard Worker 
557*61046927SAndroid Build Coastguard Worker {OTHER}+ {
558*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (OTHER);
559*61046927SAndroid Build Coastguard Worker }
560*61046927SAndroid Build Coastguard Worker 
561*61046927SAndroid Build Coastguard Worker {HSPACE} {
562*61046927SAndroid Build Coastguard Worker 	if (yyextra->space_tokens) {
563*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN (SPACE);
564*61046927SAndroid Build Coastguard Worker 	}
565*61046927SAndroid Build Coastguard Worker }
566*61046927SAndroid Build Coastguard Worker 
567*61046927SAndroid Build Coastguard Worker {PATH} {
568*61046927SAndroid Build Coastguard Worker 	RETURN_STRING_TOKEN (PATH);
569*61046927SAndroid Build Coastguard Worker }
570*61046927SAndroid Build Coastguard Worker 
571*61046927SAndroid Build Coastguard Worker 	/* We preserve all newlines, even between #if 0..#endif, so no
572*61046927SAndroid Build Coastguard Worker 	skipping.. */
573*61046927SAndroid Build Coastguard Worker <*>{NEWLINE} {
574*61046927SAndroid Build Coastguard Worker 	if (parser->commented_newlines) {
575*61046927SAndroid Build Coastguard Worker 		BEGIN NEWLINE_CATCHUP;
576*61046927SAndroid Build Coastguard Worker 	} else {
577*61046927SAndroid Build Coastguard Worker 		BEGIN INITIAL;
578*61046927SAndroid Build Coastguard Worker 	}
579*61046927SAndroid Build Coastguard Worker 	yyextra->space_tokens = 1;
580*61046927SAndroid Build Coastguard Worker 	yyextra->lexing_directive = 0;
581*61046927SAndroid Build Coastguard Worker 	yyextra->lexing_version_directive = 0;
582*61046927SAndroid Build Coastguard Worker 	yylineno++;
583*61046927SAndroid Build Coastguard Worker 	yycolumn = 0;
584*61046927SAndroid Build Coastguard Worker 	RETURN_TOKEN_NEVER_SKIP (NEWLINE);
585*61046927SAndroid Build Coastguard Worker }
586*61046927SAndroid Build Coastguard Worker 
587*61046927SAndroid Build Coastguard Worker <INITIAL,COMMENT,DEFINE,HASH><<EOF>> {
588*61046927SAndroid Build Coastguard Worker 	if (YY_START == COMMENT)
589*61046927SAndroid Build Coastguard Worker 		glcpp_error(yylloc, yyextra, "Unterminated comment");
590*61046927SAndroid Build Coastguard Worker 	BEGIN DONE; /* Don't keep matching this rule forever. */
591*61046927SAndroid Build Coastguard Worker 	yyextra->lexing_directive = 0;
592*61046927SAndroid Build Coastguard Worker 	yyextra->lexing_version_directive = 0;
593*61046927SAndroid Build Coastguard Worker 	if (! parser->last_token_was_newline)
594*61046927SAndroid Build Coastguard Worker 		RETURN_TOKEN (NEWLINE);
595*61046927SAndroid Build Coastguard Worker }
596*61046927SAndroid Build Coastguard Worker 
597*61046927SAndroid Build Coastguard Worker 	/* This is a catch-all to avoid the annoying default flex action which
598*61046927SAndroid Build Coastguard Worker 	 * matches any character and prints it. If any input ever matches this
599*61046927SAndroid Build Coastguard Worker 	 * rule, then we have made a mistake above and need to fix one or more
600*61046927SAndroid Build Coastguard Worker 	 * of the preceding patterns to match that input. */
601*61046927SAndroid Build Coastguard Worker 
602*61046927SAndroid Build Coastguard Worker <*>. {
603*61046927SAndroid Build Coastguard Worker 	glcpp_error(yylloc, yyextra, "Internal compiler error: Unexpected character: %s", yytext);
604*61046927SAndroid Build Coastguard Worker 
605*61046927SAndroid Build Coastguard Worker 	/* We don't actually use the UNREACHABLE start condition. We
606*61046927SAndroid Build Coastguard Worker 	only have this block here so that we can pretend to call some
607*61046927SAndroid Build Coastguard Worker 	generated functions, (to avoid "defined but not used"
608*61046927SAndroid Build Coastguard Worker 	warnings. */
609*61046927SAndroid Build Coastguard Worker         if (YY_START == UNREACHABLE) {
610*61046927SAndroid Build Coastguard Worker 		unput('.');
611*61046927SAndroid Build Coastguard Worker 		yy_top_state(yyextra);
612*61046927SAndroid Build Coastguard Worker 	}
613*61046927SAndroid Build Coastguard Worker }
614*61046927SAndroid Build Coastguard Worker 
615*61046927SAndroid Build Coastguard Worker %%
616*61046927SAndroid Build Coastguard Worker 
617*61046927SAndroid Build Coastguard Worker void
618*61046927SAndroid Build Coastguard Worker glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader)
619*61046927SAndroid Build Coastguard Worker {
620*61046927SAndroid Build Coastguard Worker 	yy_scan_string(shader, parser->scanner);
621*61046927SAndroid Build Coastguard Worker }
622