Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 1
%{
2
/*
3
 * Copyright © 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 "main/glheader.h"
25
#include "main/imports.h"
26
#include "program/prog_instruction.h"
27
#include "program/prog_statevars.h"
28
#include "program/symbol_table.h"
29
#include "program/program_parser.h"
30
#include "program/program_parse.tab.h"
31
 
32
#define require_ARB_vp (yyextra->mode == ARB_vertex)
33
#define require_ARB_fp (yyextra->mode == ARB_fragment)
34
#define require_NV_fp  (yyextra->option.NV_fragment)
35
#define require_shadow (yyextra->option.Shadow)
36
#define require_rect   (yyextra->option.TexRect)
37
#define require_texarray        (yyextra->option.TexArray)
38
 
39
#ifndef HAVE_UNISTD_H
40
#define YY_NO_UNISTD_H
41
#endif
42
 
43
#define return_token_or_IDENTIFIER(condition, token)	\
44
   do {							\
45
      if (condition) {					\
46
	 return token;					\
47
      } else {						\
48
	 return handle_ident(yyextra, yytext, yylval);	\
49
      }							\
50
   } while (0)
51
 
52
#define return_token_or_DOT(condition, token)		\
53
   do {							\
54
      if (condition) {					\
55
	 return token;					\
56
      } else {						\
57
	 yyless(1);					\
58
	 return DOT;					\
59
      }							\
60
   } while (0)
61
 
62
 
63
#define return_opcode(condition, token, opcode, len)	\
64
   do {							\
65
      if (condition &&					\
66
	  _mesa_parse_instruction_suffix(yyextra,	\
67
					 yytext + len,	\
68
					 & yylval->temp_inst)) {	\
69
	 yylval->temp_inst.Opcode = OPCODE_ ## opcode;	\
70
	 return token;					\
71
      } else {						\
72
	 return handle_ident(yyextra, yytext, yylval);	\
73
      }							\
74
   } while (0)
75
 
76
#define SWIZZLE_INVAL  MAKE_SWIZZLE4(SWIZZLE_NIL, SWIZZLE_NIL, \
77
				     SWIZZLE_NIL, SWIZZLE_NIL)
78
 
79
static unsigned
80
mask_from_char(char c)
81
{
82
   switch (c) {
83
   case 'x':
84
   case 'r':
85
      return WRITEMASK_X;
86
   case 'y':
87
   case 'g':
88
      return WRITEMASK_Y;
89
   case 'z':
90
   case 'b':
91
      return WRITEMASK_Z;
92
   case 'w':
93
   case 'a':
94
      return WRITEMASK_W;
95
   }
96
 
97
   return 0;
98
}
99
 
100
static unsigned
101
swiz_from_char(char c)
102
{
103
   switch (c) {
104
   case 'x':
105
   case 'r':
106
      return SWIZZLE_X;
107
   case 'y':
108
   case 'g':
109
      return SWIZZLE_Y;
110
   case 'z':
111
   case 'b':
112
      return SWIZZLE_Z;
113
   case 'w':
114
   case 'a':
115
      return SWIZZLE_W;
116
   }
117
 
118
   return 0;
119
}
120
 
121
static int
122
handle_ident(struct asm_parser_state *state, const char *text, YYSTYPE *lval)
123
{
124
   lval->string = strdup(text);
125
 
126
   return (_mesa_symbol_table_find_symbol(state->st, 0, text) == NULL)
127
      ? IDENTIFIER : USED_IDENTIFIER;
128
}
129
 
130
#define YY_USER_ACTION							\
131
   do {									\
132
      yylloc->first_column = yylloc->last_column;			\
133
      yylloc->last_column += yyleng;					\
134
      if ((yylloc->first_line == 1)					\
135
	  && (yylloc->first_column == 1)) {				\
136
	 yylloc->position = 1;						\
137
      } else {								\
138
	 yylloc->position += yylloc->last_column - yylloc->first_column; \
139
      }									\
140
   } while(0);
141
 
142
#define YY_NO_INPUT
143
 
144
/* Yes, this is intentionally doing nothing. We have this line of code
145
here only to avoid the compiler complaining about an unput function
146
that is defined, but never called. */
147
#define YY_USER_INIT while (0) { unput(0); }
148
 
149
#define YY_EXTRA_TYPE struct asm_parser_state *
150
 
151
/* Flex defines a couple of functions with no declarations nor the
152
static keyword. Declare them here to avoid a compiler warning. */
153
int yyget_column  (yyscan_t yyscanner);
154
void yyset_column (int  column_no , yyscan_t yyscanner);
155
 
156
%}
157
 
