xref: /aosp_15_r20/external/mesa3d/src/compiler/glsl/glsl_lexer.ll (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker%{
2*61046927SAndroid Build Coastguard Worker/*
3*61046927SAndroid Build Coastguard Worker * Copyright © 2008, 2009 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#include <ctype.h>
25*61046927SAndroid Build Coastguard Worker#include <limits.h>
26*61046927SAndroid Build Coastguard Worker#include "util/strtod.h"
27*61046927SAndroid Build Coastguard Worker#include "ast.h"
28*61046927SAndroid Build Coastguard Worker#include "glsl_parser_extras.h"
29*61046927SAndroid Build Coastguard Worker#include "glsl_parser.h"
30*61046927SAndroid Build Coastguard Worker#include "main/consts_exts.h"
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Workerstatic int classify_identifier(struct _mesa_glsl_parse_state *, const char *,
33*61046927SAndroid Build Coastguard Worker			       unsigned name_len, YYSTYPE *output);
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker#ifdef _MSC_VER
36*61046927SAndroid Build Coastguard Worker#define YY_NO_UNISTD_H
37*61046927SAndroid Build Coastguard Worker#endif
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker#define YY_NO_INPUT
40*61046927SAndroid Build Coastguard Worker#define YY_USER_ACTION						\
41*61046927SAndroid Build Coastguard Worker   do {								\
42*61046927SAndroid Build Coastguard Worker      yylloc->first_column = yycolumn + 1;			\
43*61046927SAndroid Build Coastguard Worker      yylloc->first_line = yylloc->last_line = yylineno + 1;	\
44*61046927SAndroid Build Coastguard Worker      yycolumn += yyleng;					\
45*61046927SAndroid Build Coastguard Worker      yylloc->last_column = yycolumn + 1;			\
46*61046927SAndroid Build Coastguard Worker   } while(0);
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker#define YY_USER_INIT yylineno = 0; yycolumn = 0; yylloc->source = 0; \
49*61046927SAndroid Build Coastguard Worker   yylloc->path = NULL;
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker/* A macro for handling reserved words and keywords across language versions.
52*61046927SAndroid Build Coastguard Worker *
53*61046927SAndroid Build Coastguard Worker * Certain words start out as identifiers, become reserved words in
54*61046927SAndroid Build Coastguard Worker * later language revisions, and finally become language keywords.
55*61046927SAndroid Build Coastguard Worker * This may happen at different times in desktop GLSL and GLSL ES.
56*61046927SAndroid Build Coastguard Worker *
57*61046927SAndroid Build Coastguard Worker * For example, consider the following lexer rule:
58*61046927SAndroid Build Coastguard Worker * samplerBuffer       KEYWORD(130, 0, 140, 0, SAMPLERBUFFER)
59*61046927SAndroid Build Coastguard Worker *
60*61046927SAndroid Build Coastguard Worker * This means that "samplerBuffer" will be treated as:
61*61046927SAndroid Build Coastguard Worker * - a keyword (SAMPLERBUFFER token)         ...in GLSL >= 1.40
62*61046927SAndroid Build Coastguard Worker * - a reserved word - error                 ...in GLSL >= 1.30
63*61046927SAndroid Build Coastguard Worker * - an identifier                           ...in GLSL <  1.30 or GLSL ES
64*61046927SAndroid Build Coastguard Worker */
65*61046927SAndroid Build Coastguard Worker#define KEYWORD(reserved_glsl, reserved_glsl_es,			\
66*61046927SAndroid Build Coastguard Worker                allowed_glsl, allowed_glsl_es, token)			\
67*61046927SAndroid Build Coastguard Worker   KEYWORD_WITH_ALT(reserved_glsl, reserved_glsl_es,			\
68*61046927SAndroid Build Coastguard Worker                    allowed_glsl, allowed_glsl_es, false, token)
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker/**
71*61046927SAndroid Build Coastguard Worker * Like the KEYWORD macro, but the word is also treated as a keyword
72*61046927SAndroid Build Coastguard Worker * if the given boolean expression is true.
73*61046927SAndroid Build Coastguard Worker */
74*61046927SAndroid Build Coastguard Worker#define KEYWORD_WITH_ALT(reserved_glsl, reserved_glsl_es,		\
75*61046927SAndroid Build Coastguard Worker                         allowed_glsl, allowed_glsl_es,			\
76*61046927SAndroid Build Coastguard Worker                         alt_expr, token)				\
77*61046927SAndroid Build Coastguard Worker   do {									\
78*61046927SAndroid Build Coastguard Worker      if (yyextra->is_version(allowed_glsl, allowed_glsl_es)		\
79*61046927SAndroid Build Coastguard Worker          || (alt_expr)) {						\
80*61046927SAndroid Build Coastguard Worker	 return token;							\
81*61046927SAndroid Build Coastguard Worker      } else if (yyextra->is_version(reserved_glsl,			\
82*61046927SAndroid Build Coastguard Worker                                     reserved_glsl_es)) {		\
83*61046927SAndroid Build Coastguard Worker	 _mesa_glsl_error(yylloc, yyextra,				\
84*61046927SAndroid Build Coastguard Worker			  "illegal use of reserved word `%s'", yytext);	\
85*61046927SAndroid Build Coastguard Worker	 return ERROR_TOK;						\
86*61046927SAndroid Build Coastguard Worker      } else {								\
87*61046927SAndroid Build Coastguard Worker	 return classify_identifier(yyextra, yytext, yyleng, yylval);	\
88*61046927SAndroid Build Coastguard Worker      }									\
89*61046927SAndroid Build Coastguard Worker   } while (0)
90*61046927SAndroid Build Coastguard Worker
91*61046927SAndroid Build Coastguard Worker/**
92*61046927SAndroid Build Coastguard Worker * Like KEYWORD_WITH_ALT, but used for built-in GLSL types
93*61046927SAndroid Build Coastguard Worker */
94*61046927SAndroid Build Coastguard Worker#define TYPE_WITH_ALT(reserved_glsl, reserved_glsl_es,			\
95*61046927SAndroid Build Coastguard Worker		      allowed_glsl, allowed_glsl_es,			\
96*61046927SAndroid Build Coastguard Worker		      alt_expr, gtype)					\
97*61046927SAndroid Build Coastguard Worker   do {									\
98*61046927SAndroid Build Coastguard Worker      if (yyextra->is_version(allowed_glsl, allowed_glsl_es)		\
99*61046927SAndroid Build Coastguard Worker          || (alt_expr)) {						\
100*61046927SAndroid Build Coastguard Worker	 yylval->type = gtype; 						\
101*61046927SAndroid Build Coastguard Worker	 return BASIC_TYPE_TOK;						\
102*61046927SAndroid Build Coastguard Worker      } else if (yyextra->is_version(reserved_glsl,			\
103*61046927SAndroid Build Coastguard Worker                                     reserved_glsl_es)) {		\
104*61046927SAndroid Build Coastguard Worker	 _mesa_glsl_error(yylloc, yyextra,				\
105*61046927SAndroid Build Coastguard Worker			  "illegal use of reserved word `%s'", yytext);	\
106*61046927SAndroid Build Coastguard Worker	 return ERROR_TOK;						\
107*61046927SAndroid Build Coastguard Worker      } else {								\
108*61046927SAndroid Build Coastguard Worker	 return classify_identifier(yyextra, yytext, yyleng, yylval);	\
109*61046927SAndroid Build Coastguard Worker      }									\
110*61046927SAndroid Build Coastguard Worker   } while (0)
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Worker#define TYPE(reserved_glsl, reserved_glsl_es,				\
113*61046927SAndroid Build Coastguard Worker             allowed_glsl, allowed_glsl_es,				\
114*61046927SAndroid Build Coastguard Worker             gtype)							\
115*61046927SAndroid Build Coastguard Worker   TYPE_WITH_ALT(reserved_glsl, reserved_glsl_es,			\
116*61046927SAndroid Build Coastguard Worker                 allowed_glsl, allowed_glsl_es,				\
117*61046927SAndroid Build Coastguard Worker                 false, gtype)
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Worker/**
120*61046927SAndroid Build Coastguard Worker * A macro for handling keywords that have been present in GLSL since
121*61046927SAndroid Build Coastguard Worker * its origin, but were changed into reserved words in later versions.
122*61046927SAndroid Build Coastguard Worker */
123*61046927SAndroid Build Coastguard Worker#define DEPRECATED_KEYWORD(token, state, reserved_glsl,			\
124*61046927SAndroid Build Coastguard Worker                           reserved_glsl_es)				\
125*61046927SAndroid Build Coastguard Worker   do {									\
126*61046927SAndroid Build Coastguard Worker      if (yyextra->is_version(reserved_glsl, reserved_glsl_es) &&	\
127*61046927SAndroid Build Coastguard Worker          !state->compat_shader) {					\
128*61046927SAndroid Build Coastguard Worker	 _mesa_glsl_error(yylloc, yyextra,				\
129*61046927SAndroid Build Coastguard Worker			  "illegal use of reserved word `%s'", yytext);	\
130*61046927SAndroid Build Coastguard Worker	 return ERROR_TOK;						\
131*61046927SAndroid Build Coastguard Worker      } else {								\
132*61046927SAndroid Build Coastguard Worker         return token;							\
133*61046927SAndroid Build Coastguard Worker      }									\
134*61046927SAndroid Build Coastguard Worker   } while (0)
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker/**
137*61046927SAndroid Build Coastguard Worker * Like DEPRECATED_KEYWORD, but for types
138*61046927SAndroid Build Coastguard Worker */
139*61046927SAndroid Build Coastguard Worker#define DEPRECATED_ES_TYPE_WITH_ALT(alt_expr, gtype)			\
140*61046927SAndroid Build Coastguard Worker   do {									\
141*61046927SAndroid Build Coastguard Worker      if (yyextra->is_version(0, 300)) {				\
142*61046927SAndroid Build Coastguard Worker         _mesa_glsl_error(yylloc, yyextra,				\
143*61046927SAndroid Build Coastguard Worker                          "illegal use of reserved word `%s'", yytext);	\
144*61046927SAndroid Build Coastguard Worker         return ERROR_TOK;						\
145*61046927SAndroid Build Coastguard Worker      } else if (alt_expr) {						\
146*61046927SAndroid Build Coastguard Worker         yylval->type = gtype;						\
147*61046927SAndroid Build Coastguard Worker         return BASIC_TYPE_TOK;						\
148*61046927SAndroid Build Coastguard Worker      } else {								\
149*61046927SAndroid Build Coastguard Worker         return classify_identifier(yyextra, yytext, yyleng, yylval);	\
150*61046927SAndroid Build Coastguard Worker      }									\
151*61046927SAndroid Build Coastguard Worker   } while (0)
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard Worker#define DEPRECATED_ES_TYPE(gtype)					\
154*61046927SAndroid Build Coastguard Worker   DEPRECATED_ES_TYPE_WITH_ALT(true, gtype)
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Workerstatic int
157*61046927SAndroid Build Coastguard Workerliteral_integer(char *text, int len, struct _mesa_glsl_parse_state *state,
158*61046927SAndroid Build Coastguard Worker		YYSTYPE *lval, YYLTYPE *lloc, int base)
159*61046927SAndroid Build Coastguard Worker{
160*61046927SAndroid Build Coastguard Worker   bool is_uint = (text[len - 1] == 'u' ||
161*61046927SAndroid Build Coastguard Worker		   text[len - 1] == 'U');
162*61046927SAndroid Build Coastguard Worker   bool is_long = (text[len - 1] == 'l' || text[len - 1] == 'L');
163*61046927SAndroid Build Coastguard Worker   const char *digits = text;
164*61046927SAndroid Build Coastguard Worker
165*61046927SAndroid Build Coastguard Worker   if (is_long)
166*61046927SAndroid Build Coastguard Worker      is_uint = (text[len - 2] == 'u' && text[len - 1] == 'l') ||
167*61046927SAndroid Build Coastguard Worker                (text[len - 2] == 'U' && text[len - 1] == 'L');
168*61046927SAndroid Build Coastguard Worker   /* Skip "0x" */
169*61046927SAndroid Build Coastguard Worker   if (base == 16)
170*61046927SAndroid Build Coastguard Worker      digits += 2;
171*61046927SAndroid Build Coastguard Worker
172*61046927SAndroid Build Coastguard Worker   unsigned long long value = strtoull(digits, NULL, base);
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker   if (is_long)
175*61046927SAndroid Build Coastguard Worker      lval->n64 = (int64_t)value;
176*61046927SAndroid Build Coastguard Worker   else
177*61046927SAndroid Build Coastguard Worker      lval->n = (int)value;
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker   if (is_long && !is_uint && base == 10 && value > (uint64_t)LLONG_MAX + 1) {
180*61046927SAndroid Build Coastguard Worker      /* Tries to catch unintentionally providing a negative value. */
181*61046927SAndroid Build Coastguard Worker      _mesa_glsl_warning(lloc, state,
182*61046927SAndroid Build Coastguard Worker                         "signed literal value `%s' is interpreted as %lld",
183*61046927SAndroid Build Coastguard Worker                         text, lval->n64);
184*61046927SAndroid Build Coastguard Worker   } else if (!is_long && value > UINT_MAX) {
185*61046927SAndroid Build Coastguard Worker      /* Note that signed 0xffffffff is valid, not out of range! */
186*61046927SAndroid Build Coastguard Worker      if (state->is_version(130, 300)) {
187*61046927SAndroid Build Coastguard Worker	 _mesa_glsl_error(lloc, state,
188*61046927SAndroid Build Coastguard Worker			  "literal value `%s' out of range", text);
189*61046927SAndroid Build Coastguard Worker      } else {
190*61046927SAndroid Build Coastguard Worker	 _mesa_glsl_warning(lloc, state,
191*61046927SAndroid Build Coastguard Worker			    "literal value `%s' out of range", text);
192*61046927SAndroid Build Coastguard Worker      }
193*61046927SAndroid Build Coastguard Worker   } else if (base == 10 && !is_uint && (unsigned)value > (unsigned)INT_MAX + 1) {
194*61046927SAndroid Build Coastguard Worker      /* Tries to catch unintentionally providing a negative value.
195*61046927SAndroid Build Coastguard Worker       * Note that -2147483648 is parsed as -(2147483648), so we don't
196*61046927SAndroid Build Coastguard Worker       * want to warn for INT_MAX.
197*61046927SAndroid Build Coastguard Worker       */
198*61046927SAndroid Build Coastguard Worker      _mesa_glsl_warning(lloc, state,
199*61046927SAndroid Build Coastguard Worker			 "signed literal value `%s' is interpreted as %d",
200*61046927SAndroid Build Coastguard Worker			 text, lval->n);
201*61046927SAndroid Build Coastguard Worker   }
202*61046927SAndroid Build Coastguard Worker   if (is_long)
203*61046927SAndroid Build Coastguard Worker      return is_uint ? UINT64CONSTANT : INT64CONSTANT;
204*61046927SAndroid Build Coastguard Worker   else
205*61046927SAndroid Build Coastguard Worker      return is_uint ? UINTCONSTANT : INTCONSTANT;
206*61046927SAndroid Build Coastguard Worker}
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard Worker#define LITERAL_INTEGER(base) \
209*61046927SAndroid Build Coastguard Worker   literal_integer(yytext, yyleng, yyextra, yylval, yylloc, base)
210*61046927SAndroid Build Coastguard Worker
211*61046927SAndroid Build Coastguard Worker%}
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker%option bison-bridge bison-locations reentrant noyywrap
214*61046927SAndroid Build Coastguard Worker%option nounput noyy_top_state
215*61046927SAndroid Build Coastguard Worker%option never-interactive
216*61046927SAndroid Build Coastguard Worker%option prefix="_mesa_glsl_lexer_"
217*61046927SAndroid Build Coastguard Worker%option extra-type="struct _mesa_glsl_parse_state *"
218*61046927SAndroid Build Coastguard Worker%option warn nodefault
219*61046927SAndroid Build Coastguard Worker
220*61046927SAndroid Build Coastguard Worker	/* Note: When adding any start conditions to this list, you must also
221*61046927SAndroid Build Coastguard Worker	 * update the "Internal compiler error" catch-all rule near the end of
222*61046927SAndroid Build Coastguard Worker	 * this file. */
223*61046927SAndroid Build Coastguard Worker%x PP PRAGMA
224*61046927SAndroid Build Coastguard Worker
225*61046927SAndroid Build Coastguard WorkerDEC_INT		[1-9][0-9]*
226*61046927SAndroid Build Coastguard WorkerHEX_INT		0[xX][0-9a-fA-F]+
227*61046927SAndroid Build Coastguard WorkerOCT_INT		0[0-7]*
228*61046927SAndroid Build Coastguard WorkerINT		({DEC_INT}|{HEX_INT}|{OCT_INT})
229*61046927SAndroid Build Coastguard WorkerSPC		[ \t]*
230*61046927SAndroid Build Coastguard WorkerSPCP		[ \t]+
231*61046927SAndroid Build Coastguard WorkerHASH		^{SPC}#{SPC}
232*61046927SAndroid Build Coastguard WorkerPATH		["][./ _A-Za-z0-9]*["]
233*61046927SAndroid Build Coastguard Worker%%
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker[ \r\t]+		;
236*61046927SAndroid Build Coastguard Worker
237*61046927SAndroid Build Coastguard Worker    /* Preprocessor tokens. */
238*61046927SAndroid Build Coastguard Worker^[ \t]*#[ \t]*$			;
239*61046927SAndroid Build Coastguard Worker^[ \t]*#[ \t]*version		{ BEGIN PP; return VERSION_TOK; }
240*61046927SAndroid Build Coastguard Worker^[ \t]*#[ \t]*extension		{ BEGIN PP; return EXTENSION; }
241*61046927SAndroid Build Coastguard Worker{HASH}include {
242*61046927SAndroid Build Coastguard Worker                                  if (!yyextra->ARB_shading_language_include_enable) {
243*61046927SAndroid Build Coastguard Worker                                     struct _mesa_glsl_parse_state *state = yyextra;
244*61046927SAndroid Build Coastguard Worker                                     _mesa_glsl_error(yylloc, state,
245*61046927SAndroid Build Coastguard Worker                                                      "ARB_shading_language_include required "
246*61046927SAndroid Build Coastguard Worker                                                      "to use #include");
247*61046927SAndroid Build Coastguard Worker                                   }
248*61046927SAndroid Build Coastguard Worker}
249*61046927SAndroid Build Coastguard Worker{HASH}line{SPCP}{INT}{SPCP}{INT}{SPC}$ {
250*61046927SAndroid Build Coastguard Worker				   /* Eat characters until the first digit is
251*61046927SAndroid Build Coastguard Worker				    * encountered
252*61046927SAndroid Build Coastguard Worker				    */
253*61046927SAndroid Build Coastguard Worker				   char *ptr = yytext;
254*61046927SAndroid Build Coastguard Worker				   while (!isdigit(*ptr))
255*61046927SAndroid Build Coastguard Worker				      ptr++;
256*61046927SAndroid Build Coastguard Worker
257*61046927SAndroid Build Coastguard Worker				   /* Subtract one from the line number because
258*61046927SAndroid Build Coastguard Worker				    * yylineno is zero-based instead of
259*61046927SAndroid Build Coastguard Worker				    * one-based.
260*61046927SAndroid Build Coastguard Worker				    */
261*61046927SAndroid Build Coastguard Worker				   yylineno = strtol(ptr, &ptr, 0) - 1;
262*61046927SAndroid Build Coastguard Worker
263*61046927SAndroid Build Coastguard Worker                                   /* From GLSL 3.30 and GLSL ES on, after processing the
264*61046927SAndroid Build Coastguard Worker                                    * line directive (including its new-line), the implementation
265*61046927SAndroid Build Coastguard Worker                                    * will behave as if it is compiling at the line number passed
266*61046927SAndroid Build Coastguard Worker                                    * as argument. It was line number + 1 in older specifications.
267*61046927SAndroid Build Coastguard Worker                                    */
268*61046927SAndroid Build Coastguard Worker                                   if (yyextra->is_version(330, 100))
269*61046927SAndroid Build Coastguard Worker                                      yylineno--;
270*61046927SAndroid Build Coastguard Worker
271*61046927SAndroid Build Coastguard Worker				   yylloc->source = strtol(ptr, NULL, 0);
272*61046927SAndroid Build Coastguard Worker                                   yylloc->path = NULL;
273*61046927SAndroid Build Coastguard Worker				}
274*61046927SAndroid Build Coastguard Worker{HASH}line{SPCP}{INT}{SPCP}{PATH}{SPC}$ {
275*61046927SAndroid Build Coastguard Worker                                   if (!yyextra->ARB_shading_language_include_enable) {
276*61046927SAndroid Build Coastguard Worker                                      struct _mesa_glsl_parse_state *state = yyextra;
277*61046927SAndroid Build Coastguard Worker                                      _mesa_glsl_error(yylloc, state,
278*61046927SAndroid Build Coastguard Worker                                                       "ARB_shading_language_include required "
279*61046927SAndroid Build Coastguard Worker                                                       "to use #line <line> \"<path>\"");
280*61046927SAndroid Build Coastguard Worker                                   }
281*61046927SAndroid Build Coastguard Worker
282*61046927SAndroid Build Coastguard Worker                                   /* Eat characters until the first digit is
283*61046927SAndroid Build Coastguard Worker                                    * encountered
284*61046927SAndroid Build Coastguard Worker                                    */
285*61046927SAndroid Build Coastguard Worker                                   char *ptr = yytext;
286*61046927SAndroid Build Coastguard Worker                                   while (!isdigit(*ptr))
287*61046927SAndroid Build Coastguard Worker                                      ptr++;
288*61046927SAndroid Build Coastguard Worker
289*61046927SAndroid Build Coastguard Worker                                   /* Subtract one from the line number because
290*61046927SAndroid Build Coastguard Worker                                    * yylineno is zero-based instead of
291*61046927SAndroid Build Coastguard Worker                                    * one-based.
292*61046927SAndroid Build Coastguard Worker                                    */
293*61046927SAndroid Build Coastguard Worker                                   yylineno = strtol(ptr, &ptr, 0) - 1;
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Worker                                   /* From GLSL 3.30 and GLSL ES on, after processing the
296*61046927SAndroid Build Coastguard Worker                                    * line directive (including its new-line), the implementation
297*61046927SAndroid Build Coastguard Worker                                    * will behave as if it is compiling at the line number passed
298*61046927SAndroid Build Coastguard Worker                                    * as argument. It was line number + 1 in older specifications.
299*61046927SAndroid Build Coastguard Worker                                    */
300*61046927SAndroid Build Coastguard Worker                                   if (yyextra->is_version(330, 100))
301*61046927SAndroid Build Coastguard Worker                                      yylineno--;
302*61046927SAndroid Build Coastguard Worker
303*61046927SAndroid Build Coastguard Worker                                   while (isspace(*ptr))
304*61046927SAndroid Build Coastguard Worker                                      ptr++;
305*61046927SAndroid Build Coastguard Worker
306*61046927SAndroid Build Coastguard Worker                                   /* Skip over leading " */
307*61046927SAndroid Build Coastguard Worker                                   ptr++;
308*61046927SAndroid Build Coastguard Worker
309*61046927SAndroid Build Coastguard Worker                                   char *end = strrchr(ptr, '"');
310*61046927SAndroid Build Coastguard Worker                                   int path_len = (end - ptr) + 1;
311*61046927SAndroid Build Coastguard Worker                                   linear_ctx *mem_ctx = yyextra->linalloc;
312*61046927SAndroid Build Coastguard Worker                                   yylloc->path = (char *) linear_alloc_child(mem_ctx, path_len);
313*61046927SAndroid Build Coastguard Worker                                   memcpy(yylloc->path, ptr, path_len);
314*61046927SAndroid Build Coastguard Worker                                   yylloc->path[path_len - 1] = '\0';
315*61046927SAndroid Build Coastguard Worker                                }
316*61046927SAndroid Build Coastguard Worker{HASH}line{SPCP}{INT}{SPC}$	{
317*61046927SAndroid Build Coastguard Worker				   /* Eat characters until the first digit is
318*61046927SAndroid Build Coastguard Worker				    * encountered
319*61046927SAndroid Build Coastguard Worker				    */
320*61046927SAndroid Build Coastguard Worker				   char *ptr = yytext;
321*61046927SAndroid Build Coastguard Worker				   while (!isdigit(*ptr))
322*61046927SAndroid Build Coastguard Worker				      ptr++;
323*61046927SAndroid Build Coastguard Worker
324*61046927SAndroid Build Coastguard Worker				   /* Subtract one from the line number because
325*61046927SAndroid Build Coastguard Worker				    * yylineno is zero-based instead of
326*61046927SAndroid Build Coastguard Worker				    * one-based.
327*61046927SAndroid Build Coastguard Worker				    */
328*61046927SAndroid Build Coastguard Worker				   yylineno = strtol(ptr, &ptr, 0) - 1;
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker                                   /* From GLSL 3.30 and GLSL ES on, after processing the
331*61046927SAndroid Build Coastguard Worker                                    * line directive (including its new-line), the implementation
332*61046927SAndroid Build Coastguard Worker                                    * will behave as if it is compiling at the line number passed
333*61046927SAndroid Build Coastguard Worker                                    * as argument. It was line number + 1 in older specifications.
334*61046927SAndroid Build Coastguard Worker                                    */
335*61046927SAndroid Build Coastguard Worker                                   if (yyextra->is_version(330, 100))
336*61046927SAndroid Build Coastguard Worker                                      yylineno--;
337*61046927SAndroid Build Coastguard Worker				}
338*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}on{SPC}\) {
339*61046927SAndroid Build Coastguard Worker				  BEGIN PP;
340*61046927SAndroid Build Coastguard Worker				  return PRAGMA_DEBUG_ON;
341*61046927SAndroid Build Coastguard Worker				}
342*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}off{SPC}\) {
343*61046927SAndroid Build Coastguard Worker				  BEGIN PP;
344*61046927SAndroid Build Coastguard Worker				  return PRAGMA_DEBUG_OFF;
345*61046927SAndroid Build Coastguard Worker				}
346*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}optimize{SPC}\({SPC}on{SPC}\) {
347*61046927SAndroid Build Coastguard Worker				  BEGIN PP;
348*61046927SAndroid Build Coastguard Worker				  return PRAGMA_OPTIMIZE_ON;
349*61046927SAndroid Build Coastguard Worker				}
350*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}optimize{SPC}\({SPC}off{SPC}\) {
351*61046927SAndroid Build Coastguard Worker				  BEGIN PP;
352*61046927SAndroid Build Coastguard Worker				  return PRAGMA_OPTIMIZE_OFF;
353*61046927SAndroid Build Coastguard Worker				}
354*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}warning{SPC}\({SPC}on{SPC}\) {
355*61046927SAndroid Build Coastguard Worker				  BEGIN PP;
356*61046927SAndroid Build Coastguard Worker				  return PRAGMA_WARNING_ON;
357*61046927SAndroid Build Coastguard Worker				}
358*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}warning{SPC}\({SPC}off{SPC}\) {
359*61046927SAndroid Build Coastguard Worker				  BEGIN PP;
360*61046927SAndroid Build Coastguard Worker				  return PRAGMA_WARNING_OFF;
361*61046927SAndroid Build Coastguard Worker				}
362*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}STDGL{SPCP}invariant{SPC}\({SPC}all{SPC}\) {
363*61046927SAndroid Build Coastguard Worker				  BEGIN PP;
364*61046927SAndroid Build Coastguard Worker				  return PRAGMA_INVARIANT_ALL;
365*61046927SAndroid Build Coastguard Worker				}
366*61046927SAndroid Build Coastguard Worker^{SPC}#{SPC}pragma{SPCP}	{ BEGIN PRAGMA; }
367*61046927SAndroid Build Coastguard Worker
368*61046927SAndroid Build Coastguard Worker<PRAGMA>\n			{ BEGIN 0; yylineno++; yycolumn = 0; }
369*61046927SAndroid Build Coastguard Worker<PRAGMA>.			{ }
370*61046927SAndroid Build Coastguard Worker
371*61046927SAndroid Build Coastguard Worker<PP>\/\/[^\n]*			{ }
372*61046927SAndroid Build Coastguard Worker<PP>[ \t\r]*			{ }
373*61046927SAndroid Build Coastguard Worker<PP>:				return COLON;
374*61046927SAndroid Build Coastguard Worker<PP>[_a-zA-Z][_a-zA-Z0-9]*	{
375*61046927SAndroid Build Coastguard Worker				   /* We're not doing linear_strdup here, to avoid an implicit call
376*61046927SAndroid Build Coastguard Worker				    * on strlen() for the length of the string, as this is already
377*61046927SAndroid Build Coastguard Worker				    * found by flex and stored in yyleng
378*61046927SAndroid Build Coastguard Worker				    */
379*61046927SAndroid Build Coastguard Worker                                    linear_ctx *mem_ctx = yyextra->linalloc;
380*61046927SAndroid Build Coastguard Worker                                    char *id = (char *) linear_alloc_child(mem_ctx, yyleng + 1);
381*61046927SAndroid Build Coastguard Worker                                    memcpy(id, yytext, yyleng + 1);
382*61046927SAndroid Build Coastguard Worker                                    yylval->identifier = id;
383*61046927SAndroid Build Coastguard Worker				   return IDENTIFIER;
384*61046927SAndroid Build Coastguard Worker				}
385*61046927SAndroid Build Coastguard Worker<PP>[1-9][0-9]*			{
386*61046927SAndroid Build Coastguard Worker				    yylval->n = strtol(yytext, NULL, 10);
387*61046927SAndroid Build Coastguard Worker				    return INTCONSTANT;
388*61046927SAndroid Build Coastguard Worker				}
389*61046927SAndroid Build Coastguard Worker<PP>0				{
390*61046927SAndroid Build Coastguard Worker				    yylval->n = 0;
391*61046927SAndroid Build Coastguard Worker				    return INTCONSTANT;
392*61046927SAndroid Build Coastguard Worker				}
393*61046927SAndroid Build Coastguard Worker<PP>\n				{ BEGIN 0; yylineno++; yycolumn = 0; return EOL; }
394*61046927SAndroid Build Coastguard Worker<PP>.				{ return yytext[0]; }
395*61046927SAndroid Build Coastguard Worker
396*61046927SAndroid Build Coastguard Worker\n		{ yylineno++; yycolumn = 0; }
397*61046927SAndroid Build Coastguard Worker
398*61046927SAndroid Build Coastguard Workerattribute	DEPRECATED_KEYWORD(ATTRIBUTE, yyextra, 420, 300);
399*61046927SAndroid Build Coastguard Workerconst		return CONST_TOK;
400*61046927SAndroid Build Coastguard Workerbool		{ yylval->type = &glsl_type_builtin_bool; return BASIC_TYPE_TOK; }
401*61046927SAndroid Build Coastguard Workerfloat		{ yylval->type = &glsl_type_builtin_float; return BASIC_TYPE_TOK; }
402*61046927SAndroid Build Coastguard Workerint		{ yylval->type = &glsl_type_builtin_int; return BASIC_TYPE_TOK; }
403*61046927SAndroid Build Coastguard Workeruint		TYPE(130, 300, 130, 300, &glsl_type_builtin_uint);
404*61046927SAndroid Build Coastguard Worker
405*61046927SAndroid Build Coastguard Workerbreak		return BREAK;
406*61046927SAndroid Build Coastguard Workercontinue	return CONTINUE;
407*61046927SAndroid Build Coastguard Workerdo		return DO;
408*61046927SAndroid Build Coastguard Workerwhile		return WHILE;
409*61046927SAndroid Build Coastguard Workerelse		return ELSE;
410*61046927SAndroid Build Coastguard Workerfor		return FOR;
411*61046927SAndroid Build Coastguard Workerif		return IF;
412*61046927SAndroid Build Coastguard Workerdiscard		return DISCARD;
413*61046927SAndroid Build Coastguard Workerreturn		return RETURN;
414*61046927SAndroid Build Coastguard Workerdemote		KEYWORD_WITH_ALT(0, 0, 0, 0, yyextra->EXT_demote_to_helper_invocation_enable, DEMOTE);
415*61046927SAndroid Build Coastguard Worker
416*61046927SAndroid Build Coastguard Workerbvec2		{ yylval->type = &glsl_type_builtin_bvec2; return BASIC_TYPE_TOK; }
417*61046927SAndroid Build Coastguard Workerbvec3		{ yylval->type = &glsl_type_builtin_bvec3; return BASIC_TYPE_TOK; }
418*61046927SAndroid Build Coastguard Workerbvec4		{ yylval->type = &glsl_type_builtin_bvec4; return BASIC_TYPE_TOK; }
419*61046927SAndroid Build Coastguard Workerivec2		{ yylval->type = &glsl_type_builtin_ivec2; return BASIC_TYPE_TOK; }
420*61046927SAndroid Build Coastguard Workerivec3		{ yylval->type = &glsl_type_builtin_ivec3; return BASIC_TYPE_TOK; }
421*61046927SAndroid Build Coastguard Workerivec4		{ yylval->type = &glsl_type_builtin_ivec4; return BASIC_TYPE_TOK; }
422*61046927SAndroid Build Coastguard Workeruvec2		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, &glsl_type_builtin_uvec2);
423*61046927SAndroid Build Coastguard Workeruvec3		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, &glsl_type_builtin_uvec3);
424*61046927SAndroid Build Coastguard Workeruvec4		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, &glsl_type_builtin_uvec4);
425*61046927SAndroid Build Coastguard Workervec2		{ yylval->type = &glsl_type_builtin_vec2; return BASIC_TYPE_TOK; }
426*61046927SAndroid Build Coastguard Workervec3		{ yylval->type = &glsl_type_builtin_vec3; return BASIC_TYPE_TOK; }
427*61046927SAndroid Build Coastguard Workervec4		{ yylval->type = &glsl_type_builtin_vec4; return BASIC_TYPE_TOK; }
428*61046927SAndroid Build Coastguard Workermat2		{ yylval->type = &glsl_type_builtin_mat2; return BASIC_TYPE_TOK; }
429*61046927SAndroid Build Coastguard Workermat3		{ yylval->type = &glsl_type_builtin_mat3; return BASIC_TYPE_TOK; }
430*61046927SAndroid Build Coastguard Workermat4		{ yylval->type = &glsl_type_builtin_mat4; return BASIC_TYPE_TOK; }
431*61046927SAndroid Build Coastguard Workermat2x2		TYPE(120, 300, 120, 300, &glsl_type_builtin_mat2);
432*61046927SAndroid Build Coastguard Workermat2x3		TYPE(120, 300, 120, 300, &glsl_type_builtin_mat2x3);
433*61046927SAndroid Build Coastguard Workermat2x4		TYPE(120, 300, 120, 300, &glsl_type_builtin_mat2x4);
434*61046927SAndroid Build Coastguard Workermat3x2		TYPE(120, 300, 120, 300, &glsl_type_builtin_mat3x2);
435*61046927SAndroid Build Coastguard Workermat3x3		TYPE(120, 300, 120, 300, &glsl_type_builtin_mat3);
436*61046927SAndroid Build Coastguard Workermat3x4		TYPE(120, 300, 120, 300, &glsl_type_builtin_mat3x4);
437*61046927SAndroid Build Coastguard Workermat4x2		TYPE(120, 300, 120, 300, &glsl_type_builtin_mat4x2);
438*61046927SAndroid Build Coastguard Workermat4x3		TYPE(120, 300, 120, 300, &glsl_type_builtin_mat4x3);
439*61046927SAndroid Build Coastguard Workermat4x4		TYPE(120, 300, 120, 300, &glsl_type_builtin_mat4);
440*61046927SAndroid Build Coastguard Worker
441*61046927SAndroid Build Coastguard Workerin		return IN_TOK;
442*61046927SAndroid Build Coastguard Workerout		return OUT_TOK;
443*61046927SAndroid Build Coastguard Workerinout		return INOUT_TOK;
444*61046927SAndroid Build Coastguard Workeruniform		return UNIFORM;
445*61046927SAndroid Build Coastguard Workerbuffer		KEYWORD_WITH_ALT(0, 0, 430, 310, yyextra->ARB_shader_storage_buffer_object_enable, BUFFER);
446*61046927SAndroid Build Coastguard Workervarying		DEPRECATED_KEYWORD(VARYING, yyextra, 420, 300);
447*61046927SAndroid Build Coastguard Workercentroid	KEYWORD_WITH_ALT(120, 300, 120, 300, yyextra->EXT_gpu_shader4_enable, CENTROID);
448*61046927SAndroid Build Coastguard Workerinvariant	KEYWORD(120, 100, 120, 100, INVARIANT);
449*61046927SAndroid Build Coastguard Workerflat		KEYWORD_WITH_ALT(130, 100, 130, 300, yyextra->EXT_gpu_shader4_enable, FLAT);
450*61046927SAndroid Build Coastguard Workersmooth		KEYWORD(130, 300, 130, 300, SMOOTH);
451*61046927SAndroid Build Coastguard Workernoperspective	KEYWORD_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable || yyextra->NV_shader_noperspective_interpolation_enable, NOPERSPECTIVE);
452*61046927SAndroid Build Coastguard Workerpatch		KEYWORD_WITH_ALT(0, 300, 400, 320, yyextra->has_tessellation_shader(), PATCH);
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Workersampler1D	DEPRECATED_ES_TYPE(&glsl_type_builtin_sampler1D);
455*61046927SAndroid Build Coastguard Workersampler2D	{ yylval->type = &glsl_type_builtin_sampler2D; return BASIC_TYPE_TOK; }
456*61046927SAndroid Build Coastguard Workersampler3D	{ yylval->type = &glsl_type_builtin_sampler3D; return BASIC_TYPE_TOK; }
457*61046927SAndroid Build Coastguard WorkersamplerCube	{ yylval->type = &glsl_type_builtin_samplerCube; return BASIC_TYPE_TOK; }
458*61046927SAndroid Build Coastguard Workersampler1DArray	TYPE_WITH_ALT(130, 300, 130, 0,   yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_array, &glsl_type_builtin_sampler1DArray);
459*61046927SAndroid Build Coastguard Workersampler2DArray	TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_array, &glsl_type_builtin_sampler2DArray);
460*61046927SAndroid Build Coastguard Workersampler1DShadow	DEPRECATED_ES_TYPE(&glsl_type_builtin_sampler1DShadow);
461*61046927SAndroid Build Coastguard Workersampler2DShadow	{ yylval->type = &glsl_type_builtin_sampler2DShadow; return BASIC_TYPE_TOK; }
462*61046927SAndroid Build Coastguard WorkersamplerCubeShadow	TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, &glsl_type_builtin_samplerCubeShadow);
463*61046927SAndroid Build Coastguard Workersampler1DArrayShadow	TYPE_WITH_ALT(130, 300, 130, 0,   yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_array, &glsl_type_builtin_sampler1DArrayShadow);
464*61046927SAndroid Build Coastguard Workersampler2DArrayShadow	TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_array, &glsl_type_builtin_sampler2DArrayShadow);
465*61046927SAndroid Build Coastguard Workerisampler1D		TYPE_WITH_ALT(130, 300, 130, 0,   yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_isampler1D);
466*61046927SAndroid Build Coastguard Workerisampler2D		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_isampler2D);
467*61046927SAndroid Build Coastguard Workerisampler3D		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_isampler3D);
468*61046927SAndroid Build Coastguard WorkerisamplerCube		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_isamplerCube);
469*61046927SAndroid Build Coastguard Workerisampler1DArray		TYPE_WITH_ALT(130, 300, 130, 0,   yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer && yyextra->exts->EXT_texture_array, &glsl_type_builtin_isampler1DArray);
470*61046927SAndroid Build Coastguard Workerisampler2DArray		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer && yyextra->exts->EXT_texture_array, &glsl_type_builtin_isampler2DArray);
471*61046927SAndroid Build Coastguard Workerusampler1D		TYPE_WITH_ALT(130, 300, 130, 0,   yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_usampler1D);
472*61046927SAndroid Build Coastguard Workerusampler2D		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_usampler2D);
473*61046927SAndroid Build Coastguard Workerusampler3D		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_usampler3D);
474*61046927SAndroid Build Coastguard WorkerusamplerCube		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_usamplerCube);
475*61046927SAndroid Build Coastguard Workerusampler1DArray		TYPE_WITH_ALT(130, 300, 130, 0,   yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer && yyextra->exts->EXT_texture_array, &glsl_type_builtin_usampler1DArray);
476*61046927SAndroid Build Coastguard Workerusampler2DArray		TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_integer && yyextra->exts->EXT_texture_array, &glsl_type_builtin_usampler2DArray);
477*61046927SAndroid Build Coastguard Worker
478*61046927SAndroid Build Coastguard Worker   /* additional keywords in ARB_texture_multisample, included in GLSL 1.50 */
479*61046927SAndroid Build Coastguard Worker   /* these are reserved but not defined in GLSL 3.00 */
480*61046927SAndroid Build Coastguard Worker   /* [iu]sampler2DMS are defined in GLSL ES 3.10 */
481*61046927SAndroid Build Coastguard Workersampler2DMS        TYPE_WITH_ALT(150, 300, 150, 310, yyextra->ARB_texture_multisample_enable, &glsl_type_builtin_sampler2DMS);
482*61046927SAndroid Build Coastguard Workerisampler2DMS       TYPE_WITH_ALT(150, 300, 150, 310, yyextra->ARB_texture_multisample_enable, &glsl_type_builtin_isampler2DMS);
483*61046927SAndroid Build Coastguard Workerusampler2DMS       TYPE_WITH_ALT(150, 300, 150, 310, yyextra->ARB_texture_multisample_enable, &glsl_type_builtin_usampler2DMS);
484*61046927SAndroid Build Coastguard Workersampler2DMSArray   TYPE_WITH_ALT(150, 300, 150, 320, yyextra->ARB_texture_multisample_enable || yyextra->OES_texture_storage_multisample_2d_array_enable, &glsl_type_builtin_sampler2DMSArray);
485*61046927SAndroid Build Coastguard Workerisampler2DMSArray  TYPE_WITH_ALT(150, 300, 150, 320, yyextra->ARB_texture_multisample_enable || yyextra->OES_texture_storage_multisample_2d_array_enable, &glsl_type_builtin_isampler2DMSArray);
486*61046927SAndroid Build Coastguard Workerusampler2DMSArray  TYPE_WITH_ALT(150, 300, 150, 320, yyextra->ARB_texture_multisample_enable || yyextra->OES_texture_storage_multisample_2d_array_enable, &glsl_type_builtin_usampler2DMSArray);
487*61046927SAndroid Build Coastguard Worker
488*61046927SAndroid Build Coastguard Worker   /* keywords available with ARB_texture_cube_map_array_enable extension on desktop GLSL */
489*61046927SAndroid Build Coastguard WorkersamplerCubeArray   TYPE_WITH_ALT(400, 310, 400, 320, yyextra->ARB_texture_cube_map_array_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_samplerCubeArray);
490*61046927SAndroid Build Coastguard WorkerisamplerCubeArray TYPE_WITH_ALT(400, 310, 400, 320, yyextra->ARB_texture_cube_map_array_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_isamplerCubeArray);
491*61046927SAndroid Build Coastguard WorkerusamplerCubeArray TYPE_WITH_ALT(400, 310, 400, 320, yyextra->ARB_texture_cube_map_array_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_usamplerCubeArray);
492*61046927SAndroid Build Coastguard WorkersamplerCubeArrayShadow   TYPE_WITH_ALT(400, 310, 400, 320, yyextra->ARB_texture_cube_map_array_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_samplerCubeArrayShadow);
493*61046927SAndroid Build Coastguard Worker
494*61046927SAndroid Build Coastguard WorkersamplerExternalOES		{
495*61046927SAndroid Build Coastguard Worker			  if (yyextra->OES_EGL_image_external_enable || yyextra->OES_EGL_image_external_essl3_enable) {
496*61046927SAndroid Build Coastguard Worker			     yylval->type = &glsl_type_builtin_samplerExternalOES;
497*61046927SAndroid Build Coastguard Worker			     return BASIC_TYPE_TOK;
498*61046927SAndroid Build Coastguard Worker			  } else
499*61046927SAndroid Build Coastguard Worker			     return IDENTIFIER;
500*61046927SAndroid Build Coastguard Worker		}
501*61046927SAndroid Build Coastguard Worker
502*61046927SAndroid Build Coastguard Worker   /* keywords available with ARB_gpu_shader5 */
503*61046927SAndroid Build Coastguard Workerprecise		KEYWORD_WITH_ALT(400, 310, 400, 320, yyextra->ARB_gpu_shader5_enable || yyextra->EXT_gpu_shader5_enable || yyextra->OES_gpu_shader5_enable, PRECISE);
504*61046927SAndroid Build Coastguard Worker
505*61046927SAndroid Build Coastguard Worker   /* keywords available with ARB_shader_image_load_store */
506*61046927SAndroid Build Coastguard Workerimage1D         TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image1D);
507*61046927SAndroid Build Coastguard Workerimage2D         TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image2D);
508*61046927SAndroid Build Coastguard Workerimage3D         TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image3D);
509*61046927SAndroid Build Coastguard Workerimage2DRect     TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image2DRect);
510*61046927SAndroid Build Coastguard WorkerimageCube       TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_imageCube);
511*61046927SAndroid Build Coastguard WorkerimageBuffer     TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, &glsl_type_builtin_imageBuffer);
512*61046927SAndroid Build Coastguard Workerimage1DArray    TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image1DArray);
513*61046927SAndroid Build Coastguard Workerimage2DArray    TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image2DArray);
514*61046927SAndroid Build Coastguard WorkerimageCubeArray  TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_imageCubeArray);
515*61046927SAndroid Build Coastguard Workerimage2DMS       TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image2DMS);
516*61046927SAndroid Build Coastguard Workerimage2DMSArray  TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_image2DMSArray);
517*61046927SAndroid Build Coastguard Workeriimage1D        TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage1D);
518*61046927SAndroid Build Coastguard Workeriimage2D        TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage2D);
519*61046927SAndroid Build Coastguard Workeriimage3D        TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage3D);
520*61046927SAndroid Build Coastguard Workeriimage2DRect    TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage2DRect);
521*61046927SAndroid Build Coastguard WorkeriimageCube      TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimageCube);
522*61046927SAndroid Build Coastguard WorkeriimageBuffer    TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, &glsl_type_builtin_iimageBuffer);
523*61046927SAndroid Build Coastguard Workeriimage1DArray   TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage1DArray);
524*61046927SAndroid Build Coastguard Workeriimage2DArray   TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage2DArray);
525*61046927SAndroid Build Coastguard WorkeriimageCubeArray TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_iimageCubeArray);
526*61046927SAndroid Build Coastguard Workeriimage2DMS      TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage2DMS);
527*61046927SAndroid Build Coastguard Workeriimage2DMSArray TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_iimage2DMSArray);
528*61046927SAndroid Build Coastguard Workeruimage1D        TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage1D);
529*61046927SAndroid Build Coastguard Workeruimage2D        TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage2D);
530*61046927SAndroid Build Coastguard Workeruimage3D        TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage3D);
531*61046927SAndroid Build Coastguard Workeruimage2DRect    TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage2DRect);
532*61046927SAndroid Build Coastguard WorkeruimageCube      TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimageCube);
533*61046927SAndroid Build Coastguard WorkeruimageBuffer    TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, &glsl_type_builtin_uimageBuffer);
534*61046927SAndroid Build Coastguard Workeruimage1DArray   TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage1DArray);
535*61046927SAndroid Build Coastguard Workeruimage2DArray   TYPE_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage2DArray);
536*61046927SAndroid Build Coastguard WorkeruimageCubeArray TYPE_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->OES_texture_cube_map_array_enable || yyextra->EXT_texture_cube_map_array_enable, &glsl_type_builtin_uimageCubeArray);
537*61046927SAndroid Build Coastguard Workeruimage2DMS      TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage2DMS);
538*61046927SAndroid Build Coastguard Workeruimage2DMSArray TYPE_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable, &glsl_type_builtin_uimage2DMSArray);
539*61046927SAndroid Build Coastguard Workerimage1DShadow           KEYWORD(130, 0, 420, 0, IMAGE1DSHADOW);
540*61046927SAndroid Build Coastguard Workerimage2DShadow           KEYWORD(130, 0, 420, 0, IMAGE2DSHADOW);
541*61046927SAndroid Build Coastguard Workerimage1DArrayShadow      KEYWORD(130, 0, 420, 0, IMAGE1DARRAYSHADOW);
542*61046927SAndroid Build Coastguard Workerimage2DArrayShadow      KEYWORD(130, 0, 420, 0, IMAGE2DARRAYSHADOW);
543*61046927SAndroid Build Coastguard Worker
544*61046927SAndroid Build Coastguard Workercoherent       KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, COHERENT);
545*61046927SAndroid Build Coastguard Workervolatile       KEYWORD_WITH_ALT(110, 100, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, VOLATILE);
546*61046927SAndroid Build Coastguard Workerrestrict       KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, RESTRICT);
547*61046927SAndroid Build Coastguard Workerreadonly       KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, READONLY);
548*61046927SAndroid Build Coastguard Workerwriteonly      KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, WRITEONLY);
549*61046927SAndroid Build Coastguard Worker
550*61046927SAndroid Build Coastguard Workeratomic_uint     TYPE_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_atomic_counters_enable, &glsl_type_builtin_atomic_uint);
551*61046927SAndroid Build Coastguard Worker
552*61046927SAndroid Build Coastguard Workershared          KEYWORD_WITH_ALT(430, 310, 430, 310, yyextra->ARB_compute_shader_enable, SHARED);
553*61046927SAndroid Build Coastguard Worker
554*61046927SAndroid Build Coastguard Workerstruct		return STRUCT;
555*61046927SAndroid Build Coastguard Workervoid		return VOID_TOK;
556*61046927SAndroid Build Coastguard Worker
557*61046927SAndroid Build Coastguard Workerlayout		{
558*61046927SAndroid Build Coastguard Worker		  if ((yyextra->is_version(140, 300))
559*61046927SAndroid Build Coastguard Worker		      || yyextra->ARB_bindless_texture_enable
560*61046927SAndroid Build Coastguard Worker		      || yyextra->KHR_blend_equation_advanced_enable
561*61046927SAndroid Build Coastguard Worker		      || yyextra->AMD_conservative_depth_enable
562*61046927SAndroid Build Coastguard Worker		      || yyextra->ARB_conservative_depth_enable
563*61046927SAndroid Build Coastguard Worker		      || yyextra->ARB_explicit_attrib_location_enable
564*61046927SAndroid Build Coastguard Worker		      || yyextra->ARB_explicit_uniform_location_enable
565*61046927SAndroid Build Coastguard Worker                      || yyextra->ARB_post_depth_coverage_enable
566*61046927SAndroid Build Coastguard Worker                      || yyextra->has_separate_shader_objects()
567*61046927SAndroid Build Coastguard Worker		      || yyextra->ARB_uniform_buffer_object_enable
568*61046927SAndroid Build Coastguard Worker		      || yyextra->ARB_fragment_coord_conventions_enable
569*61046927SAndroid Build Coastguard Worker                      || yyextra->ARB_shading_language_420pack_enable
570*61046927SAndroid Build Coastguard Worker                      || yyextra->ARB_compute_shader_enable
571*61046927SAndroid Build Coastguard Worker                      || yyextra->ARB_tessellation_shader_enable
572*61046927SAndroid Build Coastguard Worker                      || yyextra->EXT_shader_framebuffer_fetch_non_coherent_enable) {
573*61046927SAndroid Build Coastguard Worker		      return LAYOUT_TOK;
574*61046927SAndroid Build Coastguard Worker		   } else {
575*61046927SAndroid Build Coastguard Worker		      return classify_identifier(yyextra, yytext, yyleng, yylval);
576*61046927SAndroid Build Coastguard Worker		   }
577*61046927SAndroid Build Coastguard Worker		}
578*61046927SAndroid Build Coastguard Worker
579*61046927SAndroid Build Coastguard Worker\+\+		return INC_OP;
580*61046927SAndroid Build Coastguard Worker--		return DEC_OP;
581*61046927SAndroid Build Coastguard Worker\<=		return LE_OP;
582*61046927SAndroid Build Coastguard Worker>=		return GE_OP;
583*61046927SAndroid Build Coastguard Worker==		return EQ_OP;
584*61046927SAndroid Build Coastguard Worker!=		return NE_OP;
585*61046927SAndroid Build Coastguard Worker&&		return AND_OP;
586*61046927SAndroid Build Coastguard Worker\|\|		return OR_OP;
587*61046927SAndroid Build Coastguard Worker"^^"		return XOR_OP;
588*61046927SAndroid Build Coastguard Worker"<<"		return LEFT_OP;
589*61046927SAndroid Build Coastguard Worker">>"		return RIGHT_OP;
590*61046927SAndroid Build Coastguard Worker
591*61046927SAndroid Build Coastguard Worker\*=		return MUL_ASSIGN;
592*61046927SAndroid Build Coastguard Worker\/=		return DIV_ASSIGN;
593*61046927SAndroid Build Coastguard Worker\+=		return ADD_ASSIGN;
594*61046927SAndroid Build Coastguard Worker\%=		return MOD_ASSIGN;
595*61046927SAndroid Build Coastguard Worker\<\<=		return LEFT_ASSIGN;
596*61046927SAndroid Build Coastguard Worker>>=		return RIGHT_ASSIGN;
597*61046927SAndroid Build Coastguard Worker&=		return AND_ASSIGN;
598*61046927SAndroid Build Coastguard Worker"^="		return XOR_ASSIGN;
599*61046927SAndroid Build Coastguard Worker\|=		return OR_ASSIGN;
600*61046927SAndroid Build Coastguard Worker-=		return SUB_ASSIGN;
601*61046927SAndroid Build Coastguard Worker
602*61046927SAndroid Build Coastguard Worker[1-9][0-9]*([uU]|[lL]|ul|UL)?	{
603*61046927SAndroid Build Coastguard Worker			    return LITERAL_INTEGER(10);
604*61046927SAndroid Build Coastguard Worker			}
605*61046927SAndroid Build Coastguard Worker0[xX][0-9a-fA-F]+([uU]|[lL]|ul|UL)?	{
606*61046927SAndroid Build Coastguard Worker			    return LITERAL_INTEGER(16);
607*61046927SAndroid Build Coastguard Worker			}
608*61046927SAndroid Build Coastguard Worker0[0-7]*([uU]|[lL]|ul|UL)?		{
609*61046927SAndroid Build Coastguard Worker			    return LITERAL_INTEGER(8);
610*61046927SAndroid Build Coastguard Worker			}
611*61046927SAndroid Build Coastguard Worker
612*61046927SAndroid Build Coastguard Worker[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?(hf|HF)	|
613*61046927SAndroid Build Coastguard Worker\.[0-9]+([eE][+-]?[0-9]+)?(hf|HF)	|
614*61046927SAndroid Build Coastguard Worker[0-9]+\.([eE][+-]?[0-9]+)?(hf|HF)	|
615*61046927SAndroid Build Coastguard Worker[0-9]+[eE][+-]?[0-9]+(hf|HF)		{
616*61046927SAndroid Build Coastguard Worker			    if (!yyextra->AMD_gpu_shader_half_float_enable)
617*61046927SAndroid Build Coastguard Worker			        return ERROR_TOK;
618*61046927SAndroid Build Coastguard Worker			    yylval->dreal = _mesa_strtod(yytext, NULL);
619*61046927SAndroid Build Coastguard Worker			    return FLOAT16CONSTANT;
620*61046927SAndroid Build Coastguard Worker			}
621*61046927SAndroid Build Coastguard Worker
622*61046927SAndroid Build Coastguard Worker[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]?	|
623*61046927SAndroid Build Coastguard Worker\.[0-9]+([eE][+-]?[0-9]+)?[fF]?		|
624*61046927SAndroid Build Coastguard Worker[0-9]+\.([eE][+-]?[0-9]+)?[fF]?		|
625*61046927SAndroid Build Coastguard Worker[0-9]+[eE][+-]?[0-9]+[fF]?		{
626*61046927SAndroid Build Coastguard Worker			    struct _mesa_glsl_parse_state *state = yyextra;
627*61046927SAndroid Build Coastguard Worker			    char suffix = yytext[strlen(yytext) - 1];
628*61046927SAndroid Build Coastguard Worker			    if (!state->is_version(120, 300) &&
629*61046927SAndroid Build Coastguard Worker			        (suffix == 'f' || suffix == 'F')) {
630*61046927SAndroid Build Coastguard Worker			        _mesa_glsl_warning(yylloc, state,
631*61046927SAndroid Build Coastguard Worker			                           "Float suffixes are invalid in GLSL 1.10");
632*61046927SAndroid Build Coastguard Worker			    }
633*61046927SAndroid Build Coastguard Worker			    yylval->real = _mesa_strtof(yytext, NULL);
634*61046927SAndroid Build Coastguard Worker			    return FLOATCONSTANT;
635*61046927SAndroid Build Coastguard Worker			}
636*61046927SAndroid Build Coastguard Worker
637*61046927SAndroid Build Coastguard Worker[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?(lf|LF)	|
638*61046927SAndroid Build Coastguard Worker\.[0-9]+([eE][+-]?[0-9]+)?(lf|LF)	|
639*61046927SAndroid Build Coastguard Worker[0-9]+\.([eE][+-]?[0-9]+)?(lf|LF)	|
640*61046927SAndroid Build Coastguard Worker[0-9]+[eE][+-]?[0-9]+(lf|LF)		{
641*61046927SAndroid Build Coastguard Worker			    if (!yyextra->is_version(400, 0) &&
642*61046927SAndroid Build Coastguard Worker			        !yyextra->ARB_gpu_shader_fp64_enable)
643*61046927SAndroid Build Coastguard Worker			        return ERROR_TOK;
644*61046927SAndroid Build Coastguard Worker			    yylval->dreal = _mesa_strtod(yytext, NULL);
645*61046927SAndroid Build Coastguard Worker			    return DOUBLECONSTANT;
646*61046927SAndroid Build Coastguard Worker			}
647*61046927SAndroid Build Coastguard Worker
648*61046927SAndroid Build Coastguard Workertrue			{
649*61046927SAndroid Build Coastguard Worker			    yylval->n = 1;
650*61046927SAndroid Build Coastguard Worker			    return BOOLCONSTANT;
651*61046927SAndroid Build Coastguard Worker			}
652*61046927SAndroid Build Coastguard Workerfalse			{
653*61046927SAndroid Build Coastguard Worker			    yylval->n = 0;
654*61046927SAndroid Build Coastguard Worker			    return BOOLCONSTANT;
655*61046927SAndroid Build Coastguard Worker			}
656*61046927SAndroid Build Coastguard Worker
657*61046927SAndroid Build Coastguard Worker
658*61046927SAndroid Build Coastguard Worker    /* Reserved words in GLSL 1.10. */
659*61046927SAndroid Build Coastguard Workerasm		KEYWORD(110, 100, 0, 0, ASM);
660*61046927SAndroid Build Coastguard Workerclass		KEYWORD(110, 100, 0, 0, CLASS);
661*61046927SAndroid Build Coastguard Workerunion		KEYWORD(110, 100, 0, 0, UNION);
662*61046927SAndroid Build Coastguard Workerenum		KEYWORD(110, 100, 0, 0, ENUM);
663*61046927SAndroid Build Coastguard Workertypedef		KEYWORD(110, 100, 0, 0, TYPEDEF);
664*61046927SAndroid Build Coastguard Workertemplate	KEYWORD(110, 100, 0, 0, TEMPLATE);
665*61046927SAndroid Build Coastguard Workerthis		KEYWORD(110, 100, 0, 0, THIS);
666*61046927SAndroid Build Coastguard Workerpacked		KEYWORD_WITH_ALT(110, 100, 140, 300, yyextra->ARB_uniform_buffer_object_enable, PACKED_TOK);
667*61046927SAndroid Build Coastguard Workergoto		KEYWORD(110, 100, 0, 0, GOTO);
668*61046927SAndroid Build Coastguard Workerswitch		KEYWORD(110, 100, 130, 300, SWITCH);
669*61046927SAndroid Build Coastguard Workerdefault		KEYWORD(110, 100, 130, 300, DEFAULT);
670*61046927SAndroid Build Coastguard Workerinline		KEYWORD(110, 100, 0, 0, INLINE_TOK);
671*61046927SAndroid Build Coastguard Workernoinline	KEYWORD(110, 100, 0, 0, NOINLINE);
672*61046927SAndroid Build Coastguard Workerpublic		KEYWORD(110, 100, 0, 0, PUBLIC_TOK);
673*61046927SAndroid Build Coastguard Workerstatic		KEYWORD(110, 100, 0, 0, STATIC);
674*61046927SAndroid Build Coastguard Workerextern		KEYWORD(110, 100, 0, 0, EXTERN);
675*61046927SAndroid Build Coastguard Workerexternal	KEYWORD(110, 100, 0, 0, EXTERNAL);
676*61046927SAndroid Build Coastguard Workerinterface	KEYWORD(110, 100, 0, 0, INTERFACE_TOK);
677*61046927SAndroid Build Coastguard Workerlong		KEYWORD(110, 100, 0, 0, LONG_TOK);
678*61046927SAndroid Build Coastguard Workershort		KEYWORD(110, 100, 0, 0, SHORT_TOK);
679*61046927SAndroid Build Coastguard Workerdouble		TYPE_WITH_ALT(130, 100, 130, 300, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_double);
680*61046927SAndroid Build Coastguard Workerhalf		KEYWORD(110, 100, 0, 0, HALF);
681*61046927SAndroid Build Coastguard Workerfixed		KEYWORD(110, 100, 0, 0, FIXED_TOK);
682*61046927SAndroid Build Coastguard Workerunsigned	KEYWORD_WITH_ALT(110, 100, 0, 0, yyextra->EXT_gpu_shader4_enable, UNSIGNED);
683*61046927SAndroid Build Coastguard Workerinput		KEYWORD(110, 100, 0, 0, INPUT_TOK);
684*61046927SAndroid Build Coastguard Workeroutput		KEYWORD(110, 100, 0, 0, OUTPUT);
685*61046927SAndroid Build Coastguard Workerhvec2		KEYWORD(110, 100, 0, 0, HVEC2);
686*61046927SAndroid Build Coastguard Workerhvec3		KEYWORD(110, 100, 0, 0, HVEC3);
687*61046927SAndroid Build Coastguard Workerhvec4		KEYWORD(110, 100, 0, 0, HVEC4);
688*61046927SAndroid Build Coastguard Workerdvec2		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dvec2);
689*61046927SAndroid Build Coastguard Workerdvec3		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dvec3);
690*61046927SAndroid Build Coastguard Workerdvec4		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dvec4);
691*61046927SAndroid Build Coastguard Workerdmat2		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat2);
692*61046927SAndroid Build Coastguard Workerdmat3		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat3);
693*61046927SAndroid Build Coastguard Workerdmat4		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat4);
694*61046927SAndroid Build Coastguard Workerdmat2x2		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat2);
695*61046927SAndroid Build Coastguard Workerdmat2x3		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat2x3);
696*61046927SAndroid Build Coastguard Workerdmat2x4		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat2x4);
697*61046927SAndroid Build Coastguard Workerdmat3x2		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat3x2);
698*61046927SAndroid Build Coastguard Workerdmat3x3		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat3);
699*61046927SAndroid Build Coastguard Workerdmat3x4		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat3x4);
700*61046927SAndroid Build Coastguard Workerdmat4x2		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat4x2);
701*61046927SAndroid Build Coastguard Workerdmat4x3		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat4x3);
702*61046927SAndroid Build Coastguard Workerdmat4x4		TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, &glsl_type_builtin_dmat4);
703*61046927SAndroid Build Coastguard Workerfvec2		KEYWORD(110, 100, 0, 0, FVEC2);
704*61046927SAndroid Build Coastguard Workerfvec3		KEYWORD(110, 100, 0, 0, FVEC3);
705*61046927SAndroid Build Coastguard Workerfvec4		KEYWORD(110, 100, 0, 0, FVEC4);
706*61046927SAndroid Build Coastguard Workersampler2DRect 		TYPE_WITH_ALT(110, 100, 0, 0, yyextra->ARB_texture_rectangle_enable, &glsl_type_builtin_sampler2DRect);
707*61046927SAndroid Build Coastguard Workersampler3DRect		KEYWORD(110, 100, 0, 0, SAMPLER3DRECT);
708*61046927SAndroid Build Coastguard Workersampler2DRectShadow	TYPE_WITH_ALT(110, 100, 0, 0, yyextra->ARB_texture_rectangle_enable, &glsl_type_builtin_sampler2DRectShadow);
709*61046927SAndroid Build Coastguard Workersizeof		KEYWORD(110, 100, 0, 0, SIZEOF);
710*61046927SAndroid Build Coastguard Workercast		KEYWORD(110, 100, 0, 0, CAST);
711*61046927SAndroid Build Coastguard Workernamespace	KEYWORD(110, 100, 0, 0, NAMESPACE);
712*61046927SAndroid Build Coastguard Workerusing		KEYWORD(110, 100, 0, 0, USING);
713*61046927SAndroid Build Coastguard Worker
714*61046927SAndroid Build Coastguard Worker    /* Additional reserved words in GLSL 1.20. */
715*61046927SAndroid Build Coastguard Workerlowp		KEYWORD(120, 100, 130, 100, LOWP);
716*61046927SAndroid Build Coastguard Workermediump		KEYWORD(120, 100, 130, 100, MEDIUMP);
717*61046927SAndroid Build Coastguard Workerhighp		KEYWORD(120, 100, 130, 100, HIGHP);
718*61046927SAndroid Build Coastguard Workerprecision	KEYWORD(120, 100, 130, 100, PRECISION);
719*61046927SAndroid Build Coastguard Worker
720*61046927SAndroid Build Coastguard Worker    /* Additional reserved words in GLSL 1.30. */
721*61046927SAndroid Build Coastguard Workercase		KEYWORD(130, 300, 130, 300, CASE);
722*61046927SAndroid Build Coastguard Workercommon		KEYWORD(130, 300, 0, 0, COMMON);
723*61046927SAndroid Build Coastguard Workerpartition	KEYWORD(130, 300, 0, 0, PARTITION);
724*61046927SAndroid Build Coastguard Workeractive		KEYWORD(130, 300, 0, 0, ACTIVE);
725*61046927SAndroid Build Coastguard Workersuperp		KEYWORD(130, 100, 0, 0, SUPERP);
726*61046927SAndroid Build Coastguard WorkersamplerBuffer	TYPE_WITH_ALT(130, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable || (yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_buffer_object), &glsl_type_builtin_samplerBuffer);
727*61046927SAndroid Build Coastguard Workerfilter		KEYWORD(130, 300, 0, 0, FILTER);
728*61046927SAndroid Build Coastguard Workerrow_major	KEYWORD_WITH_ALT(130, 0, 140, 0, yyextra->ARB_uniform_buffer_object_enable && !yyextra->es_shader, ROW_MAJOR);
729*61046927SAndroid Build Coastguard Worker
730*61046927SAndroid Build Coastguard Worker    /* Additional reserved words in GLSL 1.40 */
731*61046927SAndroid Build Coastguard Workerisampler2DRect	TYPE_WITH_ALT(140, 300, 140, 0, yyextra->EXT_gpu_shader4_enable && yyextra->exts->NV_texture_rectangle && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_isampler2DRect);
732*61046927SAndroid Build Coastguard Workerusampler2DRect	TYPE_WITH_ALT(140, 300, 140, 0, yyextra->EXT_gpu_shader4_enable && yyextra->exts->NV_texture_rectangle && yyextra->exts->EXT_texture_integer, &glsl_type_builtin_usampler2DRect);
733*61046927SAndroid Build Coastguard WorkerisamplerBuffer	TYPE_WITH_ALT(140, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable || (yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_buffer_object && yyextra->exts->EXT_texture_integer), &glsl_type_builtin_isamplerBuffer);
734*61046927SAndroid Build Coastguard WorkerusamplerBuffer	TYPE_WITH_ALT(140, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable || (yyextra->EXT_gpu_shader4_enable && yyextra->exts->EXT_texture_buffer_object && yyextra->exts->EXT_texture_integer), &glsl_type_builtin_usamplerBuffer);
735*61046927SAndroid Build Coastguard Worker
736*61046927SAndroid Build Coastguard Worker    /* Additional reserved words in GLSL ES 3.00 */
737*61046927SAndroid Build Coastguard Workerresource	KEYWORD(420, 300, 0, 0, RESOURCE);
738*61046927SAndroid Build Coastguard Workersample		KEYWORD_WITH_ALT(400, 300, 400, 320, yyextra->ARB_gpu_shader5_enable || yyextra->OES_shader_multisample_interpolation_enable, SAMPLE);
739*61046927SAndroid Build Coastguard Workersubroutine	KEYWORD_WITH_ALT(400, 300, 400, 0, yyextra->ARB_shader_subroutine_enable, SUBROUTINE);
740*61046927SAndroid Build Coastguard Worker
741*61046927SAndroid Build Coastguard Worker    /* Additional words for ARB_gpu_shader_int64 */
742*61046927SAndroid Build Coastguard Workerint64_t		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_int64_t);
743*61046927SAndroid Build Coastguard Workeri64vec2		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_i64vec2);
744*61046927SAndroid Build Coastguard Workeri64vec3		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_i64vec3);
745*61046927SAndroid Build Coastguard Workeri64vec4		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_i64vec4);
746*61046927SAndroid Build Coastguard Worker
747*61046927SAndroid Build Coastguard Workeruint64_t	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_uint64_t);
748*61046927SAndroid Build Coastguard Workeru64vec2		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_u64vec2);
749*61046927SAndroid Build Coastguard Workeru64vec3		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_u64vec3);
750*61046927SAndroid Build Coastguard Workeru64vec4		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable || yyextra->AMD_gpu_shader_int64_enable, &glsl_type_builtin_u64vec4);
751*61046927SAndroid Build Coastguard Worker
752*61046927SAndroid Build Coastguard Worker    /* Additional words for AMD_gpu_shader_half_float */
753*61046927SAndroid Build Coastguard Workerfloat16_t	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_float16_t);
754*61046927SAndroid Build Coastguard Workerf16vec2		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16vec2);
755*61046927SAndroid Build Coastguard Workerf16vec3		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16vec3);
756*61046927SAndroid Build Coastguard Workerf16vec4		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16vec4);
757*61046927SAndroid Build Coastguard Workerf16mat2		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat2);
758*61046927SAndroid Build Coastguard Workerf16mat3		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat3);
759*61046927SAndroid Build Coastguard Workerf16mat4		TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat4);
760*61046927SAndroid Build Coastguard Workerf16mat2x2	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat2);
761*61046927SAndroid Build Coastguard Workerf16mat2x3	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat2x3);
762*61046927SAndroid Build Coastguard Workerf16mat2x4	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat2x4);
763*61046927SAndroid Build Coastguard Workerf16mat3x2	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat3x2);
764*61046927SAndroid Build Coastguard Workerf16mat3x3	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat3);
765*61046927SAndroid Build Coastguard Workerf16mat3x4	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat3x4);
766*61046927SAndroid Build Coastguard Workerf16mat4x2	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat4x2);
767*61046927SAndroid Build Coastguard Workerf16mat4x3	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat4x3);
768*61046927SAndroid Build Coastguard Workerf16mat4x4	TYPE_WITH_ALT(0, 0, 0, 0, yyextra->AMD_gpu_shader_half_float_enable, &glsl_type_builtin_f16mat4);
769*61046927SAndroid Build Coastguard Worker
770*61046927SAndroid Build Coastguard Worker[_a-zA-Z][_a-zA-Z0-9]*	{
771*61046927SAndroid Build Coastguard Worker			    struct _mesa_glsl_parse_state *state = yyextra;
772*61046927SAndroid Build Coastguard Worker			    if (state->es_shader && yyleng > 1024) {
773*61046927SAndroid Build Coastguard Worker			       _mesa_glsl_error(yylloc, state,
774*61046927SAndroid Build Coastguard Worker			                        "Identifier `%s' exceeds 1024 characters",
775*61046927SAndroid Build Coastguard Worker			                        yytext);
776*61046927SAndroid Build Coastguard Worker			    }
777*61046927SAndroid Build Coastguard Worker			    return classify_identifier(state, yytext, yyleng, yylval);
778*61046927SAndroid Build Coastguard Worker			}
779*61046927SAndroid Build Coastguard Worker
780*61046927SAndroid Build Coastguard Worker\.			{ struct _mesa_glsl_parse_state *state = yyextra;
781*61046927SAndroid Build Coastguard Worker			  state->is_field = true;
782*61046927SAndroid Build Coastguard Worker			  return DOT_TOK; }
783*61046927SAndroid Build Coastguard Worker
784*61046927SAndroid Build Coastguard Worker.			{ return yytext[0]; }
785*61046927SAndroid Build Coastguard Worker
786*61046927SAndroid Build Coastguard Worker%%
787*61046927SAndroid Build Coastguard Worker
788*61046927SAndroid Build Coastguard Workerint
789*61046927SAndroid Build Coastguard Workerclassify_identifier(struct _mesa_glsl_parse_state *state, const char *name,
790*61046927SAndroid Build Coastguard Worker                    unsigned name_len, YYSTYPE *output)
791*61046927SAndroid Build Coastguard Worker{
792*61046927SAndroid Build Coastguard Worker   /* We're not doing linear_strdup here, to avoid an implicit call on
793*61046927SAndroid Build Coastguard Worker    * strlen() for the length of the string, as this is already found by flex
794*61046927SAndroid Build Coastguard Worker    * and stored in yyleng
795*61046927SAndroid Build Coastguard Worker    */
796*61046927SAndroid Build Coastguard Worker   char *id = (char *) linear_alloc_child(state->linalloc, name_len + 1);
797*61046927SAndroid Build Coastguard Worker   memcpy(id, name, name_len + 1);
798*61046927SAndroid Build Coastguard Worker   output->identifier = id;
799*61046927SAndroid Build Coastguard Worker
800*61046927SAndroid Build Coastguard Worker   if (state->is_field) {
801*61046927SAndroid Build Coastguard Worker      state->is_field = false;
802*61046927SAndroid Build Coastguard Worker      return FIELD_SELECTION;
803*61046927SAndroid Build Coastguard Worker   }
804*61046927SAndroid Build Coastguard Worker   if (state->symbols->get_variable(name) || state->symbols->get_function(name))
805*61046927SAndroid Build Coastguard Worker      return IDENTIFIER;
806*61046927SAndroid Build Coastguard Worker   else if (state->symbols->get_type(name))
807*61046927SAndroid Build Coastguard Worker      return TYPE_IDENTIFIER;
808*61046927SAndroid Build Coastguard Worker   else
809*61046927SAndroid Build Coastguard Worker      return NEW_IDENTIFIER;
810*61046927SAndroid Build Coastguard Worker}
811*61046927SAndroid Build Coastguard Worker
812*61046927SAndroid Build Coastguard Workervoid
813*61046927SAndroid Build Coastguard Worker_mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state, const char *string)
814*61046927SAndroid Build Coastguard Worker{
815*61046927SAndroid Build Coastguard Worker   yylex_init_extra(state, & state->scanner);
816*61046927SAndroid Build Coastguard Worker   yy_scan_string(string, state->scanner);
817*61046927SAndroid Build Coastguard Worker}
818*61046927SAndroid Build Coastguard Worker
819*61046927SAndroid Build Coastguard Workervoid
820*61046927SAndroid Build Coastguard Worker_mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state)
821*61046927SAndroid Build Coastguard Worker{
822*61046927SAndroid Build Coastguard Worker   yylex_destroy(state->scanner);
823*61046927SAndroid Build Coastguard Worker}
824