3 * Copyright © 2008, 2009 Intel Corporation
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:
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
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.
25 #include "glsl_parser_extras.h"
26 #include "glsl_parser.h"
28 #define YY_USER_ACTION \
31 yylloc->first_column = yycolumn + 1; \
32 yylloc->first_line = yylineno + 1; \
38 %option bison-bridge bison-locations reentrant noyywrap
39 %option never-interactive
40 %option prefix="_mesa_glsl_"
41 %option extra-type="struct _mesa_glsl_parse_state *"
48 "/*" { yy_push_state(COMMENT, yyscanner); }
50 <COMMENT>[^*\n]*\n { yylineno++; yycolumn = 0; }
52 <COMMENT>"*"+[^*/\n]*\n { yylineno++; yycolumn = 0; }
53 <COMMENT>"*"+"/" { yy_pop_state(yyscanner); }
55 \/\/.*\n { yylineno++; yycolumn = 0; }
58 /* Preprocessor tokens. */
60 ^[ \t]*#[ \t]*version { BEGIN PP; return VERSION; }
61 ^[ \t]*#[ \t]*extension { BEGIN PP; return EXTENSION; }
62 ^[ \t]*#[ \t]*line { BEGIN PP; return LINE; }
63 ^[ \t]*#[ \t]*pragma { BEGIN PP; return PRAGMA; }
65 <PP>[_a-zA-Z][_a-zA-Z0-9]* {
66 yylval->identifier = strdup(yytext);
70 yylval->n = strtol(yytext, NULL, 10);
73 <PP>\n { BEGIN 0; yylineno++; yycolumn = 0; return EOL; }
75 \n { yylineno++; yycolumn = 0; }
77 attribute return ATTRIBUTE;
84 continue return CONTINUE;
90 discard return DISCARD;
105 mat2x2 return MAT2X2;
106 mat2x3 return MAT2X3;
107 mat2x4 return MAT2X4;
108 mat3x2 return MAT3X2;
109 mat3x3 return MAT3X3;
110 mat3x4 return MAT3X4;
111 mat4x2 return MAT4X2;
112 mat4x3 return MAT4X3;
113 mat4x4 return MAT4X4;
118 uniform return UNIFORM;
119 varying return VARYING;
120 centroid return CENTROID;
121 invariant return INVARIANT;
123 sampler1D return SAMPLER1D;
124 sampler2D return SAMPLER2D;
125 sampler3D return SAMPLER3D;
126 samplerCube return SAMPLERCUBE;
127 sampler1DShadow return SAMPLER1DSHADOW;
128 sampler2DShadow return SAMPLER2DSHADOW;
130 struct return STRUCT;
143 \*= return MUL_ASSIGN;
144 \/= return DIV_ASSIGN;
145 \+= return ADD_ASSIGN;
146 \%= return MOD_ASSIGN;
147 \<\<= return LEFT_ASSIGN;
148 >>= return RIGHT_ASSIGN;
149 &= return AND_ASSIGN;
150 ^= return XOR_ASSIGN;
151 \|= return OR_ASSIGN;
152 -= return SUB_ASSIGN;
155 yylval->n = strtol(yytext, NULL, 10);
159 yylval->n = strtol(yytext + 2, NULL, 16);
163 yylval->n = strtol(yytext + 2, NULL, 8);
167 [0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]? {
168 yylval->real = strtod(yytext, NULL);
169 return FLOATCONSTANT;
171 \.[0-9]+([eE][+-]?[0-9]+)?[fF]? {
172 yylval->real = strtod(yytext, NULL);
173 return FLOATCONSTANT;
175 [0-9]+\.([eE][+-]?[0-9]+)?[fF]? {
176 yylval->real = strtod(yytext, NULL);
177 return FLOATCONSTANT;
179 [0-9]+[eE][+-]?[0-9]+[fF]? {
180 yylval->real = strtod(yytext, NULL);
181 return FLOATCONSTANT;
194 /* Reserved words in GLSL 1.10. */
199 typedef return TYPEDEF;
200 template return TEMPLATE;
202 packed return PACKED;
204 switch return SWITCH;
205 default return DEFAULT;
206 inline return INLINE;
207 noinline return NOINLINE;
208 volatile return VOLATILE;
209 public return PUBLIC;
210 static return STATIC;
211 extern return EXTERN;
212 external return EXTERNAL;
213 interface return INTERFACE;
216 double return DOUBLE;
219 unsigned return UNSIGNED;
221 output return OUTPUT;
231 sampler2DRect return SAMPLER2DRECT;
232 sampler3DRect return SAMPLER3DRECT;
233 sampler2DRectShadow return SAMPLER2DRECTSHADOW;
234 sizeof return SIZEOF;
236 namespace return NAMESPACE;
239 /* Additional reserved words in GLSL 1.20. */
241 mediump return MEDIUMP;
243 precision return PRECISION;
245 [_a-zA-Z][_a-zA-Z0-9]* {
246 yylval->identifier = strdup(yytext);
250 . { return yytext[0]; }
255 _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state,
256 const char *string, size_t len)
258 yylex_init_extra(state, & state->scanner);
259 yy_scan_bytes(string, len, state->scanner);
263 _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state)
265 yylex_destroy(state->scanner);