158
num    [0-9]+
159
exp    [Ee][-+]?[0-9]+
160
frac   "."[0-9]+
161
dot    "."[ \t]*
162
 
163
sz     [HRX]?
164
szf    [HR]?
165
cc     C?
166
sat    (_SAT)?
167
 
168
%option prefix="_mesa_program_lexer_"
169
%option bison-bridge bison-locations reentrant noyywrap
170
%%
171
 
172
"!!ARBvp1.0"              { return ARBvp_10; }
173
"!!ARBfp1.0"              { return ARBfp_10; }
174
ADDRESS                   {
175
   yylval->integer = at_address;
176
   return_token_or_IDENTIFIER(require_ARB_vp, ADDRESS);
177
}
178
ALIAS                     { return ALIAS; }
179
ATTRIB                    { return ATTRIB; }
180
END                       { return END; }
181
OPTION                    { return OPTION; }
182
OUTPUT                    { return OUTPUT; }
183
PARAM                     { return PARAM; }
184
TEMP                      { yylval->integer = at_temp; return TEMP; }
185
 
186
ABS{sz}{cc}{sat}   { return_opcode(             1, VECTOR_OP, ABS, 3); }
187
ADD{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, ADD, 3); }
188
ARL                { return_opcode(require_ARB_vp, ARL, ARL, 3); }
189
 
190
CMP{sat}           { return_opcode(require_ARB_fp, TRI_OP, CMP, 3); }
191
COS{szf}{cc}{sat}  { return_opcode(require_ARB_fp, SCALAR_OP, COS, 3); }
192
 
193
DDX{szf}{cc}{sat}  { return_opcode(require_NV_fp,  VECTOR_OP, DDX, 3); }
194
DDY{szf}{cc}{sat}  { return_opcode(require_NV_fp,  VECTOR_OP, DDY, 3); }
195
DP3{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, DP3, 3); }
196
DP4{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, DP4, 3); }
197
DPH{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, DPH, 3); }
198
DST{szf}{cc}{sat}  { return_opcode(             1, BIN_OP, DST, 3); }
199
 
200
EX2{szf}{cc}{sat}  { return_opcode(             1, SCALAR_OP, EX2, 3); }
201
EXP                { return_opcode(require_ARB_vp, SCALAR_OP, EXP, 3); }
202
 
203
FLR{sz}{cc}{sat}   { return_opcode(             1, VECTOR_OP, FLR, 3); }
204
FRC{sz}{cc}{sat}   { return_opcode(             1, VECTOR_OP, FRC, 3); }
205
 
206
KIL                { return_opcode(require_ARB_fp, KIL, KIL, 3); }
207
 
208
LIT{szf}{cc}{sat}  { return_opcode(             1, VECTOR_OP, LIT, 3); }
209
LG2{szf}{cc}{sat}  { return_opcode(             1, SCALAR_OP, LG2, 3); }
210
LOG                { return_opcode(require_ARB_vp, SCALAR_OP, LOG, 3); }
211
LRP{sz}{cc}{sat}   { return_opcode(require_ARB_fp, TRI_OP, LRP, 3); }
212
 
213
MAD{sz}{cc}{sat}   { return_opcode(             1, TRI_OP, MAD, 3); }
214
MAX{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, MAX, 3); }
215
MIN{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, MIN, 3); }
216
MOV{sz}{cc}{sat}   { return_opcode(             1, VECTOR_OP, MOV, 3); }
217
MUL{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, MUL, 3); }
218
 
219
PK2H               { return_opcode(require_NV_fp,  VECTOR_OP, PK2H, 4); }
220
PK2US              { return_opcode(require_NV_fp,  VECTOR_OP, PK2US, 5); }
221
PK4B               { return_opcode(require_NV_fp,  VECTOR_OP, PK4B, 4); }
222
PK4UB              { return_opcode(require_NV_fp,  VECTOR_OP, PK4UB, 5); }
223
POW{szf}{cc}{sat}  { return_opcode(             1, BINSC_OP, POW, 3); }
224
 
225
RCP{szf}{cc}{sat}  { return_opcode(             1, SCALAR_OP, RCP, 3); }
226
RFL{szf}{cc}{sat}  { return_opcode(require_NV_fp,  BIN_OP,    RFL, 3); }
227
RSQ{szf}{cc}{sat}  { return_opcode(             1, SCALAR_OP, RSQ, 3); }
228
 
