Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5564 | serge | 1 | %{ |
2 | /* |
||
3 | * Copyright © 2008, 2009 Intel Corporation |
||
4 | * |
||
5 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
6 | * copy of this software and associated documentation files (the "Software"), |
||
7 | * to deal in the Software without restriction, including without limitation |
||
8 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
9 | * and/or sell copies of the Software, and to permit persons to whom the |
||
10 | * Software is furnished to do so, subject to the following conditions: |
||
11 | * |
||
12 | * The above copyright notice and this permission notice (including the next |
||
13 | * paragraph) shall be included in all copies or substantial portions of the |
||
14 | * Software. |
||
15 | * |
||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
19 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||
22 | * DEALINGS IN THE SOFTWARE. |
||
23 | */ |
||
24 | #include |
||
25 | #include |
||
26 | #include "util/strtod.h" |
||
27 | #include "ast.h" |
||
28 | #include "glsl_parser_extras.h" |
||
29 | #include "glsl_parser.h" |
||
30 | |||
31 | static int classify_identifier(struct _mesa_glsl_parse_state *, const char *); |
||
32 | |||
33 | #ifdef _MSC_VER |
||
34 | #define YY_NO_UNISTD_H |
||
35 | #endif |
||
36 | |||
37 | #define YY_USER_ACTION \ |
||
38 | do { \ |
||
39 | yylloc->first_column = yycolumn + 1; \ |
||
40 | yylloc->first_line = yylloc->last_line = yylineno + 1; \ |
||
41 | yycolumn += yyleng; \ |
||
42 | yylloc->last_column = yycolumn + 1; \ |
||
43 | } while(0); |
||
44 | |||
45 | #define YY_USER_INIT yylineno = 0; yycolumn = 0; yylloc->source = 0; |
||
46 | |||
47 | /* A macro for handling reserved words and keywords across language versions. |
||
48 | * |
||
49 | * Certain words start out as identifiers, become reserved words in |
||
50 | * later language revisions, and finally become language keywords. |
||
51 | * This may happen at different times in desktop GLSL and GLSL ES. |
||
52 | * |
||
53 | * For example, consider the following lexer rule: |
||
54 | * samplerBuffer KEYWORD(130, 0, 140, 0, SAMPLERBUFFER) |
||
55 | * |
||
56 | * This means that "samplerBuffer" will be treated as: |
||
57 | * - a keyword (SAMPLERBUFFER token) ...in GLSL >= 1.40 |
||
58 | * - a reserved word - error ...in GLSL >= 1.30 |
||
59 | * - an identifier ...in GLSL < 1.30 or GLSL ES |
||
60 | */ |
||
61 | #define KEYWORD(reserved_glsl, reserved_glsl_es, \ |
||
62 | allowed_glsl, allowed_glsl_es, token) \ |
||
63 | KEYWORD_WITH_ALT(reserved_glsl, reserved_glsl_es, \ |
||
64 | allowed_glsl, allowed_glsl_es, false, token) |
||
65 | |||
66 | /** |
||
67 | * Like the KEYWORD macro, but the word is also treated as a keyword |
||
68 | * if the given boolean expression is true. |
||
69 | */ |
||
70 | #define KEYWORD_WITH_ALT(reserved_glsl, reserved_glsl_es, \ |
||
71 | allowed_glsl, allowed_glsl_es, \ |
||
72 | alt_expr, token) \ |
||
73 | do { \ |
||
74 | if (yyextra->is_version(allowed_glsl, allowed_glsl_es) \ |
||
75 | || (alt_expr)) { \ |
||
76 | return token; \ |
||
77 | } else if (yyextra->is_version(reserved_glsl, \ |
||
78 | reserved_glsl_es)) { \ |
||
79 | _mesa_glsl_error(yylloc, yyextra, \ |
||
80 | "illegal use of reserved word `%s'", yytext); \ |
||
81 | return ERROR_TOK; \ |
||
82 | } else { \ |
||
83 | void *mem_ctx = yyextra; \ |
||
84 | yylval->identifier = ralloc_strdup(mem_ctx, yytext); \ |
||
85 | return classify_identifier(yyextra, yytext); \ |
||
86 | } \ |
||
87 | } while (0) |
||
88 | |||
89 | /** |
||
90 | * A macro for handling keywords that have been present in GLSL since |
||
91 | * its origin, but were changed into reserved words in GLSL 3.00 ES. |
||
92 | */ |
||
93 | #define DEPRECATED_ES_KEYWORD(token) \ |
||
94 | do { \ |
||
95 | if (yyextra->is_version(0, 300)) { \ |
||
96 | _mesa_glsl_error(yylloc, yyextra, \ |
||
97 | "illegal use of reserved word `%s'", yytext); \ |
||
98 | return ERROR_TOK; \ |
||
99 | } else { \ |
||
100 | return token; \ |
||
101 | } \ |
||
102 | } while (0) |
||
103 | |||
104 | static int |
||
105 | literal_integer(char *text, int len, struct _mesa_glsl_parse_state *state, |
||
106 | YYSTYPE *lval, YYLTYPE *lloc, int base) |
||
107 | { |
||
108 | bool is_uint = (text[len - 1] == 'u' || |
||
109 | text[len - 1] == 'U'); |
||
110 | const char *digits = text; |
||
111 | |||
112 | /* Skip "0x" */ |
||
113 | if (base == 16) |
||
114 | digits += 2; |
||
115 | |||
116 | #ifdef _MSC_VER |
||
117 | unsigned __int64 value = _strtoui64(digits, NULL, base); |
||
118 | #else |
||
119 | unsigned long long value = strtoull(digits, NULL, base); |
||
120 | #endif |
||
121 | |||
122 | lval->n = (int)value; |
||
123 | |||
124 | if (value > UINT_MAX) { |
||
125 | /* Note that signed 0xffffffff is valid, not out of range! */ |
||
126 | if (state->is_version(130, 300)) { |
||
127 | _mesa_glsl_error(lloc, state, |
||
128 | "literal value `%s' out of range", text); |
||
129 | } else { |
||
130 | _mesa_glsl_warning(lloc, state, |
||
131 | "literal value `%s' out of range", text); |
||
132 | } |
||
133 | } else if (base == 10 && !is_uint && (unsigned)value > (unsigned)INT_MAX + 1) { |
||
134 | /* Tries to catch unintentionally providing a negative value. |
||
135 | * Note that -2147483648 is parsed as -(2147483648), so we don't |
||
136 | * want to warn for INT_MAX. |
||
137 | */ |
||
138 | _mesa_glsl_warning(lloc, state, |
||
139 | "signed literal value `%s' is interpreted as %d", |
||
140 | text, lval->n); |
||
141 | } |
||
142 | return is_uint ? UINTCONSTANT : INTCONSTANT; |
||
143 | } |
||
144 | |||
145 | #define LITERAL_INTEGER(base) \ |
||
146 | literal_integer(yytext, yyleng, yyextra, yylval, yylloc, base) |
||
147 | |||
148 | %} |
||
149 | |||
150 | %option bison-bridge bison-locations reentrant noyywrap |
||
151 | %option nounput noyy_top_state |
||
152 | %option never-interactive |
||
153 | %option prefix="_mesa_glsl_lexer_" |
||
154 | %option extra-type="struct _mesa_glsl_parse_state *" |
||
155 | %option warn nodefault |
||
156 | |||
157 | /* Note: When adding any start conditions to this list, you must also |
||
158 | * update the "Internal compiler error" catch-all rule near the end of |
||
159 | * this file. */ |
||
160 | %x PP PRAGMA |
||
161 | |||
162 | DEC_INT [1-9][0-9]* |
||
163 | HEX_INT 0[xX][0-9a-fA-F]+ |
||
164 | OCT_INT 0[0-7]* |
||
165 | INT ({DEC_INT}|{HEX_INT}|{OCT_INT}) |
||
166 | SPC [ \t]* |
||
167 | SPCP [ \t]+ |
||
168 | HASH ^{SPC}#{SPC} |
||
169 | %% |
||
170 | |||
171 | [ \r\t]+ ; |
||
172 | |||
173 | /* Preprocessor tokens. */ |
||
174 | ^[ \t]*#[ \t]*$ ; |
||
175 | ^[ \t]*#[ \t]*version { BEGIN PP; return VERSION_TOK; } |
||
176 | ^[ \t]*#[ \t]*extension { BEGIN PP; return EXTENSION; } |
||
177 | {HASH}line{SPCP}{INT}{SPCP}{INT}{SPC}$ { |
||
178 | /* Eat characters until the first digit is |
||
179 | * encountered |
||
180 | */ |
||
181 | char *ptr = yytext; |
||
182 | while (!isdigit(*ptr)) |
||
183 | ptr++; |
||
184 | |||
185 | /* Subtract one from the line number because |
||
186 | * yylineno is zero-based instead of |
||
187 | * one-based. |
||
188 | */ |
||
189 | yylineno = strtol(ptr, &ptr, 0) - 1; |
||
190 | |||
191 | /* From GLSL 3.30 and GLSL ES on, after processing the |
||
192 | * line directive (including its new-line), the implementation |
||
193 | * will behave as if it is compiling at the line number passed |
||
194 | * as argument. It was line number + 1 in older specifications. |
||
195 | */ |
||
196 | if (yyextra->is_version(330, 100)) |
||
197 | yylineno--; |
||
198 | |||
199 | yylloc->source = strtol(ptr, NULL, 0); |
||
200 | } |
||
201 | {HASH}line{SPCP}{INT}{SPC}$ { |
||
202 | /* Eat characters until the first digit is |
||
203 | * encountered |
||
204 | */ |
||
205 | char *ptr = yytext; |
||
206 | while (!isdigit(*ptr)) |
||
207 | ptr++; |
||
208 | |||
209 | /* Subtract one from the line number because |
||
210 | * yylineno is zero-based instead of |
||
211 | * one-based. |
||
212 | */ |
||
213 | yylineno = strtol(ptr, &ptr, 0) - 1; |
||
214 | |||
215 | /* From GLSL 3.30 and GLSL ES on, after processing the |
||
216 | * line directive (including its new-line), the implementation |
||
217 | * will behave as if it is compiling at the line number passed |
||
218 | * as argument. It was line number + 1 in older specifications. |
||
219 | */ |
||
220 | if (yyextra->is_version(330, 100)) |
||
221 | yylineno--; |
||
222 | } |
||
223 | ^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}on{SPC}\) { |
||
224 | BEGIN PP; |
||
225 | return PRAGMA_DEBUG_ON; |
||
226 | } |
||
227 | ^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}off{SPC}\) { |
||
228 | BEGIN PP; |
||
229 | return PRAGMA_DEBUG_OFF; |
||
230 | } |
||
231 | ^{SPC}#{SPC}pragma{SPCP}optimize{SPC}\({SPC}on{SPC}\) { |
||
232 | BEGIN PP; |
||
233 | return PRAGMA_OPTIMIZE_ON; |
||
234 | } |
||
235 | ^{SPC}#{SPC}pragma{SPCP}optimize{SPC}\({SPC}off{SPC}\) { |
||
236 | BEGIN PP; |
||
237 | return PRAGMA_OPTIMIZE_OFF; |
||
238 | } |
||
239 | ^{SPC}#{SPC}pragma{SPCP}STDGL{SPCP}invariant{SPC}\({SPC}all{SPC}\) { |
||
240 | BEGIN PP; |
||
241 | return PRAGMA_INVARIANT_ALL; |
||
242 | } |
||
243 | ^{SPC}#{SPC}pragma{SPCP} { BEGIN PRAGMA; } |
||
244 | |||
245 |
|
||
246 |
|
||
247 | |||
248 |
|
||
249 |
|
||
250 |
|
||
251 |
|
||
252 | void *mem_ctx = yyextra; |
||
253 | yylval->identifier = ralloc_strdup(mem_ctx, yytext); |
||
254 | return IDENTIFIER; |
||
255 | } |
||
256 |
|
||
257 | yylval->n = strtol(yytext, NULL, 10); |
||
258 | return INTCONSTANT; |
||
259 | } |
||
260 |
|
||
261 |
|
||
262 | |||
263 | \n { yylineno++; yycolumn = 0; } |
||
264 | |||
265 | attribute DEPRECATED_ES_KEYWORD(ATTRIBUTE); |
||
266 | const return CONST_TOK; |
||
267 | bool return BOOL_TOK; |
||
268 | float return FLOAT_TOK; |
||
269 | int return INT_TOK; |
||
270 | uint KEYWORD(130, 300, 130, 300, UINT_TOK); |
||
271 | |||
272 | break return BREAK; |
||
273 | continue return CONTINUE; |
||
274 | do return DO; |
||
275 | while return WHILE; |
||
276 | else return ELSE; |
||
277 | for return FOR; |
||
278 | if return IF; |
||
279 | discard return DISCARD; |
||
280 | return return RETURN; |
||
281 | |||
282 | bvec2 return BVEC2; |
||
283 | bvec3 return BVEC3; |
||
284 | bvec4 return BVEC4; |
||
285 | ivec2 return IVEC2; |
||
286 | ivec3 return IVEC3; |
||
287 | ivec4 return IVEC4; |
||
288 | uvec2 KEYWORD(130, 300, 130, 300, UVEC2); |
||
289 | uvec3 KEYWORD(130, 300, 130, 300, UVEC3); |
||
290 | uvec4 KEYWORD(130, 300, 130, 300, UVEC4); |
||
291 | vec2 return VEC2; |
||
292 | vec3 return VEC3; |
||
293 | vec4 return VEC4; |
||
294 | mat2 return MAT2X2; |
||
295 | mat3 return MAT3X3; |
||
296 | mat4 return MAT4X4; |
||
297 | mat2x2 KEYWORD(120, 300, 120, 300, MAT2X2); |
||
298 | mat2x3 KEYWORD(120, 300, 120, 300, MAT2X3); |
||
299 | mat2x4 KEYWORD(120, 300, 120, 300, MAT2X4); |
||
300 | mat3x2 KEYWORD(120, 300, 120, 300, MAT3X2); |
||
301 | mat3x3 KEYWORD(120, 300, 120, 300, MAT3X3); |
||
302 | mat3x4 KEYWORD(120, 300, 120, 300, MAT3X4); |
||
303 | mat4x2 KEYWORD(120, 300, 120, 300, MAT4X2); |
||
304 | mat4x3 KEYWORD(120, 300, 120, 300, MAT4X3); |
||
305 | mat4x4 KEYWORD(120, 300, 120, 300, MAT4X4); |
||
306 | |||
307 | in return IN_TOK; |
||
308 | out return OUT_TOK; |
||
309 | inout return INOUT_TOK; |
||
310 | uniform return UNIFORM; |
||
311 | varying DEPRECATED_ES_KEYWORD(VARYING); |
||
312 | centroid KEYWORD(120, 300, 120, 300, CENTROID); |
||
313 | invariant KEYWORD(120, 100, 120, 100, INVARIANT); |
||
314 | flat KEYWORD(130, 100, 130, 300, FLAT); |
||
315 | smooth KEYWORD(130, 300, 130, 300, SMOOTH); |
||
316 | noperspective KEYWORD(130, 300, 130, 0, NOPERSPECTIVE); |
||
317 | |||
318 | sampler1D DEPRECATED_ES_KEYWORD(SAMPLER1D); |
||
319 | sampler2D return SAMPLER2D; |
||
320 | sampler3D return SAMPLER3D; |
||
321 | samplerCube return SAMPLERCUBE; |
||
322 | sampler1DArray KEYWORD(130, 300, 130, 0, SAMPLER1DARRAY); |
||
323 | sampler2DArray KEYWORD(130, 300, 130, 300, SAMPLER2DARRAY); |
||
324 | sampler1DShadow DEPRECATED_ES_KEYWORD(SAMPLER1DSHADOW); |
||
325 | sampler2DShadow return SAMPLER2DSHADOW; |
||
326 | samplerCubeShadow KEYWORD(130, 300, 130, 300, SAMPLERCUBESHADOW); |
||
327 | sampler1DArrayShadow KEYWORD(130, 300, 130, 0, SAMPLER1DARRAYSHADOW); |
||
328 | sampler2DArrayShadow KEYWORD(130, 300, 130, 300, SAMPLER2DARRAYSHADOW); |
||
329 | isampler1D KEYWORD(130, 300, 130, 0, ISAMPLER1D); |
||
330 | isampler2D KEYWORD(130, 300, 130, 300, ISAMPLER2D); |
||
331 | isampler3D KEYWORD(130, 300, 130, 300, ISAMPLER3D); |
||
332 | isamplerCube KEYWORD(130, 300, 130, 300, ISAMPLERCUBE); |
||
333 | isampler1DArray KEYWORD(130, 300, 130, 0, ISAMPLER1DARRAY); |
||
334 | isampler2DArray KEYWORD(130, 300, 130, 300, ISAMPLER2DARRAY); |
||
335 | usampler1D KEYWORD(130, 300, 130, 0, USAMPLER1D); |
||
336 | usampler2D KEYWORD(130, 300, 130, 300, USAMPLER2D); |
||
337 | usampler3D KEYWORD(130, 300, 130, 300, USAMPLER3D); |
||
338 | usamplerCube KEYWORD(130, 300, 130, 300, USAMPLERCUBE); |
||
339 | usampler1DArray KEYWORD(130, 300, 130, 0, USAMPLER1DARRAY); |
||
340 | usampler2DArray KEYWORD(130, 300, 130, 300, USAMPLER2DARRAY); |
||
341 | |||
342 | /* additional keywords in ARB_texture_multisample, included in GLSL 1.50 */ |
||
343 | /* these are reserved but not defined in GLSL 3.00 */ |
||
344 | sampler2DMS KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, SAMPLER2DMS); |
||
345 | isampler2DMS KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, ISAMPLER2DMS); |
||
346 | usampler2DMS KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, USAMPLER2DMS); |
||
347 | sampler2DMSArray KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, SAMPLER2DMSARRAY); |
||
348 | isampler2DMSArray KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, ISAMPLER2DMSARRAY); |
||
349 | usampler2DMSArray KEYWORD_WITH_ALT(150, 300, 150, 0, yyextra->ARB_texture_multisample_enable, USAMPLER2DMSARRAY); |
||
350 | |||
351 | /* keywords available with ARB_texture_cube_map_array_enable extension on desktop GLSL */ |
||
352 | samplerCubeArray KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, SAMPLERCUBEARRAY); |
||
353 | isamplerCubeArray KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, ISAMPLERCUBEARRAY); |
||
354 | usamplerCubeArray KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, USAMPLERCUBEARRAY); |
||
355 | samplerCubeArrayShadow KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_texture_cube_map_array_enable, SAMPLERCUBEARRAYSHADOW); |
||
356 | |||
357 | samplerExternalOES { |
||
358 | if (yyextra->OES_EGL_image_external_enable) |
||
359 | return SAMPLEREXTERNALOES; |
||
360 | else |
||
361 | return IDENTIFIER; |
||
362 | } |
||
363 | |||
364 | /* keywords available with ARB_gpu_shader5 */ |
||
365 | precise KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_gpu_shader5_enable, PRECISE); |
||
366 | |||
367 | /* keywords available with ARB_shader_image_load_store */ |
||
368 | image1D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE1D); |
||
369 | image2D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2D); |
||
370 | image3D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE3D); |
||
371 | image2DRect KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DRECT); |
||
372 | imageCube KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGECUBE); |
||
373 | imageBuffer KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGEBUFFER); |
||
374 | image1DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE1DARRAY); |
||
375 | image2DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DARRAY); |
||
376 | imageCubeArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGECUBEARRAY); |
||
377 | image2DMS KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DMS); |
||
378 | image2DMSArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DMSARRAY); |
||
379 | iimage1D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE1D); |
||
380 | iimage2D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2D); |
||
381 | iimage3D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE3D); |
||
382 | iimage2DRect KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DRECT); |
||
383 | iimageCube KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGECUBE); |
||
384 | iimageBuffer KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGEBUFFER); |
||
385 | iimage1DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE1DARRAY); |
||
386 | iimage2DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DARRAY); |
||
387 | iimageCubeArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGECUBEARRAY); |
||
388 | iimage2DMS KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DMS); |
||
389 | iimage2DMSArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DMSARRAY); |
||
390 | uimage1D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE1D); |
||
391 | uimage2D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2D); |
||
392 | uimage3D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE3D); |
||
393 | uimage2DRect KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DRECT); |
||
394 | uimageCube KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGECUBE); |
||
395 | uimageBuffer KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGEBUFFER); |
||
396 | uimage1DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE1DARRAY); |
||
397 | uimage2DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DARRAY); |
||
398 | uimageCubeArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGECUBEARRAY); |
||
399 | uimage2DMS KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DMS); |
||
400 | uimage2DMSArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DMSARRAY); |
||
401 | image1DShadow KEYWORD(130, 300, 0, 0, IMAGE1DSHADOW); |
||
402 | image2DShadow KEYWORD(130, 300, 0, 0, IMAGE2DSHADOW); |
||
403 | image1DArrayShadow KEYWORD(130, 300, 0, 0, IMAGE1DARRAYSHADOW); |
||
404 | image2DArrayShadow KEYWORD(130, 300, 0, 0, IMAGE2DARRAYSHADOW); |
||
405 | |||
406 | coherent KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, COHERENT); |
||
407 | volatile KEYWORD_WITH_ALT(110, 100, 420, 0, yyextra->ARB_shader_image_load_store_enable, VOLATILE); |
||
408 | restrict KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, RESTRICT); |
||
409 | readonly KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, READONLY); |
||
410 | writeonly KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, WRITEONLY); |
||
411 | |||
412 | atomic_uint KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_atomic_counters_enable, ATOMIC_UINT); |
||
413 | |||
414 | struct return STRUCT; |
||
415 | void return VOID_TOK; |
||
416 | |||
417 | layout { |
||
418 | if ((yyextra->is_version(140, 300)) |
||
419 | || yyextra->AMD_conservative_depth_enable |
||
420 | || yyextra->ARB_conservative_depth_enable |
||
421 | || yyextra->ARB_explicit_attrib_location_enable |
||
422 | || yyextra->ARB_explicit_uniform_location_enable |
||
423 | || yyextra->has_separate_shader_objects() |
||
424 | || yyextra->ARB_uniform_buffer_object_enable |
||
425 | || yyextra->ARB_fragment_coord_conventions_enable |
||
426 | || yyextra->ARB_shading_language_420pack_enable |
||
427 | || yyextra->ARB_compute_shader_enable) { |
||
428 | return LAYOUT_TOK; |
||
429 | } else { |
||
430 | void *mem_ctx = yyextra; |
||
431 | yylval->identifier = ralloc_strdup(mem_ctx, yytext); |
||
432 | return classify_identifier(yyextra, yytext); |
||
433 | } |
||
434 | } |
||
435 | |||
436 | \+\+ return INC_OP; |
||
437 | -- return DEC_OP; |
||
438 | \<= return LE_OP; |
||
439 | >= return GE_OP; |
||
440 | == return EQ_OP; |
||
441 | != return NE_OP; |
||
442 | && return AND_OP; |
||
443 | \|\| return OR_OP; |
||
444 | "^^" return XOR_OP; |
||
445 | "<<" return LEFT_OP; |
||
446 | ">>" return RIGHT_OP; |
||
447 | |||
448 | \*= return MUL_ASSIGN; |
||
449 | \/= return DIV_ASSIGN; |
||
450 | \+= return ADD_ASSIGN; |
||
451 | \%= return MOD_ASSIGN; |
||
452 | \<\<= return LEFT_ASSIGN; |
||
453 | >>= return RIGHT_ASSIGN; |
||
454 | &= return AND_ASSIGN; |
||
455 | "^=" return XOR_ASSIGN; |
||
456 | \|= return OR_ASSIGN; |
||
457 | -= return SUB_ASSIGN; |
||
458 | |||
459 | [1-9][0-9]*[uU]? { |
||
460 | return LITERAL_INTEGER(10); |
||
461 | } |
||
462 | 0[xX][0-9a-fA-F]+[uU]? { |
||
463 | return LITERAL_INTEGER(16); |
||
464 | } |
||
465 | 0[0-7]*[uU]? { |
||
466 | return LITERAL_INTEGER(8); |
||
467 | } |
||
468 | |||
469 | [0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]? | |
||
470 | \.[0-9]+([eE][+-]?[0-9]+)?[fF]? | |
||
471 | [0-9]+\.([eE][+-]?[0-9]+)?[fF]? | |
||
472 | [0-9]+[eE][+-]?[0-9]+[fF]? { |
||
473 | yylval->real = _mesa_strtof(yytext, NULL); |
||
474 | return FLOATCONSTANT; |
||
475 | } |
||
476 | |||
477 | [0-9]+\.[0-9]+([eE][+-]?[0-9]+)?(lf|LF) | |
||
478 | \.[0-9]+([eE][+-]?[0-9]+)?(lf|LF) | |
||
479 | [0-9]+\.([eE][+-]?[0-9]+)?(lf|LF) | |
||
480 | [0-9]+[eE][+-]?[0-9]+(lf|LF) { |
||
481 | if (!yyextra->is_version(400, 0) && |
||
482 | !yyextra->ARB_gpu_shader_fp64_enable) |
||
483 | return ERROR_TOK; |
||
484 | yylval->dreal = _mesa_strtod(yytext, NULL); |
||
485 | return DOUBLECONSTANT; |
||
486 | } |
||
487 | |||
488 | true { |
||
489 | yylval->n = 1; |
||
490 | return BOOLCONSTANT; |
||
491 | } |
||
492 | false { |
||
493 | yylval->n = 0; |
||
494 | return BOOLCONSTANT; |
||
495 | } |
||
496 | |||
497 | |||
498 | /* Reserved words in GLSL 1.10. */ |
||
499 | asm KEYWORD(110, 100, 0, 0, ASM); |
||
500 | class KEYWORD(110, 100, 0, 0, CLASS); |
||
501 | union KEYWORD(110, 100, 0, 0, UNION); |
||
502 | enum KEYWORD(110, 100, 0, 0, ENUM); |
||
503 | typedef KEYWORD(110, 100, 0, 0, TYPEDEF); |
||
504 | template KEYWORD(110, 100, 0, 0, TEMPLATE); |
||
505 | this KEYWORD(110, 100, 0, 0, THIS); |
||
506 | packed KEYWORD_WITH_ALT(110, 100, 140, 300, yyextra->ARB_uniform_buffer_object_enable, PACKED_TOK); |
||
507 | goto KEYWORD(110, 100, 0, 0, GOTO); |
||
508 | switch KEYWORD(110, 100, 130, 300, SWITCH); |
||
509 | default KEYWORD(110, 100, 130, 300, DEFAULT); |
||
510 | inline KEYWORD(110, 100, 0, 0, INLINE_TOK); |
||
511 | noinline KEYWORD(110, 100, 0, 0, NOINLINE); |
||
512 | public KEYWORD(110, 100, 0, 0, PUBLIC_TOK); |
||
513 | static KEYWORD(110, 100, 0, 0, STATIC); |
||
514 | extern KEYWORD(110, 100, 0, 0, EXTERN); |
||
515 | external KEYWORD(110, 100, 0, 0, EXTERNAL); |
||
516 | interface KEYWORD(110, 100, 0, 0, INTERFACE); |
||
517 | long KEYWORD(110, 100, 0, 0, LONG_TOK); |
||
518 | short KEYWORD(110, 100, 0, 0, SHORT_TOK); |
||
519 | double KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DOUBLE_TOK); |
||
520 | half KEYWORD(110, 100, 0, 0, HALF); |
||
521 | fixed KEYWORD(110, 100, 0, 0, FIXED_TOK); |
||
522 | unsigned KEYWORD(110, 100, 0, 0, UNSIGNED); |
||
523 | input KEYWORD(110, 100, 0, 0, INPUT_TOK); |
||
524 | output KEYWORD(110, 100, 0, 0, OUTPUT); |
||
525 | hvec2 KEYWORD(110, 100, 0, 0, HVEC2); |
||
526 | hvec3 KEYWORD(110, 100, 0, 0, HVEC3); |
||
527 | hvec4 KEYWORD(110, 100, 0, 0, HVEC4); |
||
528 | dvec2 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DVEC2); |
||
529 | dvec3 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DVEC3); |
||
530 | dvec4 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DVEC4); |
||
531 | dmat2 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT2X2); |
||
532 | dmat3 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT3X3); |
||
533 | dmat4 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT4X4); |
||
534 | dmat2x2 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT2X2); |
||
535 | dmat2x3 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT2X3); |
||
536 | dmat2x4 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT2X4); |
||
537 | dmat3x2 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT3X2); |
||
538 | dmat3x3 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT3X3); |
||
539 | dmat3x4 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT3X4); |
||
540 | dmat4x2 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT4X2); |
||
541 | dmat4x3 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT4X3); |
||
542 | dmat4x4 KEYWORD_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, DMAT4X4); |
||
543 | fvec2 KEYWORD(110, 100, 0, 0, FVEC2); |
||
544 | fvec3 KEYWORD(110, 100, 0, 0, FVEC3); |
||
545 | fvec4 KEYWORD(110, 100, 0, 0, FVEC4); |
||
546 | sampler2DRect DEPRECATED_ES_KEYWORD(SAMPLER2DRECT); |
||
547 | sampler3DRect KEYWORD(110, 100, 0, 0, SAMPLER3DRECT); |
||
548 | sampler2DRectShadow DEPRECATED_ES_KEYWORD(SAMPLER2DRECTSHADOW); |
||
549 | sizeof KEYWORD(110, 100, 0, 0, SIZEOF); |
||
550 | cast KEYWORD(110, 100, 0, 0, CAST); |
||
551 | namespace KEYWORD(110, 100, 0, 0, NAMESPACE); |
||
552 | using KEYWORD(110, 100, 0, 0, USING); |
||
553 | |||
554 | /* Additional reserved words in GLSL 1.20. */ |
||
555 | lowp KEYWORD(120, 100, 130, 100, LOWP); |
||
556 | mediump KEYWORD(120, 100, 130, 100, MEDIUMP); |
||
557 | highp KEYWORD(120, 100, 130, 100, HIGHP); |
||
558 | precision KEYWORD(120, 100, 130, 100, PRECISION); |
||
559 | |||
560 | /* Additional reserved words in GLSL 1.30. */ |
||
561 | case KEYWORD(130, 300, 130, 300, CASE); |
||
562 | common KEYWORD(130, 300, 0, 0, COMMON); |
||
563 | partition KEYWORD(130, 300, 0, 0, PARTITION); |
||
564 | active KEYWORD(130, 300, 0, 0, ACTIVE); |
||
565 | superp KEYWORD(130, 100, 0, 0, SUPERP); |
||
566 | samplerBuffer KEYWORD(130, 300, 140, 0, SAMPLERBUFFER); |
||
567 | filter KEYWORD(130, 300, 0, 0, FILTER); |
||
568 | row_major KEYWORD_WITH_ALT(130, 0, 140, 0, yyextra->ARB_uniform_buffer_object_enable && !yyextra->es_shader, ROW_MAJOR); |
||
569 | |||
570 | /* Additional reserved words in GLSL 1.40 */ |
||
571 | isampler2DRect KEYWORD(140, 300, 140, 0, ISAMPLER2DRECT); |
||
572 | usampler2DRect KEYWORD(140, 300, 140, 0, USAMPLER2DRECT); |
||
573 | isamplerBuffer KEYWORD(140, 300, 140, 0, ISAMPLERBUFFER); |
||
574 | usamplerBuffer KEYWORD(140, 300, 140, 0, USAMPLERBUFFER); |
||
575 | |||
576 | /* Additional reserved words in GLSL ES 3.00 */ |
||
577 | resource KEYWORD(0, 300, 0, 0, RESOURCE); |
||
578 | patch KEYWORD(0, 300, 0, 0, PATCH); |
||
579 | sample KEYWORD_WITH_ALT(400, 300, 400, 0, yyextra->ARB_gpu_shader5_enable, SAMPLE); |
||
580 | subroutine KEYWORD(0, 300, 0, 0, SUBROUTINE); |
||
581 | |||
582 | |||
583 | [_a-zA-Z][_a-zA-Z0-9]* { |
||
584 | struct _mesa_glsl_parse_state *state = yyextra; |
||
585 | void *ctx = state; |
||
586 | if (state->es_shader && strlen(yytext) > 1024) { |
||
587 | _mesa_glsl_error(yylloc, state, |
||
588 | "Identifier `%s' exceeds 1024 characters", |
||
589 | yytext); |
||
590 | } else { |
||
591 | yylval->identifier = ralloc_strdup(ctx, yytext); |
||
592 | } |
||
593 | return classify_identifier(state, yytext); |
||
594 | } |
||
595 | |||
596 | . { return yytext[0]; } |
||
597 | |||
598 | %% |
||
599 | |||
600 | int |
||
601 | classify_identifier(struct _mesa_glsl_parse_state *state, const char *name) |
||
602 | { |
||
603 | if (state->symbols->get_variable(name) || state->symbols->get_function(name)) |
||
604 | return IDENTIFIER; |
||
605 | else if (state->symbols->get_type(name)) |
||
606 | return TYPE_IDENTIFIER; |
||
607 | else |
||
608 | return NEW_IDENTIFIER; |
||
609 | } |
||
610 | |||
611 | void |
||
612 | _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state, const char *string) |
||
613 | { |
||
614 | yylex_init_extra(state, & state->scanner); |
||
615 | yy_scan_string(string, state->scanner); |
||
616 | } |
||
617 | |||
618 | void |
||
619 | _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state) |
||
620 | { |
||
621 | yylex_destroy(state->scanner); |
||
622 | }=>\<=>"><">=>> |