xref: /aosp_15_r20/external/angle/src/compiler/translator/glslang.l (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker /*
2*8975f5c5SAndroid Build Coastguard Worker //
3*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved.
4*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
5*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
6*8975f5c5SAndroid Build Coastguard Worker //
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker This file contains the Lex specification for GLSL ES.
9*8975f5c5SAndroid Build Coastguard Worker Based on ANSI C grammar, Lex specification:
10*8975f5c5SAndroid Build Coastguard Worker http://www.lysator.liu.se/c/ANSI-C-grammar-l.html
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN scripts/run_code_generation.py
13*8975f5c5SAndroid Build Coastguard Worker WHICH GENERATES THE GLSL ES LEXER (glslang_lex_autogen.cpp).
14*8975f5c5SAndroid Build Coastguard Worker */
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker %top{
17*8975f5c5SAndroid Build Coastguard Worker // GENERATED FILE - DO NOT EDIT.
18*8975f5c5SAndroid Build Coastguard Worker // Generated by generate_parser.py from glslang.l
19*8975f5c5SAndroid Build Coastguard Worker //
20*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 The ANGLE Project Authors. All rights reserved.
21*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
22*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
23*8975f5c5SAndroid Build Coastguard Worker //
24*8975f5c5SAndroid Build Coastguard Worker // glslang.l:
25*8975f5c5SAndroid Build Coastguard Worker //   Lexer for the OpenGL shading language.
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker // Ignore errors in auto-generated code.
28*8975f5c5SAndroid Build Coastguard Worker #if defined(__GNUC__)
29*8975f5c5SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wswitch-enum"
30*8975f5c5SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wunused-function"
31*8975f5c5SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wunused-variable"
32*8975f5c5SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
33*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4005)
34*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4065)
35*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4189)
36*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4244)
37*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4505)
38*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4701)
39*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable: 4702)
40*8975f5c5SAndroid Build Coastguard Worker #endif
41*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
42*8975f5c5SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wimplicit-fallthrough"
43*8975f5c5SAndroid Build Coastguard Worker #if defined(__APPLE__)
44*8975f5c5SAndroid Build Coastguard Worker // Older clang versions don't have -Wextra-semi-stmt, and detecting Apple clang versions is
45*8975f5c5SAndroid Build Coastguard Worker // difficult because they use different yet overlapping version numbers vs. regular clang.
46*8975f5c5SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wunknown-warning-option"
47*8975f5c5SAndroid Build Coastguard Worker #endif
48*8975f5c5SAndroid Build Coastguard Worker // Flex isn't semi-colon clean.
49*8975f5c5SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wextra-semi-stmt"
50*8975f5c5SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wunreachable-code"
51*8975f5c5SAndroid Build Coastguard Worker #endif
52*8975f5c5SAndroid Build Coastguard Worker }
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker %{
55*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/glslang.h"
56*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/ParseContext.h"
57*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/Token.h"
58*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/util.h"
59*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/length_limits.h"
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker using namespace sh;
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker #include "glslang_tab_autogen.h"
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker /* windows only pragma */
66*8975f5c5SAndroid Build Coastguard Worker #ifdef _MSC_VER
67*8975f5c5SAndroid Build Coastguard Worker #pragma warning(disable : 4102)
68*8975f5c5SAndroid Build Coastguard Worker #endif
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker // Workaround for flex using the register keyword, deprecated in C++11.
71*8975f5c5SAndroid Build Coastguard Worker #ifdef __cplusplus
72*8975f5c5SAndroid Build Coastguard Worker #if __cplusplus > 199711L
73*8975f5c5SAndroid Build Coastguard Worker #define register
74*8975f5c5SAndroid Build Coastguard Worker #endif
75*8975f5c5SAndroid Build Coastguard Worker #endif
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker #define YY_NO_INPUT
78*8975f5c5SAndroid Build Coastguard Worker #define YY_USER_ACTION                                 \
79*8975f5c5SAndroid Build Coastguard Worker     yylloc->first_file = yylloc->last_file = yycolumn; \
80*8975f5c5SAndroid Build Coastguard Worker     yylloc->first_line = yylloc->last_line = yylineno;
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker #define YY_INPUT(buf, result, max_size) \
83*8975f5c5SAndroid Build Coastguard Worker     result = string_input(buf, max_size, yyscanner);
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker static yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner);
86*8975f5c5SAndroid Build Coastguard Worker static int check_type(yyscan_t yyscanner);
87*8975f5c5SAndroid Build Coastguard Worker static int reserved_word(yyscan_t yyscanner);
88*8975f5c5SAndroid Build Coastguard Worker // Tests if an extension is enabled.  If the extension is promoted to core, this function returns true.
89*8975f5c5SAndroid Build Coastguard Worker static bool is_extension_enabled_or_is_core(TParseContext *context,
90*8975f5c5SAndroid Build Coastguard Worker         int extension_version, TExtension extension, int promotion_version);
91*8975f5c5SAndroid Build Coastguard Worker // Helpers to determine if a symbol is reserved, keyword in extension or core, or identifier.
92*8975f5c5SAndroid Build Coastguard Worker // Formatted as:
93*8975f5c5SAndroid Build Coastguard Worker //
94*8975f5c5SAndroid Build Coastguard Worker //    [V1_reserved_][V2_extension_][V3_keyword]
95*8975f5c5SAndroid Build Coastguard Worker //
96*8975f5c5SAndroid Build Coastguard Worker // which means in version V1, the symbol is reserved, and remains reserved until V3.  From versions
97*8975f5c5SAndroid Build Coastguard Worker // V2 until V3, it's a keyword if the extension is enabled.  From version V3 on, it's a keyword in
98*8975f5c5SAndroid Build Coastguard Worker // the spec itself.  Prior to V1, the symbol can be used as identifier.
99*8975f5c5SAndroid Build Coastguard Worker static int ES2_extensions_ES3_keyword(TParseContext *context, TExtension extension1, TExtension extension2, TExtension extension3, int token);
100*8975f5c5SAndroid Build Coastguard Worker static int ES2_reserved_ES3_keyword(TParseContext *context, int token);
101*8975f5c5SAndroid Build Coastguard Worker static int ES2_keyword_ES3_reserved(TParseContext *context, int token);
102*8975f5c5SAndroid Build Coastguard Worker static int ES3_keyword(TParseContext *context, int token);
103*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_1_keyword(TParseContext *context, int token);
104*8975f5c5SAndroid Build Coastguard Worker static int ES2_reserved_ES3_1_keyword(TParseContext *context, int token);
105*8975f5c5SAndroid Build Coastguard Worker static int ES3_1_keyword(TParseContext *context, int token);
106*8975f5c5SAndroid Build Coastguard Worker static int ES2_reserved_ES2_extension_ES3_keyword(TParseContext *context, TExtension extension, int token);
107*8975f5c5SAndroid Build Coastguard Worker static int ES3_extension(TParseContext *context, TExtension extension, int token);
108*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token);
109*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token);
110*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_extension(TParseContext *context, TExtension extension, int token);
111*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext *context, TExtension extension, int token);
112*8975f5c5SAndroid Build Coastguard Worker static int ES3_reserved_ES3_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token);
113*8975f5c5SAndroid Build Coastguard Worker static int ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token1, int token2);
114*8975f5c5SAndroid Build Coastguard Worker static int ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token1, int token2);
115*8975f5c5SAndroid Build Coastguard Worker static int WEBGL_video_texture_extension(TParseContext *context, int token);
116*8975f5c5SAndroid Build Coastguard Worker static int uint_constant(TParseContext *context);
117*8975f5c5SAndroid Build Coastguard Worker static int int_constant(TParseContext *context);
118*8975f5c5SAndroid Build Coastguard Worker static int float_constant(yyscan_t yyscanner);
119*8975f5c5SAndroid Build Coastguard Worker static int floatsuffix_check(TParseContext* context);
120*8975f5c5SAndroid Build Coastguard Worker static int yuvcscstandardext_constant(TParseContext *context);
121*8975f5c5SAndroid Build Coastguard Worker %}
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker %option noyywrap nounput never-interactive
124*8975f5c5SAndroid Build Coastguard Worker %option yylineno reentrant bison-bridge bison-locations
125*8975f5c5SAndroid Build Coastguard Worker %option extra-type="TParseContext*"
126*8975f5c5SAndroid Build Coastguard Worker %x FIELDS
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker D           [0-9]
129*8975f5c5SAndroid Build Coastguard Worker L           [a-zA-Z_]
130*8975f5c5SAndroid Build Coastguard Worker H           [a-fA-F0-9]
131*8975f5c5SAndroid Build Coastguard Worker E           [Ee][+-]?{D}+
132*8975f5c5SAndroid Build Coastguard Worker O           [0-7]
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker %%
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker %{
137*8975f5c5SAndroid Build Coastguard Worker     TParseContext* context = yyextra;
138*8975f5c5SAndroid Build Coastguard Worker %}
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker "invariant"    { return INVARIANT; }
141*8975f5c5SAndroid Build Coastguard Worker "highp"        { return HIGH_PRECISION; }
142*8975f5c5SAndroid Build Coastguard Worker "mediump"      { return MEDIUM_PRECISION; }
143*8975f5c5SAndroid Build Coastguard Worker "lowp"         { return LOW_PRECISION; }
144*8975f5c5SAndroid Build Coastguard Worker "precision"    { return PRECISION; }
145*8975f5c5SAndroid Build Coastguard Worker 
146*8975f5c5SAndroid Build Coastguard Worker "attribute"    { return ES2_keyword_ES3_reserved(context, ATTRIBUTE); }
147*8975f5c5SAndroid Build Coastguard Worker "const"        { return CONST_QUAL; }
148*8975f5c5SAndroid Build Coastguard Worker "uniform"      { return UNIFORM; }
149*8975f5c5SAndroid Build Coastguard Worker "buffer"       { return ES3_1_keyword(context, BUFFER); }
150*8975f5c5SAndroid Build Coastguard Worker "varying"      { return ES2_keyword_ES3_reserved(context, VARYING); }
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker "break"        { return BREAK; }
153*8975f5c5SAndroid Build Coastguard Worker "continue"     { return CONTINUE; }
154*8975f5c5SAndroid Build Coastguard Worker "do"           { return DO; }
155*8975f5c5SAndroid Build Coastguard Worker "for"          { return FOR; }
156*8975f5c5SAndroid Build Coastguard Worker "while"        { return WHILE; }
157*8975f5c5SAndroid Build Coastguard Worker 
158*8975f5c5SAndroid Build Coastguard Worker "if"           { return IF; }
159*8975f5c5SAndroid Build Coastguard Worker "else"         { return ELSE; }
160*8975f5c5SAndroid Build Coastguard Worker "switch"       { return ES2_reserved_ES3_keyword(context, SWITCH); }
161*8975f5c5SAndroid Build Coastguard Worker "case"         { return ES3_keyword(context, CASE); }
162*8975f5c5SAndroid Build Coastguard Worker "default"      { return ES2_reserved_ES3_keyword(context, DEFAULT); }
163*8975f5c5SAndroid Build Coastguard Worker 
164*8975f5c5SAndroid Build Coastguard Worker "centroid"      { return ES3_keyword(context, CENTROID); }
165*8975f5c5SAndroid Build Coastguard Worker "flat"          { return ES2_reserved_ES3_keyword(context, FLAT); }
166*8975f5c5SAndroid Build Coastguard Worker "smooth"        { return ES3_keyword(context, SMOOTH); }
167*8975f5c5SAndroid Build Coastguard Worker "noperspective" { return ES3_reserved_ES3_extension(context, TExtension::NV_shader_noperspective_interpolation, NOPERSPECTIVE); }
168*8975f5c5SAndroid Build Coastguard Worker 
169*8975f5c5SAndroid Build Coastguard Worker "patch"        { return ES3_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::EXT_tessellation_shader, TExtension::OES_tessellation_shader, PATCH); }
170*8975f5c5SAndroid Build Coastguard Worker 
171*8975f5c5SAndroid Build Coastguard Worker "in"           { return IN_QUAL; }
172*8975f5c5SAndroid Build Coastguard Worker "out"          { return OUT_QUAL; }
173*8975f5c5SAndroid Build Coastguard Worker "inout"        { return INOUT_QUAL; }
174*8975f5c5SAndroid Build Coastguard Worker "shared"       { return ES3_1_keyword(context, SHARED); }
175*8975f5c5SAndroid Build Coastguard Worker 
176*8975f5c5SAndroid Build Coastguard Worker "float"        { return FLOAT_TYPE; }
177*8975f5c5SAndroid Build Coastguard Worker "int"          { return INT_TYPE; }
178*8975f5c5SAndroid Build Coastguard Worker "uint"         { return ES3_keyword(context, UINT_TYPE); }
179*8975f5c5SAndroid Build Coastguard Worker "void"         { return VOID_TYPE; }
180*8975f5c5SAndroid Build Coastguard Worker "bool"         { return BOOL_TYPE; }
181*8975f5c5SAndroid Build Coastguard Worker "true"         { yylval->lex.b = true;  return BOOLCONSTANT; }
182*8975f5c5SAndroid Build Coastguard Worker "false"        { yylval->lex.b = false; return BOOLCONSTANT; }
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker "discard"      { return DISCARD; }
185*8975f5c5SAndroid Build Coastguard Worker "return"       { return RETURN; }
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker "mat2"         { return MATRIX2; }
188*8975f5c5SAndroid Build Coastguard Worker "mat3"         { return MATRIX3; }
189*8975f5c5SAndroid Build Coastguard Worker "mat4"         { return MATRIX4; }
190*8975f5c5SAndroid Build Coastguard Worker 
191*8975f5c5SAndroid Build Coastguard Worker "mat2x2"         { return ES3_keyword(context, MATRIX2); }
192*8975f5c5SAndroid Build Coastguard Worker "mat3x3"         { return ES3_keyword(context, MATRIX3); }
193*8975f5c5SAndroid Build Coastguard Worker "mat4x4"         { return ES3_keyword(context, MATRIX4); }
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker "mat2x3"         { return ES3_keyword(context, MATRIX2x3); }
196*8975f5c5SAndroid Build Coastguard Worker "mat3x2"         { return ES3_keyword(context, MATRIX3x2); }
197*8975f5c5SAndroid Build Coastguard Worker "mat2x4"         { return ES3_keyword(context, MATRIX2x4); }
198*8975f5c5SAndroid Build Coastguard Worker "mat4x2"         { return ES3_keyword(context, MATRIX4x2); }
199*8975f5c5SAndroid Build Coastguard Worker "mat3x4"         { return ES3_keyword(context, MATRIX3x4); }
200*8975f5c5SAndroid Build Coastguard Worker "mat4x3"         { return ES3_keyword(context, MATRIX4x3); }
201*8975f5c5SAndroid Build Coastguard Worker 
202*8975f5c5SAndroid Build Coastguard Worker "vec2"         { return VEC2; }
203*8975f5c5SAndroid Build Coastguard Worker "vec3"         { return VEC3; }
204*8975f5c5SAndroid Build Coastguard Worker "vec4"         { return VEC4; }
205*8975f5c5SAndroid Build Coastguard Worker "ivec2"        { return IVEC2; }
206*8975f5c5SAndroid Build Coastguard Worker "ivec3"        { return IVEC3; }
207*8975f5c5SAndroid Build Coastguard Worker "ivec4"        { return IVEC4; }
208*8975f5c5SAndroid Build Coastguard Worker "bvec2"        { return BVEC2; }
209*8975f5c5SAndroid Build Coastguard Worker "bvec3"        { return BVEC3; }
210*8975f5c5SAndroid Build Coastguard Worker "bvec4"        { return BVEC4; }
211*8975f5c5SAndroid Build Coastguard Worker "uvec2"        { return ES3_keyword(context, UVEC2); }
212*8975f5c5SAndroid Build Coastguard Worker "uvec3"        { return ES3_keyword(context, UVEC3); }
213*8975f5c5SAndroid Build Coastguard Worker "uvec4"        { return ES3_keyword(context, UVEC4); }
214*8975f5c5SAndroid Build Coastguard Worker 
215*8975f5c5SAndroid Build Coastguard Worker "sampler2D"            { return SAMPLER2D; }
216*8975f5c5SAndroid Build Coastguard Worker "samplerCube"          { return SAMPLERCUBE; }
217*8975f5c5SAndroid Build Coastguard Worker "samplerExternalOES"   { return SAMPLER_EXTERNAL_OES; }
218*8975f5c5SAndroid Build Coastguard Worker "sampler3D"            { return ES2_reserved_ES2_extension_ES3_keyword(context, TExtension::OES_texture_3D, SAMPLER3D); }
219*8975f5c5SAndroid Build Coastguard Worker "sampler3DRect"        { return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
220*8975f5c5SAndroid Build Coastguard Worker "sampler2DRect"        { return SAMPLER2DRECT; }
221*8975f5c5SAndroid Build Coastguard Worker "sampler2DArray"       { return ES3_keyword(context, SAMPLER2DARRAY); }
222*8975f5c5SAndroid Build Coastguard Worker "sampler2DMS"          { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, SAMPLER2DMS); }
223*8975f5c5SAndroid Build Coastguard Worker "isampler2D"           { return ES3_keyword(context, ISAMPLER2D); }
224*8975f5c5SAndroid Build Coastguard Worker "isampler3D"           { return ES3_keyword(context, ISAMPLER3D); }
225*8975f5c5SAndroid Build Coastguard Worker "isamplerCube"         { return ES3_keyword(context, ISAMPLERCUBE); }
226*8975f5c5SAndroid Build Coastguard Worker "isampler2DArray"      { return ES3_keyword(context, ISAMPLER2DARRAY); }
227*8975f5c5SAndroid Build Coastguard Worker "isampler2DMS"         { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, ISAMPLER2DMS); }
228*8975f5c5SAndroid Build Coastguard Worker "usampler2D"           { return ES3_keyword(context, USAMPLER2D); }
229*8975f5c5SAndroid Build Coastguard Worker "usampler3D"           { return ES3_keyword(context, USAMPLER3D); }
230*8975f5c5SAndroid Build Coastguard Worker "usamplerCube"         { return ES3_keyword(context, USAMPLERCUBE); }
231*8975f5c5SAndroid Build Coastguard Worker "usampler2DArray"      { return ES3_keyword(context, USAMPLER2DARRAY); }
232*8975f5c5SAndroid Build Coastguard Worker "usampler2DMS"         { return ES3_reserved_ES3_extension_ES3_1_keyword(context, TExtension::ANGLE_texture_multisample, USAMPLER2DMS); }
233*8975f5c5SAndroid Build Coastguard Worker "sampler2DShadow"      { return ES2_reserved_ES2_extension_ES3_keyword(context, TExtension::EXT_shadow_samplers, SAMPLER2DSHADOW); }
234*8975f5c5SAndroid Build Coastguard Worker "samplerCubeShadow"    { return ES3_keyword(context, SAMPLERCUBESHADOW); }
235*8975f5c5SAndroid Build Coastguard Worker "sampler2DArrayShadow" { return ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
236*8975f5c5SAndroid Build Coastguard Worker "__samplerExternal2DY2YEXT"   { return ES3_extension(context, TExtension::EXT_YUV_target, SAMPLEREXTERNAL2DY2YEXT); }
237*8975f5c5SAndroid Build Coastguard Worker "sampler2DMSArray"     { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, SAMPLER2DMSARRAY); }
238*8975f5c5SAndroid Build Coastguard Worker "isampler2DMSArray"    { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, ISAMPLER2DMSARRAY); }
239*8975f5c5SAndroid Build Coastguard Worker "usampler2DMSArray"    { return ES3_reserved_ES3_1_extension_ES3_2_keyword(context, TExtension::OES_texture_storage_multisample_2d_array, USAMPLER2DMSARRAY); }
240*8975f5c5SAndroid Build Coastguard Worker "samplerCubeArray"     { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, SAMPLERCUBEARRAYOES, SAMPLERCUBEARRAYEXT); }
241*8975f5c5SAndroid Build Coastguard Worker "samplerBuffer"        { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, SAMPLERBUFFER, SAMPLERBUFFER); }
242*8975f5c5SAndroid Build Coastguard Worker "samplerCubeArrayShadow"    { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, SAMPLERCUBEARRAYSHADOWOES, SAMPLERCUBEARRAYSHADOWEXT); }
243*8975f5c5SAndroid Build Coastguard Worker "isamplerCubeArray"    { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, ISAMPLERCUBEARRAYOES, ISAMPLERCUBEARRAYEXT); }
244*8975f5c5SAndroid Build Coastguard Worker "isamplerBuffer"       { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, ISAMPLERBUFFER, ISAMPLERBUFFER); }
245*8975f5c5SAndroid Build Coastguard Worker "usamplerCubeArray"    { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, USAMPLERCUBEARRAYOES, USAMPLERCUBEARRAYEXT); }
246*8975f5c5SAndroid Build Coastguard Worker "usamplerBuffer"       { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, USAMPLERBUFFER, USAMPLERBUFFER); }
247*8975f5c5SAndroid Build Coastguard Worker "samplerVideoWEBGL"    { return WEBGL_video_texture_extension(context, SAMPLERVIDEOWEBGL); }
248*8975f5c5SAndroid Build Coastguard Worker "struct"       { return STRUCT; }
249*8975f5c5SAndroid Build Coastguard Worker 
250*8975f5c5SAndroid Build Coastguard Worker "layout"  { return ES2_extensions_ES3_keyword(context, TExtension::EXT_shader_framebuffer_fetch, TExtension::EXT_shader_framebuffer_fetch_non_coherent, TExtension::KHR_blend_equation_advanced, LAYOUT); }
251*8975f5c5SAndroid Build Coastguard Worker 
252*8975f5c5SAndroid Build Coastguard Worker "yuvCscStandardEXT"    { return ES3_extension(context, TExtension::EXT_YUV_target, YUVCSCSTANDARDEXT); }
253*8975f5c5SAndroid Build Coastguard Worker "itu_601"              { return yuvcscstandardext_constant(context); }
254*8975f5c5SAndroid Build Coastguard Worker "itu_601_full_range"   { return yuvcscstandardext_constant(context); }
255*8975f5c5SAndroid Build Coastguard Worker "itu_709"              { return yuvcscstandardext_constant(context); }
256*8975f5c5SAndroid Build Coastguard Worker 
257*8975f5c5SAndroid Build Coastguard Worker "image2D" { return ES3_reserved_ES3_1_keyword(context, IMAGE2D); }
258*8975f5c5SAndroid Build Coastguard Worker "iimage2D" { return ES3_reserved_ES3_1_keyword(context, IIMAGE2D); }
259*8975f5c5SAndroid Build Coastguard Worker "uimage2D" { return ES3_reserved_ES3_1_keyword(context, UIMAGE2D); }
260*8975f5c5SAndroid Build Coastguard Worker "image2DArray" { return ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); }
261*8975f5c5SAndroid Build Coastguard Worker "iimage2DArray" { return ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); }
262*8975f5c5SAndroid Build Coastguard Worker "uimage2DArray" { return ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); }
263*8975f5c5SAndroid Build Coastguard Worker "image3D"  { return ES3_reserved_ES3_1_keyword(context, IMAGE3D); }
264*8975f5c5SAndroid Build Coastguard Worker "uimage3D" { return ES3_reserved_ES3_1_keyword(context, UIMAGE3D); }
265*8975f5c5SAndroid Build Coastguard Worker "iimage3D" { return ES3_reserved_ES3_1_keyword(context, IIMAGE3D); }
266*8975f5c5SAndroid Build Coastguard Worker "iimageCube" { return ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); }
267*8975f5c5SAndroid Build Coastguard Worker "uimageCube" { return ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); }
268*8975f5c5SAndroid Build Coastguard Worker "imageCube" { return ES3_reserved_ES3_1_keyword(context, IMAGECUBE); }
269*8975f5c5SAndroid Build Coastguard Worker "imageCubeArray"    { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, IMAGECUBEARRAYOES, IMAGECUBEARRAYEXT); }
270*8975f5c5SAndroid Build Coastguard Worker "iimageCubeArray"    { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, IIMAGECUBEARRAYOES, IIMAGECUBEARRAYEXT); }
271*8975f5c5SAndroid Build Coastguard Worker "uimageCubeArray"    { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_cube_map_array, TExtension::EXT_texture_cube_map_array, UIMAGECUBEARRAYOES, UIMAGECUBEARRAYEXT); }
272*8975f5c5SAndroid Build Coastguard Worker "imageBuffer"     { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, IMAGEBUFFER, IMAGEBUFFER); }
273*8975f5c5SAndroid Build Coastguard Worker "iimageBuffer"    { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, IIMAGEBUFFER, IIMAGEBUFFER); }
274*8975f5c5SAndroid Build Coastguard Worker "uimageBuffer"    { return ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::OES_texture_buffer, TExtension::EXT_texture_buffer, UIMAGEBUFFER, UIMAGEBUFFER); }
275*8975f5c5SAndroid Build Coastguard Worker "readonly" { return ES3_reserved_ES3_1_keyword(context, READONLY); }
276*8975f5c5SAndroid Build Coastguard Worker "writeonly" { return ES3_reserved_ES3_1_keyword(context, WRITEONLY); }
277*8975f5c5SAndroid Build Coastguard Worker "coherent" { return ES3_reserved_ES3_1_keyword(context, COHERENT); }
278*8975f5c5SAndroid Build Coastguard Worker "restrict" { return ES3_reserved_ES3_1_keyword(context, RESTRICT); }
279*8975f5c5SAndroid Build Coastguard Worker "volatile" { return ES2_reserved_ES3_1_keyword(context, VOLATILE); }
280*8975f5c5SAndroid Build Coastguard Worker "atomic_uint" { return ES3_reserved_ES3_1_keyword(context, ATOMICUINT); }
281*8975f5c5SAndroid Build Coastguard Worker "sample" { return ES3_reserved_ES3_extension_ES3_2_keyword(context, TExtension::OES_shader_multisample_interpolation, SAMPLE); }
282*8975f5c5SAndroid Build Coastguard Worker "precise" { return ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(context, TExtension::EXT_gpu_shader5, TExtension::OES_gpu_shader5, PRECISE, PRECISE); }
283*8975f5c5SAndroid Build Coastguard Worker 
284*8975f5c5SAndroid Build Coastguard Worker     /* ANGLE_shader_pixel_local_storage */
285*8975f5c5SAndroid Build Coastguard Worker "pixelLocalANGLE" { return ES3_extension(context, TExtension::ANGLE_shader_pixel_local_storage, PIXELLOCALANGLE); }
286*8975f5c5SAndroid Build Coastguard Worker "ipixelLocalANGLE" { return ES3_extension(context, TExtension::ANGLE_shader_pixel_local_storage, IPIXELLOCALANGLE); }
287*8975f5c5SAndroid Build Coastguard Worker "upixelLocalANGLE" { return ES3_extension(context, TExtension::ANGLE_shader_pixel_local_storage, UPIXELLOCALANGLE); }
288*8975f5c5SAndroid Build Coastguard Worker 
289*8975f5c5SAndroid Build Coastguard Worker     /* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
290*8975f5c5SAndroid Build Coastguard Worker "resource"          |
291*8975f5c5SAndroid Build Coastguard Worker "subroutine"        |
292*8975f5c5SAndroid Build Coastguard Worker "common"            |
293*8975f5c5SAndroid Build Coastguard Worker "partition"         |
294*8975f5c5SAndroid Build Coastguard Worker "active"            |
295*8975f5c5SAndroid Build Coastguard Worker 
296*8975f5c5SAndroid Build Coastguard Worker "filter"            |
297*8975f5c5SAndroid Build Coastguard Worker "image1D"           |
298*8975f5c5SAndroid Build Coastguard Worker "iimage1D"          |
299*8975f5c5SAndroid Build Coastguard Worker "uimage1D"          |
300*8975f5c5SAndroid Build Coastguard Worker "image1DArray"      |
301*8975f5c5SAndroid Build Coastguard Worker "iimage1DArray"     |
302*8975f5c5SAndroid Build Coastguard Worker "uimage1DArray"     |
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker "sampler1DArray"    |
305*8975f5c5SAndroid Build Coastguard Worker "sampler1DArrayShadow" |
306*8975f5c5SAndroid Build Coastguard Worker "isampler1D"        |
307*8975f5c5SAndroid Build Coastguard Worker "isampler1DArray"   |
308*8975f5c5SAndroid Build Coastguard Worker "usampler1D"        |
309*8975f5c5SAndroid Build Coastguard Worker "usampler1DArray"   |
310*8975f5c5SAndroid Build Coastguard Worker "isampler2DRect"    |
311*8975f5c5SAndroid Build Coastguard Worker "usampler2DRect"    {
312*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() < 300) {
313*8975f5c5SAndroid Build Coastguard Worker         yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
314*8975f5c5SAndroid Build Coastguard Worker         return check_type(yyscanner);
315*8975f5c5SAndroid Build Coastguard Worker     }
316*8975f5c5SAndroid Build Coastguard Worker     return reserved_word(yyscanner);
317*8975f5c5SAndroid Build Coastguard Worker }
318*8975f5c5SAndroid Build Coastguard Worker 
319*8975f5c5SAndroid Build Coastguard Worker     /* Reserved keywords in GLSL ES 1.00 that are not reserved in GLSL ES 3.00 */
320*8975f5c5SAndroid Build Coastguard Worker "packed"  {
321*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() >= 300)
322*8975f5c5SAndroid Build Coastguard Worker     {
323*8975f5c5SAndroid Build Coastguard Worker         yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
324*8975f5c5SAndroid Build Coastguard Worker         return check_type(yyscanner);
325*8975f5c5SAndroid Build Coastguard Worker     }
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker     return reserved_word(yyscanner);
328*8975f5c5SAndroid Build Coastguard Worker }
329*8975f5c5SAndroid Build Coastguard Worker 
330*8975f5c5SAndroid Build Coastguard Worker    /* Reserved keywords in WebGL that not reserved in GL */
331*8975f5c5SAndroid Build Coastguard Worker "image1DShadow"      |
332*8975f5c5SAndroid Build Coastguard Worker "image2DShadow"      |
333*8975f5c5SAndroid Build Coastguard Worker "image1DArrayShadow" |
334*8975f5c5SAndroid Build Coastguard Worker "image2DArrayShadow" {
335*8975f5c5SAndroid Build Coastguard Worker     if(!IsWebGLBasedSpec(context->getShaderSpec()))
336*8975f5c5SAndroid Build Coastguard Worker     {
337*8975f5c5SAndroid Build Coastguard Worker         yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
338*8975f5c5SAndroid Build Coastguard Worker         return check_type(yyscanner);
339*8975f5c5SAndroid Build Coastguard Worker     }
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker     return reserved_word(yyscanner);
342*8975f5c5SAndroid Build Coastguard Worker }
343*8975f5c5SAndroid Build Coastguard Worker 
344*8975f5c5SAndroid Build Coastguard Worker     /* Reserved keywords */
345*8975f5c5SAndroid Build Coastguard Worker "asm"          |
346*8975f5c5SAndroid Build Coastguard Worker 
347*8975f5c5SAndroid Build Coastguard Worker "class"        |
348*8975f5c5SAndroid Build Coastguard Worker "union"        |
349*8975f5c5SAndroid Build Coastguard Worker "enum"         |
350*8975f5c5SAndroid Build Coastguard Worker "typedef"      |
351*8975f5c5SAndroid Build Coastguard Worker "template"     |
352*8975f5c5SAndroid Build Coastguard Worker "this"         |
353*8975f5c5SAndroid Build Coastguard Worker 
354*8975f5c5SAndroid Build Coastguard Worker "goto"         |
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker "inline"       |
357*8975f5c5SAndroid Build Coastguard Worker "noinline"     |
358*8975f5c5SAndroid Build Coastguard Worker "public"       |
359*8975f5c5SAndroid Build Coastguard Worker "static"       |
360*8975f5c5SAndroid Build Coastguard Worker "extern"       |
361*8975f5c5SAndroid Build Coastguard Worker "external"     |
362*8975f5c5SAndroid Build Coastguard Worker "interface"    |
363*8975f5c5SAndroid Build Coastguard Worker 
364*8975f5c5SAndroid Build Coastguard Worker "long"         |
365*8975f5c5SAndroid Build Coastguard Worker "short"        |
366*8975f5c5SAndroid Build Coastguard Worker "double"       |
367*8975f5c5SAndroid Build Coastguard Worker "half"         |
368*8975f5c5SAndroid Build Coastguard Worker "fixed"        |
369*8975f5c5SAndroid Build Coastguard Worker "unsigned"     |
370*8975f5c5SAndroid Build Coastguard Worker "superp"       |
371*8975f5c5SAndroid Build Coastguard Worker 
372*8975f5c5SAndroid Build Coastguard Worker "input"        |
373*8975f5c5SAndroid Build Coastguard Worker "output"       |
374*8975f5c5SAndroid Build Coastguard Worker 
375*8975f5c5SAndroid Build Coastguard Worker "hvec2"        |
376*8975f5c5SAndroid Build Coastguard Worker "hvec3"        |
377*8975f5c5SAndroid Build Coastguard Worker "hvec4"        |
378*8975f5c5SAndroid Build Coastguard Worker "dvec2"        |
379*8975f5c5SAndroid Build Coastguard Worker "dvec3"        |
380*8975f5c5SAndroid Build Coastguard Worker "dvec4"        |
381*8975f5c5SAndroid Build Coastguard Worker "fvec2"        |
382*8975f5c5SAndroid Build Coastguard Worker "fvec3"        |
383*8975f5c5SAndroid Build Coastguard Worker "fvec4"        |
384*8975f5c5SAndroid Build Coastguard Worker 
385*8975f5c5SAndroid Build Coastguard Worker "sampler2DRectShadow" |
386*8975f5c5SAndroid Build Coastguard Worker "sampler1D"    |
387*8975f5c5SAndroid Build Coastguard Worker "sampler1DShadow" |
388*8975f5c5SAndroid Build Coastguard Worker 
389*8975f5c5SAndroid Build Coastguard Worker "sizeof"       |
390*8975f5c5SAndroid Build Coastguard Worker "cast"         |
391*8975f5c5SAndroid Build Coastguard Worker 
392*8975f5c5SAndroid Build Coastguard Worker "namespace"    |
393*8975f5c5SAndroid Build Coastguard Worker "using"        { return reserved_word(yyscanner); }
394*8975f5c5SAndroid Build Coastguard Worker 
395*8975f5c5SAndroid Build Coastguard Worker {L}({L}|{D})*       {
396*8975f5c5SAndroid Build Coastguard Worker    yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
397*8975f5c5SAndroid Build Coastguard Worker    return check_type(yyscanner);
398*8975f5c5SAndroid Build Coastguard Worker }
399*8975f5c5SAndroid Build Coastguard Worker 
400*8975f5c5SAndroid Build Coastguard Worker 0[xX]{H}+         { return int_constant(context); }
401*8975f5c5SAndroid Build Coastguard Worker 0{O}+             { return int_constant(context); }
402*8975f5c5SAndroid Build Coastguard Worker {D}+              { return int_constant(context); }
403*8975f5c5SAndroid Build Coastguard Worker 
404*8975f5c5SAndroid Build Coastguard Worker 0[xX]{H}+[uU]     { return uint_constant(context); }
405*8975f5c5SAndroid Build Coastguard Worker 0{O}+[uU]         { return uint_constant(context); }
406*8975f5c5SAndroid Build Coastguard Worker {D}+[uU]          { return uint_constant(context); }
407*8975f5c5SAndroid Build Coastguard Worker 
408*8975f5c5SAndroid Build Coastguard Worker {D}+{E}           { return float_constant(yyscanner); }
409*8975f5c5SAndroid Build Coastguard Worker {D}+"."{D}*({E})? { return float_constant(yyscanner); }
410*8975f5c5SAndroid Build Coastguard Worker "."{D}+({E})?     { return float_constant(yyscanner); }
411*8975f5c5SAndroid Build Coastguard Worker 
412*8975f5c5SAndroid Build Coastguard Worker {D}+{E}[fF]           { return floatsuffix_check(context); }
413*8975f5c5SAndroid Build Coastguard Worker {D}+"."{D}*({E})?[fF] { return floatsuffix_check(context); }
414*8975f5c5SAndroid Build Coastguard Worker "."{D}+({E})?[fF]     { return floatsuffix_check(context); }
415*8975f5c5SAndroid Build Coastguard Worker 
416*8975f5c5SAndroid Build Coastguard Worker "+="            { return ADD_ASSIGN; }
417*8975f5c5SAndroid Build Coastguard Worker "-="            { return SUB_ASSIGN; }
418*8975f5c5SAndroid Build Coastguard Worker "*="            { return MUL_ASSIGN; }
419*8975f5c5SAndroid Build Coastguard Worker "/="            { return DIV_ASSIGN; }
420*8975f5c5SAndroid Build Coastguard Worker "%="            { return MOD_ASSIGN; }
421*8975f5c5SAndroid Build Coastguard Worker "<<="           { return LEFT_ASSIGN; }
422*8975f5c5SAndroid Build Coastguard Worker ">>="           { return RIGHT_ASSIGN; }
423*8975f5c5SAndroid Build Coastguard Worker "&="            { return AND_ASSIGN; }
424*8975f5c5SAndroid Build Coastguard Worker "^="            { return XOR_ASSIGN; }
425*8975f5c5SAndroid Build Coastguard Worker "|="            { return OR_ASSIGN; }
426*8975f5c5SAndroid Build Coastguard Worker 
427*8975f5c5SAndroid Build Coastguard Worker "++"            { return INC_OP; }
428*8975f5c5SAndroid Build Coastguard Worker "--"            { return DEC_OP; }
429*8975f5c5SAndroid Build Coastguard Worker "&&"            { return AND_OP; }
430*8975f5c5SAndroid Build Coastguard Worker "||"            { return OR_OP; }
431*8975f5c5SAndroid Build Coastguard Worker "^^"            { return XOR_OP; }
432*8975f5c5SAndroid Build Coastguard Worker "<="            { return LE_OP; }
433*8975f5c5SAndroid Build Coastguard Worker ">="            { return GE_OP; }
434*8975f5c5SAndroid Build Coastguard Worker "=="            { return EQ_OP; }
435*8975f5c5SAndroid Build Coastguard Worker "!="            { return NE_OP; }
436*8975f5c5SAndroid Build Coastguard Worker "<<"            { return LEFT_OP; }
437*8975f5c5SAndroid Build Coastguard Worker ">>"            { return RIGHT_OP; }
438*8975f5c5SAndroid Build Coastguard Worker ";"             { return SEMICOLON; }
439*8975f5c5SAndroid Build Coastguard Worker ("{"|"<%")      { return LEFT_BRACE; }
440*8975f5c5SAndroid Build Coastguard Worker ("}"|"%>")      { return RIGHT_BRACE; }
441*8975f5c5SAndroid Build Coastguard Worker ","             { return COMMA; }
442*8975f5c5SAndroid Build Coastguard Worker ":"             { return COLON; }
443*8975f5c5SAndroid Build Coastguard Worker "="             { return EQUAL; }
444*8975f5c5SAndroid Build Coastguard Worker "("             { return LEFT_PAREN; }
445*8975f5c5SAndroid Build Coastguard Worker ")"             { return RIGHT_PAREN; }
446*8975f5c5SAndroid Build Coastguard Worker ("["|"<:")      { return LEFT_BRACKET; }
447*8975f5c5SAndroid Build Coastguard Worker ("]"|":>")      { return RIGHT_BRACKET; }
448*8975f5c5SAndroid Build Coastguard Worker "."             { BEGIN(FIELDS); return DOT; }
449*8975f5c5SAndroid Build Coastguard Worker "!"             { return BANG; }
450*8975f5c5SAndroid Build Coastguard Worker "-"             { return DASH; }
451*8975f5c5SAndroid Build Coastguard Worker "~"             { return TILDE; }
452*8975f5c5SAndroid Build Coastguard Worker "+"             { return PLUS; }
453*8975f5c5SAndroid Build Coastguard Worker "*"             { return STAR; }
454*8975f5c5SAndroid Build Coastguard Worker "/"             { return SLASH; }
455*8975f5c5SAndroid Build Coastguard Worker "%"             { return PERCENT; }
456*8975f5c5SAndroid Build Coastguard Worker "<"             { return LEFT_ANGLE; }
457*8975f5c5SAndroid Build Coastguard Worker ">"             { return RIGHT_ANGLE; }
458*8975f5c5SAndroid Build Coastguard Worker "|"             { return VERTICAL_BAR; }
459*8975f5c5SAndroid Build Coastguard Worker "^"             { return CARET; }
460*8975f5c5SAndroid Build Coastguard Worker "&"             { return AMPERSAND; }
461*8975f5c5SAndroid Build Coastguard Worker "?"             { return QUESTION; }
462*8975f5c5SAndroid Build Coastguard Worker 
463*8975f5c5SAndroid Build Coastguard Worker <FIELDS>{L}({L}|{D})* {
464*8975f5c5SAndroid Build Coastguard Worker     BEGIN(INITIAL);
465*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
466*8975f5c5SAndroid Build Coastguard Worker     return FIELD_SELECTION;
467*8975f5c5SAndroid Build Coastguard Worker }
468*8975f5c5SAndroid Build Coastguard Worker <FIELDS>[ \t\v\f\r] {}
469*8975f5c5SAndroid Build Coastguard Worker <FIELDS>. {
470*8975f5c5SAndroid Build Coastguard Worker     yyextra->error(*yylloc, "Illegal character at fieldname start", yytext);
471*8975f5c5SAndroid Build Coastguard Worker     return 0;
472*8975f5c5SAndroid Build Coastguard Worker }
473*8975f5c5SAndroid Build Coastguard Worker 
474*8975f5c5SAndroid Build Coastguard Worker [ \t\v\n\f\r] { }
475*8975f5c5SAndroid Build Coastguard Worker <*><<EOF>>    { yyterminate(); }
476*8975f5c5SAndroid Build Coastguard Worker <*>.          { assert(false); return 0; }
477*8975f5c5SAndroid Build Coastguard Worker 
478*8975f5c5SAndroid Build Coastguard Worker %%
479*8975f5c5SAndroid Build Coastguard Worker 
480*8975f5c5SAndroid Build Coastguard Worker yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) {
481*8975f5c5SAndroid Build Coastguard Worker     angle::pp::Token token;
482*8975f5c5SAndroid Build Coastguard Worker     yyget_extra(yyscanner)->getPreprocessor().lex(&token);
483*8975f5c5SAndroid Build Coastguard Worker     yy_size_t len = token.type == angle::pp::Token::LAST ? 0 : token.text.size();
484*8975f5c5SAndroid Build Coastguard Worker     if (len < max_size)
485*8975f5c5SAndroid Build Coastguard Worker         memcpy(buf, token.text.c_str(), len);
486*8975f5c5SAndroid Build Coastguard Worker     yyset_column(token.location.file, yyscanner);
487*8975f5c5SAndroid Build Coastguard Worker     yyset_lineno(token.location.line, yyscanner);
488*8975f5c5SAndroid Build Coastguard Worker 
489*8975f5c5SAndroid Build Coastguard Worker     if (len >= max_size)
490*8975f5c5SAndroid Build Coastguard Worker         YY_FATAL_ERROR("Input buffer overflow");
491*8975f5c5SAndroid Build Coastguard Worker     else if (len > 0)
492*8975f5c5SAndroid Build Coastguard Worker         buf[len++] = ' ';
493*8975f5c5SAndroid Build Coastguard Worker     return len;
494*8975f5c5SAndroid Build Coastguard Worker }
495*8975f5c5SAndroid Build Coastguard Worker 
check_type(yyscan_t yyscanner)496*8975f5c5SAndroid Build Coastguard Worker int check_type(yyscan_t yyscanner) {
497*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
498*8975f5c5SAndroid Build Coastguard Worker 
499*8975f5c5SAndroid Build Coastguard Worker     int token = IDENTIFIER;
500*8975f5c5SAndroid Build Coastguard Worker     // Note that the ImmutableString used here isn't static or pool allocated - but it's fine since yytext is valid for the duration of its use.
501*8975f5c5SAndroid Build Coastguard Worker     const TSymbol* symbol = yyextra->symbolTable.find(ImmutableString(yytext, yyleng), yyextra->getShaderVersion());
502*8975f5c5SAndroid Build Coastguard Worker     if (symbol && symbol->isStruct())
503*8975f5c5SAndroid Build Coastguard Worker     {
504*8975f5c5SAndroid Build Coastguard Worker         token = TYPE_NAME;
505*8975f5c5SAndroid Build Coastguard Worker     }
506*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.symbol = symbol;
507*8975f5c5SAndroid Build Coastguard Worker     return token;
508*8975f5c5SAndroid Build Coastguard Worker }
509*8975f5c5SAndroid Build Coastguard Worker 
reserved_word(yyscan_t yyscanner)510*8975f5c5SAndroid Build Coastguard Worker int reserved_word(yyscan_t yyscanner) {
511*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
512*8975f5c5SAndroid Build Coastguard Worker 
513*8975f5c5SAndroid Build Coastguard Worker     yyextra->error(*yylloc, "Illegal use of reserved word", yytext);
514*8975f5c5SAndroid Build Coastguard Worker     return 0;
515*8975f5c5SAndroid Build Coastguard Worker }
516*8975f5c5SAndroid Build Coastguard Worker 
is_extension_enabled_or_is_core(TParseContext * context,int extension_version,TExtension extension,int promotion_version)517*8975f5c5SAndroid Build Coastguard Worker static bool is_extension_enabled_or_is_core(TParseContext *context,
518*8975f5c5SAndroid Build Coastguard Worker         int extension_version, TExtension extension, int promotion_version)
519*8975f5c5SAndroid Build Coastguard Worker {
520*8975f5c5SAndroid Build Coastguard Worker     int version = context->getShaderVersion();
521*8975f5c5SAndroid Build Coastguard Worker 
522*8975f5c5SAndroid Build Coastguard Worker     // If version is at least promotion_version, symbol is definitely keyword.  Otherwise it's a
523*8975f5c5SAndroid Build Coastguard Worker     // keyword if version is at least extension_version (where the extension was introduced) and
524*8975f5c5SAndroid Build Coastguard Worker     // the extension is enabled.
525*8975f5c5SAndroid Build Coastguard Worker     return version >= promotion_version ||
526*8975f5c5SAndroid Build Coastguard Worker         (version >= extension_version && context->isExtensionEnabled(extension));
527*8975f5c5SAndroid Build Coastguard Worker }
528*8975f5c5SAndroid Build Coastguard Worker 
ES2_reserved_ES3_keyword(TParseContext * context,int token)529*8975f5c5SAndroid Build Coastguard Worker int ES2_reserved_ES3_keyword(TParseContext *context, int token)
530*8975f5c5SAndroid Build Coastguard Worker {
531*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
532*8975f5c5SAndroid Build Coastguard Worker 
533*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() < 300)
534*8975f5c5SAndroid Build Coastguard Worker     {
535*8975f5c5SAndroid Build Coastguard Worker         return reserved_word(yyscanner);
536*8975f5c5SAndroid Build Coastguard Worker     }
537*8975f5c5SAndroid Build Coastguard Worker 
538*8975f5c5SAndroid Build Coastguard Worker     return token;
539*8975f5c5SAndroid Build Coastguard Worker }
540*8975f5c5SAndroid Build Coastguard Worker 
ES2_keyword_ES3_reserved(TParseContext * context,int token)541*8975f5c5SAndroid Build Coastguard Worker int ES2_keyword_ES3_reserved(TParseContext *context, int token)
542*8975f5c5SAndroid Build Coastguard Worker {
543*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
544*8975f5c5SAndroid Build Coastguard Worker 
545*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() >= 300)
546*8975f5c5SAndroid Build Coastguard Worker     {
547*8975f5c5SAndroid Build Coastguard Worker         return reserved_word(yyscanner);
548*8975f5c5SAndroid Build Coastguard Worker     }
549*8975f5c5SAndroid Build Coastguard Worker 
550*8975f5c5SAndroid Build Coastguard Worker     return token;
551*8975f5c5SAndroid Build Coastguard Worker }
552*8975f5c5SAndroid Build Coastguard Worker 
ES3_reserved_ES3_1_keyword(TParseContext * context,int token)553*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
554*8975f5c5SAndroid Build Coastguard Worker {
555*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
556*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
557*8975f5c5SAndroid Build Coastguard Worker 
558*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() < 300)
559*8975f5c5SAndroid Build Coastguard Worker     {
560*8975f5c5SAndroid Build Coastguard Worker         yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
561*8975f5c5SAndroid Build Coastguard Worker         return check_type(yyscanner);
562*8975f5c5SAndroid Build Coastguard Worker     }
563*8975f5c5SAndroid Build Coastguard Worker     else if (context->getShaderVersion() == 300)
564*8975f5c5SAndroid Build Coastguard Worker     {
565*8975f5c5SAndroid Build Coastguard Worker         return reserved_word(yyscanner);
566*8975f5c5SAndroid Build Coastguard Worker     }
567*8975f5c5SAndroid Build Coastguard Worker 
568*8975f5c5SAndroid Build Coastguard Worker     return token;
569*8975f5c5SAndroid Build Coastguard Worker }
570*8975f5c5SAndroid Build Coastguard Worker 
ES3_keyword(TParseContext * context,int token)571*8975f5c5SAndroid Build Coastguard Worker int ES3_keyword(TParseContext *context, int token)
572*8975f5c5SAndroid Build Coastguard Worker {
573*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
574*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
575*8975f5c5SAndroid Build Coastguard Worker 
576*8975f5c5SAndroid Build Coastguard Worker     // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name
577*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() < 300)
578*8975f5c5SAndroid Build Coastguard Worker     {
579*8975f5c5SAndroid Build Coastguard Worker         yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
580*8975f5c5SAndroid Build Coastguard Worker         return check_type(yyscanner);
581*8975f5c5SAndroid Build Coastguard Worker     }
582*8975f5c5SAndroid Build Coastguard Worker 
583*8975f5c5SAndroid Build Coastguard Worker     return token;
584*8975f5c5SAndroid Build Coastguard Worker }
585*8975f5c5SAndroid Build Coastguard Worker 
ES2_reserved_ES3_1_keyword(TParseContext * context,int token)586*8975f5c5SAndroid Build Coastguard Worker int ES2_reserved_ES3_1_keyword(TParseContext *context, int token)
587*8975f5c5SAndroid Build Coastguard Worker {
588*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
589*8975f5c5SAndroid Build Coastguard Worker 
590*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() < 310)
591*8975f5c5SAndroid Build Coastguard Worker     {
592*8975f5c5SAndroid Build Coastguard Worker         return reserved_word(yyscanner);
593*8975f5c5SAndroid Build Coastguard Worker     }
594*8975f5c5SAndroid Build Coastguard Worker 
595*8975f5c5SAndroid Build Coastguard Worker     return token;
596*8975f5c5SAndroid Build Coastguard Worker }
597*8975f5c5SAndroid Build Coastguard Worker 
ES3_1_keyword(TParseContext * context,int token)598*8975f5c5SAndroid Build Coastguard Worker int ES3_1_keyword(TParseContext *context, int token)
599*8975f5c5SAndroid Build Coastguard Worker {
600*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
601*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
602*8975f5c5SAndroid Build Coastguard Worker 
603*8975f5c5SAndroid Build Coastguard Worker     // A keyword in GLSL ES 3.10.
604*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() >= 310)
605*8975f5c5SAndroid Build Coastguard Worker     {
606*8975f5c5SAndroid Build Coastguard Worker         return token;
607*8975f5c5SAndroid Build Coastguard Worker     }
608*8975f5c5SAndroid Build Coastguard Worker 
609*8975f5c5SAndroid Build Coastguard Worker     // Otherwise can be used as an identifier/type name
610*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
611*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
612*8975f5c5SAndroid Build Coastguard Worker }
613*8975f5c5SAndroid Build Coastguard Worker 
WEBGL_video_texture_extension(TParseContext * context,int token)614*8975f5c5SAndroid Build Coastguard Worker int WEBGL_video_texture_extension(TParseContext *context, int token)
615*8975f5c5SAndroid Build Coastguard Worker {
616*8975f5c5SAndroid Build Coastguard Worker     // Available with WEBGL_video_texture_extension
617*8975f5c5SAndroid Build Coastguard Worker     if (context->isExtensionEnabled(TExtension::WEBGL_video_texture))
618*8975f5c5SAndroid Build Coastguard Worker     {
619*8975f5c5SAndroid Build Coastguard Worker         return token;
620*8975f5c5SAndroid Build Coastguard Worker     }
621*8975f5c5SAndroid Build Coastguard Worker 
622*8975f5c5SAndroid Build Coastguard Worker     // Otherwise can be used as an identifier/type name
623*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
624*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
625*8975f5c5SAndroid Build Coastguard Worker 
626*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
627*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
628*8975f5c5SAndroid Build Coastguard Worker }
629*8975f5c5SAndroid Build Coastguard Worker 
ES2_extensions_ES3_keyword(TParseContext * context,TExtension extension1,TExtension extension2,TExtension extension3,int token)630*8975f5c5SAndroid Build Coastguard Worker int ES2_extensions_ES3_keyword(TParseContext *context, TExtension extension1, TExtension extension2, TExtension extension3, int token)
631*8975f5c5SAndroid Build Coastguard Worker {
632*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
633*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
634*8975f5c5SAndroid Build Coastguard Worker 
635*8975f5c5SAndroid Build Coastguard Worker     // A keyword in GLSL ES 3.00 or GLSL ES 1.00 with enabled extension.
636*8975f5c5SAndroid Build Coastguard Worker     if (is_extension_enabled_or_is_core(context, 100, extension1, 300))
637*8975f5c5SAndroid Build Coastguard Worker     {
638*8975f5c5SAndroid Build Coastguard Worker         return token;
639*8975f5c5SAndroid Build Coastguard Worker     }
640*8975f5c5SAndroid Build Coastguard Worker     else if (is_extension_enabled_or_is_core(context, 100, extension2, 300))
641*8975f5c5SAndroid Build Coastguard Worker     {
642*8975f5c5SAndroid Build Coastguard Worker         return token;
643*8975f5c5SAndroid Build Coastguard Worker     }
644*8975f5c5SAndroid Build Coastguard Worker     else if (is_extension_enabled_or_is_core(context, 100, extension3, 300))
645*8975f5c5SAndroid Build Coastguard Worker     {
646*8975f5c5SAndroid Build Coastguard Worker         return token;
647*8975f5c5SAndroid Build Coastguard Worker     }
648*8975f5c5SAndroid Build Coastguard Worker 
649*8975f5c5SAndroid Build Coastguard Worker     // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name
650*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
651*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
652*8975f5c5SAndroid Build Coastguard Worker }
653*8975f5c5SAndroid Build Coastguard Worker 
ES2_reserved_ES2_extension_ES3_keyword(TParseContext * context,TExtension extension,int token)654*8975f5c5SAndroid Build Coastguard Worker int ES2_reserved_ES2_extension_ES3_keyword(TParseContext *context, TExtension extension, int token)
655*8975f5c5SAndroid Build Coastguard Worker {
656*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
657*8975f5c5SAndroid Build Coastguard Worker 
658*8975f5c5SAndroid Build Coastguard Worker     // A keyword in GLSL ES 3.00 or GLSL ES 1.00 with enabled extension.
659*8975f5c5SAndroid Build Coastguard Worker     if (is_extension_enabled_or_is_core(context, 100, extension, 300))
660*8975f5c5SAndroid Build Coastguard Worker     {
661*8975f5c5SAndroid Build Coastguard Worker         return token;
662*8975f5c5SAndroid Build Coastguard Worker     }
663*8975f5c5SAndroid Build Coastguard Worker 
664*8975f5c5SAndroid Build Coastguard Worker     // Reserved otherwise.
665*8975f5c5SAndroid Build Coastguard Worker     return reserved_word(yyscanner);
666*8975f5c5SAndroid Build Coastguard Worker }
667*8975f5c5SAndroid Build Coastguard Worker 
ES3_extension(TParseContext * context,TExtension extension,int token)668*8975f5c5SAndroid Build Coastguard Worker int ES3_extension(TParseContext *context, TExtension extension, int token)
669*8975f5c5SAndroid Build Coastguard Worker {
670*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
671*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
672*8975f5c5SAndroid Build Coastguard Worker 
673*8975f5c5SAndroid Build Coastguard Worker     // a keyword word in GLSL ES 3.00 with enabled extension.
674*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(extension))
675*8975f5c5SAndroid Build Coastguard Worker     {
676*8975f5c5SAndroid Build Coastguard Worker         return token;
677*8975f5c5SAndroid Build Coastguard Worker     }
678*8975f5c5SAndroid Build Coastguard Worker 
679*8975f5c5SAndroid Build Coastguard Worker     // Otherwise can be used as an identifier/type name
680*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
681*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
682*8975f5c5SAndroid Build Coastguard Worker }
683*8975f5c5SAndroid Build Coastguard Worker 
ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext * context,TExtension extension,int token)684*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_1_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token)
685*8975f5c5SAndroid Build Coastguard Worker {
686*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
687*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
688*8975f5c5SAndroid Build Coastguard Worker 
689*8975f5c5SAndroid Build Coastguard Worker     // a keyword in GLSL ES 3.10 with enabled extension
690*8975f5c5SAndroid Build Coastguard Worker     if (is_extension_enabled_or_is_core(context, 310, extension, 320))
691*8975f5c5SAndroid Build Coastguard Worker     {
692*8975f5c5SAndroid Build Coastguard Worker         return token;
693*8975f5c5SAndroid Build Coastguard Worker     }
694*8975f5c5SAndroid Build Coastguard Worker     // a reserved word in GLSL ES 3.00+
695*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() >= 300)
696*8975f5c5SAndroid Build Coastguard Worker     {
697*8975f5c5SAndroid Build Coastguard Worker         return reserved_word(yyscanner);
698*8975f5c5SAndroid Build Coastguard Worker     }
699*8975f5c5SAndroid Build Coastguard Worker 
700*8975f5c5SAndroid Build Coastguard Worker     // Otherwise can be used as an identifier/type name
701*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
702*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
703*8975f5c5SAndroid Build Coastguard Worker }
704*8975f5c5SAndroid Build Coastguard Worker 
ES3_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext * context,TExtension extension1,TExtension extension2,int token)705*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token)
706*8975f5c5SAndroid Build Coastguard Worker {
707*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
708*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
709*8975f5c5SAndroid Build Coastguard Worker 
710*8975f5c5SAndroid Build Coastguard Worker     // a keyword in GLSL ES 3.10 with enabled extension
711*8975f5c5SAndroid Build Coastguard Worker     if (is_extension_enabled_or_is_core(context, 310, extension1, 320))
712*8975f5c5SAndroid Build Coastguard Worker     {
713*8975f5c5SAndroid Build Coastguard Worker         return token;
714*8975f5c5SAndroid Build Coastguard Worker     }
715*8975f5c5SAndroid Build Coastguard Worker     else if (is_extension_enabled_or_is_core(context, 310, extension2, 320))
716*8975f5c5SAndroid Build Coastguard Worker     {
717*8975f5c5SAndroid Build Coastguard Worker         return token;
718*8975f5c5SAndroid Build Coastguard Worker     }
719*8975f5c5SAndroid Build Coastguard Worker     // a reserved word in GLSL ES 3.00+
720*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() >= 300)
721*8975f5c5SAndroid Build Coastguard Worker     {
722*8975f5c5SAndroid Build Coastguard Worker         return reserved_word(yyscanner);
723*8975f5c5SAndroid Build Coastguard Worker     }
724*8975f5c5SAndroid Build Coastguard Worker 
725*8975f5c5SAndroid Build Coastguard Worker     // Otherwise can be used as an identifier/type name
726*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
727*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
728*8975f5c5SAndroid Build Coastguard Worker }
729*8975f5c5SAndroid Build Coastguard Worker 
ES3_reserved_ES3_extension(TParseContext * context,TExtension extension,int token)730*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_extension(TParseContext *context, TExtension extension, int token)
731*8975f5c5SAndroid Build Coastguard Worker {
732*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
733*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
734*8975f5c5SAndroid Build Coastguard Worker 
735*8975f5c5SAndroid Build Coastguard Worker     if(context->getShaderVersion() >= 300)
736*8975f5c5SAndroid Build Coastguard Worker     {
737*8975f5c5SAndroid Build Coastguard Worker         if (context->isExtensionEnabled(extension)) {
738*8975f5c5SAndroid Build Coastguard Worker             return token;
739*8975f5c5SAndroid Build Coastguard Worker         } else {
740*8975f5c5SAndroid Build Coastguard Worker             return reserved_word(yyscanner);
741*8975f5c5SAndroid Build Coastguard Worker         }
742*8975f5c5SAndroid Build Coastguard Worker     }
743*8975f5c5SAndroid Build Coastguard Worker 
744*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
745*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
746*8975f5c5SAndroid Build Coastguard Worker }
747*8975f5c5SAndroid Build Coastguard Worker 
ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext * context,TExtension extension,int token)748*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_extension_ES3_1_keyword(TParseContext *context, TExtension extension, int token)
749*8975f5c5SAndroid Build Coastguard Worker {
750*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
751*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
752*8975f5c5SAndroid Build Coastguard Worker 
753*8975f5c5SAndroid Build Coastguard Worker     // A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.10
754*8975f5c5SAndroid Build Coastguard Worker     if (is_extension_enabled_or_is_core(context, 300, extension, 310))
755*8975f5c5SAndroid Build Coastguard Worker     {
756*8975f5c5SAndroid Build Coastguard Worker         return token;
757*8975f5c5SAndroid Build Coastguard Worker     }
758*8975f5c5SAndroid Build Coastguard Worker 
759*8975f5c5SAndroid Build Coastguard Worker     if(context->getShaderVersion() == 300)
760*8975f5c5SAndroid Build Coastguard Worker     {
761*8975f5c5SAndroid Build Coastguard Worker         return reserved_word(yyscanner);
762*8975f5c5SAndroid Build Coastguard Worker     }
763*8975f5c5SAndroid Build Coastguard Worker 
764*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
765*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
766*8975f5c5SAndroid Build Coastguard Worker }
767*8975f5c5SAndroid Build Coastguard Worker 
ES3_reserved_ES3_extension_ES3_2_keyword(TParseContext * context,TExtension extension,int token)768*8975f5c5SAndroid Build Coastguard Worker int ES3_reserved_ES3_extension_ES3_2_keyword(TParseContext *context, TExtension extension, int token)
769*8975f5c5SAndroid Build Coastguard Worker {
770*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
771*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
772*8975f5c5SAndroid Build Coastguard Worker 
773*8975f5c5SAndroid Build Coastguard Worker     // A keyword in GLSL ES 3.00 with enabled extension or in GLSL ES 3.20
774*8975f5c5SAndroid Build Coastguard Worker     if (is_extension_enabled_or_is_core(context, 300, extension, 320))
775*8975f5c5SAndroid Build Coastguard Worker     {
776*8975f5c5SAndroid Build Coastguard Worker         return token;
777*8975f5c5SAndroid Build Coastguard Worker     }
778*8975f5c5SAndroid Build Coastguard Worker 
779*8975f5c5SAndroid Build Coastguard Worker     if(context->getShaderVersion() == 300 ||context->getShaderVersion() == 310)
780*8975f5c5SAndroid Build Coastguard Worker     {
781*8975f5c5SAndroid Build Coastguard Worker         return reserved_word(yyscanner);
782*8975f5c5SAndroid Build Coastguard Worker     }
783*8975f5c5SAndroid Build Coastguard Worker 
784*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
785*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
786*8975f5c5SAndroid Build Coastguard Worker }
787*8975f5c5SAndroid Build Coastguard Worker 
ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext * context,TExtension extension1,TExtension extension2,int token1,int token2)788*8975f5c5SAndroid Build Coastguard Worker static int ES3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token1, int token2)
789*8975f5c5SAndroid Build Coastguard Worker {
790*8975f5c5SAndroid Build Coastguard Worker    struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
791*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
792*8975f5c5SAndroid Build Coastguard Worker 
793*8975f5c5SAndroid Build Coastguard Worker     // A keyword in GLSL ES 3.20 or GLSL ES 3.10 with enabled extension.
794*8975f5c5SAndroid Build Coastguard Worker     if (is_extension_enabled_or_is_core(context, 310, extension1, 320))
795*8975f5c5SAndroid Build Coastguard Worker     {
796*8975f5c5SAndroid Build Coastguard Worker         return token1;
797*8975f5c5SAndroid Build Coastguard Worker     }
798*8975f5c5SAndroid Build Coastguard Worker     else if (is_extension_enabled_or_is_core(context, 310, extension2, 320))
799*8975f5c5SAndroid Build Coastguard Worker     {
800*8975f5c5SAndroid Build Coastguard Worker         return token2;
801*8975f5c5SAndroid Build Coastguard Worker     }
802*8975f5c5SAndroid Build Coastguard Worker 
803*8975f5c5SAndroid Build Coastguard Worker     // A reserved word in GLSL ES 3.10
804*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() == 310)
805*8975f5c5SAndroid Build Coastguard Worker     {
806*8975f5c5SAndroid Build Coastguard Worker         return reserved_word(yyscanner);
807*8975f5c5SAndroid Build Coastguard Worker     }
808*8975f5c5SAndroid Build Coastguard Worker 
809*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
810*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
811*8975f5c5SAndroid Build Coastguard Worker }
812*8975f5c5SAndroid Build Coastguard Worker 
ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext * context,TExtension extension1,TExtension extension2,int token1,int token2)813*8975f5c5SAndroid Build Coastguard Worker static int ES3_and_3_1_reserved_ES3_1_extension_ES3_2_keyword_2(TParseContext *context, TExtension extension1, TExtension extension2, int token1, int token2)
814*8975f5c5SAndroid Build Coastguard Worker {
815*8975f5c5SAndroid Build Coastguard Worker    struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
816*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
817*8975f5c5SAndroid Build Coastguard Worker 
818*8975f5c5SAndroid Build Coastguard Worker     // A keyword in GLSL ES 3.20 or GLSL ES 3.10 with enabled extension.
819*8975f5c5SAndroid Build Coastguard Worker     if (is_extension_enabled_or_is_core(context, 310, extension1, 320))
820*8975f5c5SAndroid Build Coastguard Worker     {
821*8975f5c5SAndroid Build Coastguard Worker         return token1;
822*8975f5c5SAndroid Build Coastguard Worker     }
823*8975f5c5SAndroid Build Coastguard Worker     else if (is_extension_enabled_or_is_core(context, 310, extension2, 320))
824*8975f5c5SAndroid Build Coastguard Worker     {
825*8975f5c5SAndroid Build Coastguard Worker         return token2;
826*8975f5c5SAndroid Build Coastguard Worker     }
827*8975f5c5SAndroid Build Coastguard Worker 
828*8975f5c5SAndroid Build Coastguard Worker     // A reserved word in GLSL ES 3.00 and 3.10
829*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() >= 300)
830*8975f5c5SAndroid Build Coastguard Worker     {
831*8975f5c5SAndroid Build Coastguard Worker         return reserved_word(yyscanner);
832*8975f5c5SAndroid Build Coastguard Worker     }
833*8975f5c5SAndroid Build Coastguard Worker 
834*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
835*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
836*8975f5c5SAndroid Build Coastguard Worker }
837*8975f5c5SAndroid Build Coastguard Worker 
uint_constant(TParseContext * context)838*8975f5c5SAndroid Build Coastguard Worker int uint_constant(TParseContext *context)
839*8975f5c5SAndroid Build Coastguard Worker {
840*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
841*8975f5c5SAndroid Build Coastguard Worker 
842*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() < 300)
843*8975f5c5SAndroid Build Coastguard Worker     {
844*8975f5c5SAndroid Build Coastguard Worker         context->error(*yylloc, "Unsigned integers are unsupported prior to GLSL ES 3.00", yytext);
845*8975f5c5SAndroid Build Coastguard Worker         return 0;
846*8975f5c5SAndroid Build Coastguard Worker     }
847*8975f5c5SAndroid Build Coastguard Worker 
848*8975f5c5SAndroid Build Coastguard Worker     if (!atoi_clamp(yytext, &(yylval->lex.u)))
849*8975f5c5SAndroid Build Coastguard Worker         yyextra->error(*yylloc, "Integer overflow", yytext);
850*8975f5c5SAndroid Build Coastguard Worker 
851*8975f5c5SAndroid Build Coastguard Worker     return UINTCONSTANT;
852*8975f5c5SAndroid Build Coastguard Worker }
853*8975f5c5SAndroid Build Coastguard Worker 
floatsuffix_check(TParseContext * context)854*8975f5c5SAndroid Build Coastguard Worker int floatsuffix_check(TParseContext* context)
855*8975f5c5SAndroid Build Coastguard Worker {
856*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
857*8975f5c5SAndroid Build Coastguard Worker 
858*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() < 300)
859*8975f5c5SAndroid Build Coastguard Worker     {
860*8975f5c5SAndroid Build Coastguard Worker         context->error(*yylloc, "Floating-point suffix unsupported prior to GLSL ES 3.00", yytext);
861*8975f5c5SAndroid Build Coastguard Worker         return 0;
862*8975f5c5SAndroid Build Coastguard Worker     }
863*8975f5c5SAndroid Build Coastguard Worker 
864*8975f5c5SAndroid Build Coastguard Worker     std::string text = yytext;
865*8975f5c5SAndroid Build Coastguard Worker     text.resize(text.size() - 1);
866*8975f5c5SAndroid Build Coastguard Worker     if (!strtof_clamp(text, &(yylval->lex.f)))
867*8975f5c5SAndroid Build Coastguard Worker         yyextra->warning(*yylloc, "Float overflow", yytext);
868*8975f5c5SAndroid Build Coastguard Worker 
869*8975f5c5SAndroid Build Coastguard Worker     return(FLOATCONSTANT);
870*8975f5c5SAndroid Build Coastguard Worker }
871*8975f5c5SAndroid Build Coastguard Worker 
yyerror(YYLTYPE * lloc,TParseContext * context,void * scanner,const char * reason)872*8975f5c5SAndroid Build Coastguard Worker void yyerror(YYLTYPE* lloc, TParseContext* context, void *scanner, const char* reason) {
873*8975f5c5SAndroid Build Coastguard Worker     context->error(*lloc, reason, yyget_text(scanner));
874*8975f5c5SAndroid Build Coastguard Worker }
875*8975f5c5SAndroid Build Coastguard Worker 
int_constant(TParseContext * context)876*8975f5c5SAndroid Build Coastguard Worker int int_constant(TParseContext *context) {
877*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
878*8975f5c5SAndroid Build Coastguard Worker 
879*8975f5c5SAndroid Build Coastguard Worker     unsigned int u;
880*8975f5c5SAndroid Build Coastguard Worker     if (!atoi_clamp(yytext, &u))
881*8975f5c5SAndroid Build Coastguard Worker     {
882*8975f5c5SAndroid Build Coastguard Worker         if (context->getShaderVersion() >= 300)
883*8975f5c5SAndroid Build Coastguard Worker             yyextra->error(*yylloc, "Integer overflow", yytext);
884*8975f5c5SAndroid Build Coastguard Worker         else
885*8975f5c5SAndroid Build Coastguard Worker             yyextra->warning(*yylloc, "Integer overflow", yytext);
886*8975f5c5SAndroid Build Coastguard Worker     }
887*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.i = static_cast<int>(u);
888*8975f5c5SAndroid Build Coastguard Worker     return INTCONSTANT;
889*8975f5c5SAndroid Build Coastguard Worker }
890*8975f5c5SAndroid Build Coastguard Worker 
float_constant(yyscan_t yyscanner)891*8975f5c5SAndroid Build Coastguard Worker int float_constant(yyscan_t yyscanner) {
892*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
893*8975f5c5SAndroid Build Coastguard Worker 
894*8975f5c5SAndroid Build Coastguard Worker     if (!strtof_clamp(yytext, &(yylval->lex.f)))
895*8975f5c5SAndroid Build Coastguard Worker         yyextra->warning(*yylloc, "Float overflow", yytext);
896*8975f5c5SAndroid Build Coastguard Worker     return FLOATCONSTANT;
897*8975f5c5SAndroid Build Coastguard Worker }
898*8975f5c5SAndroid Build Coastguard Worker 
yuvcscstandardext_constant(TParseContext * context)899*8975f5c5SAndroid Build Coastguard Worker int yuvcscstandardext_constant(TParseContext *context)
900*8975f5c5SAndroid Build Coastguard Worker {
901*8975f5c5SAndroid Build Coastguard Worker     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
902*8975f5c5SAndroid Build Coastguard Worker     yyscan_t yyscanner = (yyscan_t) context->getScanner();
903*8975f5c5SAndroid Build Coastguard Worker 
904*8975f5c5SAndroid Build Coastguard Worker     // a reserved word in GLSL ES 3.00 with enabled extension, otherwise could be used as an identifier/type name
905*8975f5c5SAndroid Build Coastguard Worker     if (context->getShaderVersion() >= 300 && context->isExtensionEnabled(TExtension::EXT_YUV_target))
906*8975f5c5SAndroid Build Coastguard Worker     {
907*8975f5c5SAndroid Build Coastguard Worker         yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
908*8975f5c5SAndroid Build Coastguard Worker         return YUVCSCSTANDARDEXTCONSTANT;
909*8975f5c5SAndroid Build Coastguard Worker     }
910*8975f5c5SAndroid Build Coastguard Worker 
911*8975f5c5SAndroid Build Coastguard Worker     yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
912*8975f5c5SAndroid Build Coastguard Worker     return check_type(yyscanner);
913*8975f5c5SAndroid Build Coastguard Worker }
914*8975f5c5SAndroid Build Coastguard Worker 
glslang_initialize(TParseContext * context)915*8975f5c5SAndroid Build Coastguard Worker int glslang_initialize(TParseContext* context) {
916*8975f5c5SAndroid Build Coastguard Worker     yyscan_t scanner = NULL;
917*8975f5c5SAndroid Build Coastguard Worker     if (yylex_init_extra(context, &scanner))
918*8975f5c5SAndroid Build Coastguard Worker         return 1;
919*8975f5c5SAndroid Build Coastguard Worker 
920*8975f5c5SAndroid Build Coastguard Worker     context->setScanner(scanner);
921*8975f5c5SAndroid Build Coastguard Worker     return 0;
922*8975f5c5SAndroid Build Coastguard Worker }
923*8975f5c5SAndroid Build Coastguard Worker 
glslang_finalize(TParseContext * context)924*8975f5c5SAndroid Build Coastguard Worker int glslang_finalize(TParseContext* context) {
925*8975f5c5SAndroid Build Coastguard Worker     yyscan_t scanner = context->getScanner();
926*8975f5c5SAndroid Build Coastguard Worker     if (scanner == NULL) return 0;
927*8975f5c5SAndroid Build Coastguard Worker 
928*8975f5c5SAndroid Build Coastguard Worker     context->setScanner(NULL);
929*8975f5c5SAndroid Build Coastguard Worker     yylex_destroy(scanner);
930*8975f5c5SAndroid Build Coastguard Worker 
931*8975f5c5SAndroid Build Coastguard Worker     return 0;
932*8975f5c5SAndroid Build Coastguard Worker }
933*8975f5c5SAndroid Build Coastguard Worker 
glslang_scan(size_t count,const char * const string[],const int length[],TParseContext * context)934*8975f5c5SAndroid Build Coastguard Worker int glslang_scan(size_t count, const char* const string[], const int length[],
935*8975f5c5SAndroid Build Coastguard Worker                  TParseContext* context) {
936*8975f5c5SAndroid Build Coastguard Worker     yyrestart(NULL, context->getScanner());
937*8975f5c5SAndroid Build Coastguard Worker     yyset_column(0, context->getScanner());
938*8975f5c5SAndroid Build Coastguard Worker     yyset_lineno(1, context->getScanner());
939*8975f5c5SAndroid Build Coastguard Worker 
940*8975f5c5SAndroid Build Coastguard Worker     // Initialize preprocessor.
941*8975f5c5SAndroid Build Coastguard Worker     angle::pp::Preprocessor *preprocessor = &context->getPreprocessor();
942*8975f5c5SAndroid Build Coastguard Worker 
943*8975f5c5SAndroid Build Coastguard Worker     if (!preprocessor->init(count, string, length))
944*8975f5c5SAndroid Build Coastguard Worker         return 1;
945*8975f5c5SAndroid Build Coastguard Worker 
946*8975f5c5SAndroid Build Coastguard Worker     if (context->getFragmentPrecisionHigh())
947*8975f5c5SAndroid Build Coastguard Worker         preprocessor->predefineMacro("GL_FRAGMENT_PRECISION_HIGH", 1);
948*8975f5c5SAndroid Build Coastguard Worker 
949*8975f5c5SAndroid Build Coastguard Worker     preprocessor->setMaxTokenSize(sh::GetGlobalMaxTokenSize(context->getShaderSpec()));
950*8975f5c5SAndroid Build Coastguard Worker 
951*8975f5c5SAndroid Build Coastguard Worker     return 0;
952*8975f5c5SAndroid Build Coastguard Worker }
953