229
SCS{sat}           { return_opcode(require_ARB_fp, SCALAR_OP, SCS, 3); }
230
SEQ{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, SEQ, 3); }
231
SFL{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, SFL, 3); }
232
SGE{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, SGE, 3); }
233
SGT{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, SGT, 3); }
234
SIN{szf}{cc}{sat}  { return_opcode(require_ARB_fp, SCALAR_OP, SIN, 3); }
235
SLE{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, SLE, 3); }
236
SLT{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, SLT, 3); }
237
SNE{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, SNE, 3); }
238
STR{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, STR, 3); }
239
SUB{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, SUB, 3); }
240
SWZ{sat}           { return_opcode(             1, SWZ, SWZ, 3); }
241
 
242
TEX{cc}{sat}       { return_opcode(require_ARB_fp, SAMPLE_OP, TEX, 3); }
243
TXB{cc}{sat}       { return_opcode(require_ARB_fp, SAMPLE_OP, TXB, 3); }
244
TXD{cc}{sat}       { return_opcode(require_NV_fp,  TXD_OP, TXD, 3); }
245
TXP{cc}{sat}       { return_opcode(require_ARB_fp, SAMPLE_OP, TXP, 3); }
246
 
247
UP2H{cc}{sat}      { return_opcode(require_NV_fp,  SCALAR_OP, UP2H, 4); }
248
UP2US{cc}{sat}     { return_opcode(require_NV_fp,  SCALAR_OP, UP2US, 5); }
249
UP4B{cc}{sat}      { return_opcode(require_NV_fp,  SCALAR_OP, UP4B, 4); }
250
UP4UB{cc}{sat}     { return_opcode(require_NV_fp,  SCALAR_OP, UP4UB, 5); }
251
 
252
X2D{szf}{cc}{sat}  { return_opcode(require_NV_fp,  TRI_OP, X2D, 3); }
253
XPD{sat}           { return_opcode(             1, BIN_OP, XPD, 3); }
254
 
255
vertex                    { return_token_or_IDENTIFIER(require_ARB_vp, VERTEX); }
256
fragment                  { return_token_or_IDENTIFIER(require_ARB_fp, FRAGMENT); }
257
program                   { return PROGRAM; }
258
state                     { return STATE; }
259
result                    { return RESULT; }
260
 
261
{dot}ambient              { return AMBIENT; }
262
{dot}attenuation          { return ATTENUATION; }
263
{dot}back                 { return BACK; }
264
{dot}clip                 { return_token_or_DOT(require_ARB_vp, CLIP); }
265
{dot}color                { return COLOR; }
266
{dot}depth                { return_token_or_DOT(require_ARB_fp, DEPTH); }
267
{dot}diffuse              { return DIFFUSE; }
268
{dot}direction            { return DIRECTION; }
269
{dot}emission             { return EMISSION; }
270
{dot}env                  { return ENV; }
271
{dot}eye                  { return EYE; }
272
{dot}fogcoord             { return FOGCOORD; }
273
{dot}fog                  { return FOG; }
274
{dot}front                { return FRONT; }
275
{dot}half                 { return HALF; }
276
{dot}inverse              { return INVERSE; }
277
{dot}invtrans             { return INVTRANS; }
278
{dot}light                { return LIGHT; }
279
{dot}lightmodel           { return LIGHTMODEL; }
280
{dot}lightprod            { return LIGHTPROD; }
281
{dot}local                { return LOCAL; }
282
{dot}material             { return MATERIAL; }
283
{dot}program              { return MAT_PROGRAM; }
284
{dot}matrix               { return MATRIX; }
285
{dot}matrixindex          { return_token_or_DOT(require_ARB_vp, MATRIXINDEX); }
286
{dot}modelview            { return MODELVIEW; }
287
{dot}mvp                  { return MVP; }
288
{dot}normal               { return_token_or_DOT(require_ARB_vp, NORMAL); }
289
{dot}object               { return OBJECT; }
290
{dot}palette              { return PALETTE; }
291
{dot}params               { return PARAMS; }
292
{dot}plane                { return PLANE; }
293
{dot}point                { return_token_or_DOT(require_ARB_vp, POINT_TOK); }
294
{dot}pointsize            { return_token_or_DOT(require_ARB_vp, POINTSIZE); }
295
{dot}position             { return POSITION; }
296
{dot}primary              { return PRIMARY; }
297
{dot}projection           { return PROJECTION; }
298
{dot}range                { return_token_or_DOT(require_ARB_fp, RANGE); }
299
{dot}row                  { return ROW; }
300
{dot}scenecolor           { return SCENECOLOR; }
301
{dot}secondary            { return SECONDARY; }
302
{dot}shininess            { return SHININESS; }
303
{dot}size                 { return_token_or_DOT(require_ARB_vp, SIZE_TOK); }
304
{dot}specular             { return SPECULAR; }
305
{dot}spot                 { return SPOT; }
306
{dot}texcoord             { return TEXCOORD; }
307
{dot}texenv               { return_token_or_DOT(require_ARB_fp, TEXENV); }
308
{dot}texgen               { return_token_or_DOT(require_ARB_vp, TEXGEN); }
309
{dot}q                    { return_token_or_DOT(require_ARB_vp, TEXGEN_Q); }
310
{dot}s                    { return_token_or_DOT(require_ARB_vp, TEXGEN_S); }
311
{dot}t                    { return_token_or_DOT(require_ARB_vp, TEXGEN_T); }
312
{dot}texture              { return TEXTURE; }
313
{dot}transpose            { return TRANSPOSE; }
314
{dot}attrib               { return_token_or_DOT(require_ARB_vp, VTXATTRIB); }
315
{dot}weight               { return_token_or_DOT(require_ARB_vp, WEIGHT); }
316
 
317
texture                   { return_token_or_IDENTIFIER(require_ARB_fp, TEXTURE_UNIT); }
318
1D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_1D); }
319
2D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_2D); }
320
3D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_3D); }
321
CUBE                      { return_token_or_IDENTIFIER(require_ARB_fp, TEX_CUBE); }
322
RECT                      { return_token_or_IDENTIFIER(require_ARB_fp && require_rect, TEX_RECT); }
323
SHADOW1D                  { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow, TEX_SHADOW1D); }
324
SHADOW2D                  { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow, TEX_SHADOW2D); }
325
SHADOWRECT                { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow && require_rect, TEX_SHADOWRECT); }
326
ARRAY1D                   { return_token_or_IDENTIFIER(require_ARB_fp && require_texarray, TEX_ARRAY1D); }
327
ARRAY2D                   { return_token_or_IDENTIFIER(require_ARB_fp && require_texarray, TEX_ARRAY2D); }
328
ARRAYSHADOW1D             { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow && require_texarray, TEX_ARRAYSHADOW1D); }
329
ARRAYSHADOW2D             { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow && require_texarray, TEX_ARRAYSHADOW2D); }
330
 
331
[_a-zA-Z$][_a-zA-Z0-9$]*  { return handle_ident(yyextra, yytext, yylval); }
332
 
333
".."                      { return DOT_DOT; }
334
 
335
{num}                     {
336
   yylval->integer = strtol(yytext, NULL, 10);
337
   return INTEGER;
338
}
339
{num}?{frac}{exp}?        {
340
   yylval->real = _mesa_strtof(yytext, NULL);
341
   return REAL;
342
}
343
{num}"."/[^.]             {
344
   yylval->real = _mesa_strtof(yytext, NULL);
345
   return REAL;
346
}
347
{num}{exp}                {
348
   yylval->real = _mesa_strtof(yytext, NULL);
349
   return REAL;
350
}
351
{num}"."{exp}             {
352
   yylval->real = _mesa_strtof(yytext, NULL);
353
   return REAL;
354
}
355
 
356
".xyzw"                   {
357
   yylval->swiz_mask.swizzle = SWIZZLE_NOOP;
358
   yylval->swiz_mask.mask = WRITEMASK_XYZW;
359
   return MASK4;
360
}
361
 
362
".xy"[zw]                 {
363
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
364
   yylval->swiz_mask.mask = WRITEMASK_XY
365
      | mask_from_char(yytext[3]);
366
   return MASK3;
367
}
368
".xzw"                    {
369
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
370
   yylval->swiz_mask.mask = WRITEMASK_XZW;
371
   return MASK3;
372
}
373
".yzw"                    {
374
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
375
   yylval->swiz_mask.mask = WRITEMASK_YZW;
376
   return MASK3;
377
}
378
 
379
".x"[yzw]                 {
380
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
381
   yylval->swiz_mask.mask = WRITEMASK_X
382
      | mask_from_char(yytext[2]);
383
   return MASK2;
384
}
385
".y"[zw]                  {
386
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
387
   yylval->swiz_mask.mask = WRITEMASK_Y
388
      | mask_from_char(yytext[2]);
389
   return MASK2;
390
}
391
".zw"                     {
392
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
393
   yylval->swiz_mask.mask = WRITEMASK_ZW;
394
   return MASK2;
395
}
396
 
397
"."[xyzw]                 {
398
   const unsigned s = swiz_from_char(yytext[1]);
399
   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(s, s, s, s);
400
   yylval->swiz_mask.mask = mask_from_char(yytext[1]);
401
   return MASK1;
402
}
403
 
404
"."[xyzw]{4}              {
405
   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(swiz_from_char(yytext[1]),
406
					    swiz_from_char(yytext[2]),
407
					    swiz_from_char(yytext[3]),
408
					    swiz_from_char(yytext[4]));
409
   yylval->swiz_mask.mask = 0;
410
   return SWIZZLE;
411
}
412
 
413
".rgba"                   {
414
   yylval->swiz_mask.swizzle = SWIZZLE_NOOP;
415
   yylval->swiz_mask.mask = WRITEMASK_XYZW;
416
   return_token_or_DOT(require_ARB_fp, MASK4);
417
}
418
 
419
".rg"[ba]                 {
420
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
421
   yylval->swiz_mask.mask = WRITEMASK_XY
422
      | mask_from_char(yytext[3]);
423
   return_token_or_DOT(require_ARB_fp, MASK3);
424
}
425
".rba"                    {
426
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
427
   yylval->swiz_mask.mask = WRITEMASK_XZW;
428
   return_token_or_DOT(require_ARB_fp, MASK3);
429
}
430
".gba"                    {
431
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
432
   yylval->swiz_mask.mask = WRITEMASK_YZW;
433
   return_token_or_DOT(require_ARB_fp, MASK3);
434
}
435
 
436
".r"[gba]                 {
437
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
438
   yylval->swiz_mask.mask = WRITEMASK_X
439
      | mask_from_char(yytext[2]);
440
   return_token_or_DOT(require_ARB_fp, MASK2);
441
}
442
".g"[ba]                  {
443
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
444
   yylval->swiz_mask.mask = WRITEMASK_Y
445
      | mask_from_char(yytext[2]);
446
   return_token_or_DOT(require_ARB_fp, MASK2);
447
}
448
".ba"                     {
449
   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
450
   yylval->swiz_mask.mask = WRITEMASK_ZW;
451
   return_token_or_DOT(require_ARB_fp, MASK2);
452
}
453
 
454
"."[gba]                  {
455
   const unsigned s = swiz_from_char(yytext[1]);
456
   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(s, s, s, s);
457
   yylval->swiz_mask.mask = mask_from_char(yytext[1]);
458
   return_token_or_DOT(require_ARB_fp, MASK1);
459
}
460
 
461
 
462
".r"                      {
463
   if (require_ARB_vp) {
464
      return TEXGEN_R;
465
   } else {
466
      yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X,
467
						SWIZZLE_X, SWIZZLE_X);
468
      yylval->swiz_mask.mask = WRITEMASK_X;
469
      return MASK1;
470
   }
471
}
472
 
473
"."[rgba]{4}              {
474
   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(swiz_from_char(yytext[1]),
475
					    swiz_from_char(yytext[2]),
476
					    swiz_from_char(yytext[3]),
477
					    swiz_from_char(yytext[4]));
478
   yylval->swiz_mask.mask = 0;
479
   return_token_or_DOT(require_ARB_fp, SWIZZLE);
480
}
481
 
482
"."                       { return DOT; }
483
 
484
\n                        {
485
   yylloc->first_line++;
486
   yylloc->first_column = 1;
487
   yylloc->last_line++;
488
   yylloc->last_column = 1;
489
   yylloc->position++;
490
}
491
[ \t\r]+                  /* eat whitespace */ ;
492
#.*$                      /* eat comments */ ;
493
.                         { return yytext[0]; }
494
%%
495
 
496
void
497
_mesa_program_lexer_ctor(void **scanner, struct asm_parser_state *state,
498
			 const char *string, size_t len)
499
{
500
   yylex_init_extra(state, scanner);
501
   yy_scan_bytes(string, len, *scanner);
502
}
503
 
504
void
505
_mesa_program_lexer_dtor(void *scanner)
506
{
507
   yylex_destroy(scanner);
508
}