source: trunk/src/gpu/lolfx-scanner.l @ 1590

Last change on this file since 1590 was 1590, checked in by sam, 9 years ago

core: start working on a higher level LolFx compiler based on the latest
GLSL grammar and some personal attempts at writing an HLSL grammar.

File size: 28.6 KB
Line 
1%{
2//
3// Lol Engine
4//
5// Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net>
6//   This program is free software; you can redistribute it and/or
7//   modify it under the terms of the Do What The Fuck You Want To
8//   Public License, Version 2, as published by Sam Hocevar. See
9//   http://sam.zoy.org/projects/COPYING.WTFPL for more details.
10//
11
12#if defined HAVE_CONFIG_H
13#   include "config.h"
14#endif
15
16#include <cstdlib>
17using std::exit;
18using std::malloc;
19using std::realloc;
20using std::free;
21#include <iostream>
22
23#include "core.h"
24#include "gpu/lolfx-compiler.h"
25
26typedef lol::LolFxParser::token token;
27typedef lol::LolFxParser::token_type token_type;
28
29#ifndef YY_DECL
30#   define YY_DECL lol::LolFxParser::token_type \
31        lol::LolFxScanner::lex(lol::LolFxParser::semantic_type* yylval, \
32                               lol::LolFxParser::location_type* yylloc)
33#endif
34
35#define yyterminate() return token::T_END
36#define YY_NO_UNISTD_H
37#define YY_USER_ACTION yylloc->columns(yyleng);
38%}
39
40%option c++ prefix="LolFx"
41%option batch yywrap nounput stack
42
43%x C_COMMENT
44%x CPP_COMMENT
45
46%%
47
48%{
49    /* reset location at the beginning of yylex() */
50    yylloc->step();
51
52    int language_guess = INITIAL;
53%}
54
55 /*
56  * GLSL keywords
57  */
58
59"subroutine"                 { return token::GT_SUBROUTINE; }
60"patch"                      { return token::GT_PATCH; }
61"sample"                     { return token::GT_SAMPLE; }
62"flat"                       { return token::GT_FLAT; }
63"smooth"                     { return token::GT_SMOOTH; }
64"layout"                     { return token::GT_LAYOUT; }
65"sampler1dshadow"            { return token::GT_SAMPLER1DSHADOW; }
66"sampler2dshadow"            { return token::GT_SAMPLER2DSHADOW; }
67"samplercubeshadow"          { return token::GT_SAMPLERCUBESHADOW; }
68"sampler1darray"             { return token::GT_SAMPLER1DARRAY; }
69"sampler2darray"             { return token::GT_SAMPLER2DARRAY; }
70"sampler1darrayshadow"       { return token::GT_SAMPLER1DARRAYSHADOW; }
71"sampler2darrayshadow"       { return token::GT_SAMPLER2DARRAYSHADOW; }
72"isampler1d"                 { return token::GT_ISAMPLER1D; }
73"isampler2d"                 { return token::GT_ISAMPLER2D; }
74"isampler3d"                 { return token::GT_ISAMPLER3D; }
75"isamplercube"               { return token::GT_ISAMPLERCUBE; }
76"isampler1darray"            { return token::GT_ISAMPLER1DARRAY; }
77"isampler2darray"            { return token::GT_ISAMPLER2DARRAY; }
78"usampler1d"                 { return token::GT_USAMPLER1D; }
79"usampler2d"                 { return token::GT_USAMPLER2D; }
80"usampler3d"                 { return token::GT_USAMPLER3D; }
81"usamplercube"               { return token::GT_USAMPLERCUBE; }
82"usampler1darray"            { return token::GT_USAMPLER1DARRAY; }
83"usampler2darray"            { return token::GT_USAMPLER2DARRAY; }
84"sampler2drect"              { return token::GT_SAMPLER2DRECT; }
85"sampler2drectshadow"        { return token::GT_SAMPLER2DRECTSHADOW; }
86"isampler2drect"             { return token::GT_ISAMPLER2DRECT; }
87"usampler2drect"             { return token::GT_USAMPLER2DRECT; }
88"samplerbuffer"              { return token::GT_SAMPLERBUFFER; }
89"isamplerbuffer"             { return token::GT_ISAMPLERBUFFER; }
90"usamplerbuffer"             { return token::GT_USAMPLERBUFFER; }
91"samplercubearray"           { return token::GT_SAMPLERCUBEARRAY; }
92"samplercubearrayshadow"     { return token::GT_SAMPLERCUBEARRAYSHADOW; }
93"isamplercubearray"          { return token::GT_ISAMPLERCUBEARRAY; }
94"usamplercubearray"          { return token::GT_USAMPLERCUBEARRAY; }
95"sampler2dms"                { return token::GT_SAMPLER2DMS; }
96"isampler2dms"               { return token::GT_ISAMPLER2DMS; }
97"usampler2dms"               { return token::GT_USAMPLER2DMS; }
98"sampler2dmsarray"           { return token::GT_SAMPLER2DMSARRAY; }
99"isampler2dmsarray"          { return token::GT_ISAMPLER2DMSARRAY; }
100"usampler2dmsarray"          { return token::GT_USAMPLER2DMSARRAY; }
101
102"highp"                      { return token::GT_HIGHP; }
103"mediump"                    { return token::GT_MEDIUMP; }
104"lowp"                       { return token::GT_LOWP; }
105"precision"                  { return token::GT_PRECISION; }
106"invariant"                  { return token::GT_INVARIANT; }
107
108 /*
109  * Deprecated GLSL keywords
110  */
111
112"attribute"                  { return token::GT_ATTRIBUTE; }
113
114 /*
115  * GLSL vector types
116  */
117
118"bvec2"                      { return token::GT_BVEC2; }
119"bvec3"                      { return token::GT_BVEC3; }
120"bvec4"                      { return token::GT_BVEC4; }
121
122"ivec2"                      { return token::GT_IVEC2; }
123"ivec3"                      { return token::GT_IVEC3; }
124"ivec4"                      { return token::GT_IVEC4; }
125
126"uvec2"                      { return token::GT_UVEC2; }
127"uvec3"                      { return token::GT_UVEC3; }
128"uvec4"                      { return token::GT_UVEC4; }
129
130"vec2"                       { return token::GT_VEC2; }
131"vec3"                       { return token::GT_VEC3; }
132"vec4"                       { return token::GT_VEC4; }
133"mat2"                       { return token::GT_MAT2; }
134"mat2x2"                     { return token::GT_MAT2X2; }
135"mat2x3"                     { return token::GT_MAT2X3; }
136"mat2x4"                     { return token::GT_MAT2X4; }
137"mat3"                       { return token::GT_MAT3; }
138"mat3x2"                     { return token::GT_MAT3X2; }
139"mat3x3"                     { return token::GT_MAT3X3; }
140"mat3x4"                     { return token::GT_MAT3X4; }
141"mat4"                       { return token::GT_MAT4; }
142"mat4x2"                     { return token::GT_MAT4X2; }
143"mat4x3"                     { return token::GT_MAT4X3; }
144"mat4x4"                     { return token::GT_MAT4X4; }
145
146"dvec2"                      { return token::GT_DVEC2; }
147"dvec3"                      { return token::GT_DVEC3; }
148"dvec4"                      { return token::GT_DVEC4; }
149"dmat2"                      { return token::GT_DMAT2; }
150"dmat2x2"                    { return token::GT_DMAT2X2; }
151"dmat2x3"                    { return token::GT_DMAT2X3; }
152"dmat2x4"                    { return token::GT_DMAT2X4; }
153"dmat3"                      { return token::GT_DMAT3; }
154"dmat3x2"                    { return token::GT_DMAT3X2; }
155"dmat3x3"                    { return token::GT_DMAT3X3; }
156"dmat3x4"                    { return token::GT_DMAT3X4; }
157"dmat4"                      { return token::GT_DMAT4; }
158"dmat4x2"                    { return token::GT_DMAT4X2; }
159"dmat4x3"                    { return token::GT_DMAT4X3; }
160"dmat4x4"                    { return token::GT_DMAT4X4; }
161
162 /*
163  * GLSL constant values
164  */
165
166"true"                       { yylval->ival = 1; return token::BOOLCONSTANT; }
167"false"                      { yylval->ival = 0; return token::BOOLCONSTANT; }
168
169[xyzw]{1,4}                  { return token::FIELDSELECTION; }
170[rgba]{1,4}                  { return token::FIELDSELECTION; }
171[stpq]{1,4}                  { return token::FIELDSELECTION; }
172
173 /*
174  * GLSL keywords that are also valid or reserved in HLSL
175  * and HLSL keywords that are also valid or reserved in GLSL.
176  */
177
178"bool"                       { return token::GHT_BOOL; }
179"break"                      { return token::GHT_BREAK; }
180"case"                       { return token::GHT_CASE; }
181"centroid"                   { return token::GHT_CENTROID; }
182"const"                      { return token::GHT_CONST; }
183"continue"                   { return token::GHT_CONTINUE; }
184"default"                    { return token::GHT_DEFAULT; }
185"discard"                    { return token::GHT_DISCARD; }
186"do"                         { return token::GHT_DO; }
187"double"                     { return token::GHT_DOUBLE; }
188"else"                       { return token::GHT_ELSE; }
189"float"                      { return token::GHT_FLOAT; }
190"for"                        { return token::GHT_FOR; }
191"if"                         { return token::GHT_IF; }
192"in"                         { return token::GHT_IN; }
193"inout"                      { return token::GHT_INOUT; }
194"int"                        { return token::GHT_INT; }
195"noperspective"              { return token::GHT_NOPERSPECTIVE; }
196"out"                        { return token::GHT_OUT; }
197"return"                     { return token::GHT_RETURN; }
198"sampler1d"                  { return token::GHT_SAMPLER1D; }
199"sampler2d"                  { return token::GHT_SAMPLER2D; }
200"sampler3d"                  { return token::GHT_SAMPLER3D; }
201"samplercube"                { return token::GHT_SAMPLERCUBE; }
202"struct"                     { return token::GHT_STRUCT; }
203"switch"                     { return token::GHT_SWITCH; }
204"uint"                       { return token::GHT_UINT; }
205"uniform"                    { return token::GHT_UNIFORM; }
206"void"                       { return token::GHT_VOID; }
207"while"                      { return token::GHT_WHILE; }
208
209(?i:bool)                    { return token::HGT_BOOL; }
210(?i:break)                   { return token::HGT_BREAK; }
211(?i:case)                    { return token::HGT_CASE; }
212(?i:centroid)                { return token::HGT_CENTROID; }
213(?i:const)                   { return token::HGT_CONST; }
214(?i:continue)                { return token::HGT_CONTINUE; }
215(?i:default)                 { return token::HGT_DEFAULT; }
216(?i:discard)                 { return token::HGT_DISCARD; }
217(?i:do)                      { return token::HGT_DO; }
218(?i:double)                  { return token::HGT_DOUBLE; }
219(?i:else)                    { return token::HGT_ELSE; }
220(?i:float)                   { return token::HGT_FLOAT; }
221(?i:for)                     { return token::HGT_FOR; }
222(?i:if)                      { return token::HGT_IF; }
223(?i:in)                      { return token::HGT_IN; }
224(?i:inout)                   { return token::HGT_INOUT; }
225(?i:int)                     { return token::HGT_INT; }
226(?i:noperspective)           { return token::HGT_NOPERSPECTIVE; }
227(?i:out)                     { return token::HGT_OUT; }
228(?i:return)                  { return token::HGT_RETURN; }
229(?i:sampler1d)               { return token::HGT_SAMPLER1D; }
230(?i:sampler2d)               { return token::HGT_SAMPLER2D; }
231(?i:sampler3d)               { return token::HGT_SAMPLER3D; }
232(?i:samplercube)             { return token::HGT_SAMPLERCUBE; }
233(?i:struct)                  { return token::HGT_STRUCT; }
234(?i:switch)                  { return token::HGT_SWITCH; }
235(?i:uint)                    { return token::HGT_UINT; }
236(?i:uniform)                 { return token::HGT_UNIFORM; }
237(?i:void)                    { return token::HGT_VOID; }
238(?i:while)                   { return token::HGT_WHILE; }
239
240 /*
241  * HLSL keywords
242  * Gathered from http://msdn.microsoft.com/en-us/library/windows/desktop/bb509568%28v=vs.85%29.aspx
243  */
244
245(?i:appendstructuredbuffer)  { return token::HT_APPENDSTRUCTUREDBUFFER; }
246(?i:asm)                     { return token::HT_ASM; }
247(?i:asm_fragment)            { return token::HT_ASM_FRAGMENT; }
248(?i:blendstate)              { return token::HT_BLENDSTATE; }
249(?i:buffer)                  { return token::HT_BUFFER; }
250(?i:byteaddressbuffer)       { return token::HT_BYTEADDRESSBUFFER; }
251(?i:cbuffer)                 { return token::HT_CBUFFER; }
252(?i:column_major)            { return token::HT_COLUMN_MAJOR; }
253(?i:compile)                 { return token::HT_COMPILE; }
254(?i:compile_fragment)        { return token::HT_COMPILE_FRAGMENT; }
255(?i:compileshader)           { return token::HT_COMPILESHADER; }
256(?i:computeshader)           { return token::HT_COMPUTESHADER; }
257(?i:consumestructuredbuffer) { return token::HT_CONSUMESTRUCTUREDBUFFER; }
258(?i:depthstencilstate)       { return token::HT_DEPTHSTENCILSTATE; }
259(?i:depthstencilview)        { return token::HT_DEPTHSTENCILVIEW; }
260(?i:domainshader)            { return token::HT_DOMAINSHADER; }
261(?i:dword)                   { return token::HT_DWORD; }
262(?i:extern)                  { return token::HT_EXTERN; }
263(?i:false)                   { return token::HT_FALSE; }
264(?i:fxgroup)                 { return token::HT_FXGROUP; }
265(?i:geometryshader)          { return token::HT_GEOMETRYSHADER; }
266(?i:groupshared)             { return token::HT_GROUPSHARED; }
267(?i:half)                    { return token::HT_HALF; }
268(?i:hullshader)              { return token::HT_HULLSHADER; }
269(?i:inline)                  { return token::HT_INLINE; }
270(?i:inputpatch)              { return token::HT_INPUTPATCH; }
271(?i:interface)               { return token::HT_INTERFACE; }
272(?i:line)                    { return token::HT_LINE; }
273(?i:lineadj)                 { return token::HT_LINEADJ; }
274(?i:linear)                  { return token::HT_LINEAR; }
275(?i:linestream)              { return token::HT_LINESTREAM; }
276(?i:matrix)                  { return token::HT_MATRIX; }
277(?i:namespace)               { return token::HT_NAMESPACE; }
278(?i:nointerpolation)         { return token::HT_NOINTERPOLATION; }
279(?i:null)                    { return token::HT_NULL; }
280(?i:outputpatch)             { return token::HT_OUTPUTPATCH; }
281(?i:packoffset)              { return token::HT_PACKOFFSET; }
282(?i:pass)                    { return token::HT_PASS; }
283(?i:pixelfragment)           { return token::HT_PIXELFRAGMENT; }
284(?i:pixelshader)             { return token::HT_PIXELSHADER; }
285(?i:point)                   { return token::HT_POINT; }
286(?i:pointstream)             { return token::HT_POINTSTREAM; }
287(?i:precise)                 { return token::HT_PRECISE; }
288(?i:rasterizerstate)         { return token::HT_RASTERIZERSTATE; }
289(?i:rendertargetview)        { return token::HT_RENDERTARGETVIEW; }
290(?i:register)                { return token::HT_REGISTER; }
291(?i:row_major)               { return token::HT_ROW_MAJOR; }
292(?i:rwbuffer)                { return token::HT_RWBUFFER; }
293(?i:rwbyteaddressbuffer)     { return token::HT_RWBYTEADDRESSBUFFER; }
294(?i:rwstructuredbuffer)      { return token::HT_RWSTRUCTUREDBUFFER; }
295(?i:rwtexture1d)             { return token::HT_RWTEXTURE1D; }
296(?i:rwtexture1darray)        { return token::HT_RWTEXTURE1DARRAY; }
297(?i:rwtexture2d)             { return token::HT_RWTEXTURE2D; }
298(?i:rwtexture2darray)        { return token::HT_RWTEXTURE2DARRAY; }
299(?i:rwtexture3d)             { return token::HT_RWTEXTURE3D; }
300(?i:sampler)                 { return token::HT_SAMPLER; }
301(?i:sampler_state)           { return token::HT_SAMPLER_STATE; }
302(?i:samplerstate)            { return token::HT_SAMPLERSTATE; }
303(?i:samplercomparisonstate)  { return token::HT_SAMPLERCOMPARISONSTATE; }
304(?i:shared)                  { return token::HT_SHARED; }
305(?i:snorm)                   { return token::HT_SNORM; }
306(?i:stateblock)              { return token::HT_STATEBLOCK; }
307(?i:stateblock_state)        { return token::HT_STATEBLOCK_STATE; }
308(?i:static)                  { return token::HT_STATIC; }
309(?i:string)                  { return token::HT_STRING; }
310(?i:structuredbuffer)        { return token::HT_STRUCTUREDBUFFER; }
311(?i:tbuffer)                 { return token::HT_TBUFFER; }
312(?i:technique)               { return token::HT_TECHNIQUE; }
313(?i:technique10)             { return token::HT_TECHNIQUE10; }
314(?i:technique11xz)           { return token::HT_TECHNIQUE11XZ; }
315"texture"                    { return token::HT_TEXTURE; }
316(?i:texture1d)               { return token::HT_TEXTURE1D; }
317(?i:texture1darray)          { return token::HT_TEXTURE1DARRAY; }
318(?i:texture2d)               { return token::HT_TEXTURE2D; }
319(?i:texture2darray)          { return token::HT_TEXTURE2DARRAY; }
320(?i:texture2dms)             { return token::HT_TEXTURE2DMS; }
321(?i:texture2dmsarray)        { return token::HT_TEXTURE2DMSARRAY; }
322(?i:texture3d)               { return token::HT_TEXTURE3D; }
323(?i:texturecube)             { return token::HT_TEXTURECUBE; }
324(?i:texturecubearray)        { return token::HT_TEXTURECUBEARRAY; }
325(?i:true)                    { return token::HT_TRUE; }
326(?i:typedef)                 { return token::HT_TYPEDEF; }
327(?i:triangle)                { return token::HT_TRIANGLE; }
328(?i:triangleadj)             { return token::HT_TRIANGLEADJ; }
329(?i:trianglestream)          { return token::HT_TRIANGLESTREAM; }
330(?i:unorm)                   { return token::HT_UNORM; }
331(?i:vector)                  { return token::HT_VECTOR; }
332(?i:vertexfragment)          { return token::HT_VERTEXFRAGMENT; }
333(?i:vertexshader)            { return token::HT_VERTEXSHADER; }
334(?i:volatile)                { return token::HT_VOLATILE; }
335
336 /*
337  * HLSL vector types
338  * TODO: this can probably be factored somehow
339  */
340
341(?i:bool1)                   { return token::HT_BOOL1; }
342(?i:bool1x1)                 { return token::HT_BOOL1x1; }
343(?i:bool2x1)                 { return token::HT_BOOL2x1; }
344(?i:bool3x1)                 { return token::HT_BOOL3x1; }
345(?i:bool4x1)                 { return token::HT_BOOL4x1; }
346(?i:bool2)                   { return token::HT_BOOL2; }
347(?i:bool1x2)                 { return token::HT_BOOL1x2; }
348(?i:bool2x2)                 { return token::HT_BOOL2x2; }
349(?i:bool3x2)                 { return token::HT_BOOL3x2; }
350(?i:bool4x2)                 { return token::HT_BOOL4x2; }
351(?i:bool3)                   { return token::HT_BOOL3; }
352(?i:bool1x3)                 { return token::HT_BOOL1x3; }
353(?i:bool2x3)                 { return token::HT_BOOL2x3; }
354(?i:bool3x3)                 { return token::HT_BOOL3x3; }
355(?i:bool4x3)                 { return token::HT_BOOL4x3; }
356(?i:bool4)                   { return token::HT_BOOL4; }
357(?i:bool1x4)                 { return token::HT_BOOL1x4; }
358(?i:bool2x4)                 { return token::HT_BOOL2x4; }
359(?i:bool3x4)                 { return token::HT_BOOL3x4; }
360(?i:bool4x4)                 { return token::HT_BOOL4x4; }
361
362(?i:float1)                  { return token::HT_FLOAT1; }
363(?i:float1x1)                { return token::HT_FLOAT1x1; }
364(?i:float2x1)                { return token::HT_FLOAT2x1; }
365(?i:float3x1)                { return token::HT_FLOAT3x1; }
366(?i:float4x1)                { return token::HT_FLOAT4x1; }
367(?i:float2)                  { return token::HT_FLOAT2; }
368(?i:float1x2)                { return token::HT_FLOAT1x2; }
369(?i:float2x2)                { return token::HT_FLOAT2x2; }
370(?i:float3x2)                { return token::HT_FLOAT3x2; }
371(?i:float4x2)                { return token::HT_FLOAT4x2; }
372(?i:float3)                  { return token::HT_FLOAT3; }
373(?i:float1x3)                { return token::HT_FLOAT1x3; }
374(?i:float2x3)                { return token::HT_FLOAT2x3; }
375(?i:float3x3)                { return token::HT_FLOAT3x3; }
376(?i:float4x3)                { return token::HT_FLOAT4x3; }
377(?i:float4)                  { return token::HT_FLOAT4; }
378(?i:float1x4)                { return token::HT_FLOAT1x4; }
379(?i:float2x4)                { return token::HT_FLOAT2x4; }
380(?i:float3x4)                { return token::HT_FLOAT3x4; }
381(?i:float4x4)                { return token::HT_FLOAT4x4; }
382
383(?i:double1)                 { return token::HT_DOUBLE1; }
384(?i:double1x1)               { return token::HT_DOUBLE1x1; }
385(?i:double2x1)               { return token::HT_DOUBLE2x1; }
386(?i:double3x1)               { return token::HT_DOUBLE3x1; }
387(?i:double4x1)               { return token::HT_DOUBLE4x1; }
388(?i:double2)                 { return token::HT_DOUBLE2; }
389(?i:double1x2)               { return token::HT_DOUBLE1x2; }
390(?i:double2x2)               { return token::HT_DOUBLE2x2; }
391(?i:double3x2)               { return token::HT_DOUBLE3x2; }
392(?i:double4x2)               { return token::HT_DOUBLE4x2; }
393(?i:double3)                 { return token::HT_DOUBLE3; }
394(?i:double1x3)               { return token::HT_DOUBLE1x3; }
395(?i:double2x3)               { return token::HT_DOUBLE2x3; }
396(?i:double3x3)               { return token::HT_DOUBLE3x3; }
397(?i:double4x3)               { return token::HT_DOUBLE4x3; }
398(?i:double4)                 { return token::HT_DOUBLE4; }
399(?i:double1x4)               { return token::HT_DOUBLE1x4; }
400(?i:double2x4)               { return token::HT_DOUBLE2x4; }
401(?i:double3x4)               { return token::HT_DOUBLE3x4; }
402(?i:double4x4)               { return token::HT_DOUBLE4x4; }
403
404(?i:dword1)                  { return token::HT_DWORD1; }
405(?i:dword1x1)                { return token::HT_DWORD1x1; }
406(?i:dword2x1)                { return token::HT_DWORD2x1; }
407(?i:dword3x1)                { return token::HT_DWORD3x1; }
408(?i:dword4x1)                { return token::HT_DWORD4x1; }
409(?i:dword2)                  { return token::HT_DWORD2; }
410(?i:dword1x2)                { return token::HT_DWORD1x2; }
411(?i:dword2x2)                { return token::HT_DWORD2x2; }
412(?i:dword3x2)                { return token::HT_DWORD3x2; }
413(?i:dword4x2)                { return token::HT_DWORD4x2; }
414(?i:dword3)                  { return token::HT_DWORD3; }
415(?i:dword1x3)                { return token::HT_DWORD1x3; }
416(?i:dword2x3)                { return token::HT_DWORD2x3; }
417(?i:dword3x3)                { return token::HT_DWORD3x3; }
418(?i:dword4x3)                { return token::HT_DWORD4x3; }
419(?i:dword4)                  { return token::HT_DWORD4; }
420(?i:dword1x4)                { return token::HT_DWORD1x4; }
421(?i:dword2x4)                { return token::HT_DWORD2x4; }
422(?i:dword3x4)                { return token::HT_DWORD3x4; }
423(?i:dword4x4)                { return token::HT_DWORD4x4; }
424
425(?i:int1)                    { return token::HT_INT1; }
426(?i:int1x1)                  { return token::HT_INT1x1; }
427(?i:int2x1)                  { return token::HT_INT2x1; }
428(?i:int3x1)                  { return token::HT_INT3x1; }
429(?i:int4x1)                  { return token::HT_INT4x1; }
430(?i:int2)                    { return token::HT_INT2; }
431(?i:int1x2)                  { return token::HT_INT1x2; }
432(?i:int2x2)                  { return token::HT_INT2x2; }
433(?i:int3x2)                  { return token::HT_INT3x2; }
434(?i:int4x2)                  { return token::HT_INT4x2; }
435(?i:int3)                    { return token::HT_INT3; }
436(?i:int1x3)                  { return token::HT_INT1x3; }
437(?i:int2x3)                  { return token::HT_INT2x3; }
438(?i:int3x3)                  { return token::HT_INT3x3; }
439(?i:int4x3)                  { return token::HT_INT4x3; }
440(?i:int4)                    { return token::HT_INT4; }
441(?i:int1x4)                  { return token::HT_INT1x4; }
442(?i:int2x4)                  { return token::HT_INT2x4; }
443(?i:int3x4)                  { return token::HT_INT3x4; }
444(?i:int4x4)                  { return token::HT_INT4x4; }
445
446(?i:uint1)                   { return token::HT_UINT1; }
447(?i:uint1x1)                 { return token::HT_UINT1x1; }
448(?i:uint2x1)                 { return token::HT_UINT2x1; }
449(?i:uint3x1)                 { return token::HT_UINT3x1; }
450(?i:uint4x1)                 { return token::HT_UINT4x1; }
451(?i:uint2)                   { return token::HT_UINT2; }
452(?i:uint1x2)                 { return token::HT_UINT1x2; }
453(?i:uint2x2)                 { return token::HT_UINT2x2; }
454(?i:uint3x2)                 { return token::HT_UINT3x2; }
455(?i:uint4x2)                 { return token::HT_UINT4x2; }
456(?i:uint3)                   { return token::HT_UINT3; }
457(?i:uint1x3)                 { return token::HT_UINT1x3; }
458(?i:uint2x3)                 { return token::HT_UINT2x3; }
459(?i:uint3x3)                 { return token::HT_UINT3x3; }
460(?i:uint4x3)                 { return token::HT_UINT4x3; }
461(?i:uint4)                   { return token::HT_UINT4; }
462(?i:uint1x4)                 { return token::HT_UINT1x4; }
463(?i:uint2x4)                 { return token::HT_UINT2x4; }
464(?i:uint3x4)                 { return token::HT_UINT3x4; }
465(?i:uint4x4)                 { return token::HT_UINT4x4; }
466
467 /*
468  * HLSL preprocessor directives
469  * Gathered from http://msdn.microsoft.com/en-us/library/windows/desktop/bb943993%28v=vs.85%29.aspx
470  */
471
472"#"[ \t]*"define"            { return token::PREPROCESSOR_DEFINE; }
473"#"[ \t]*"elif"              { return token::PREPROCESSOR_ELIF; }
474"#"[ \t]*"else"              { return token::PREPROCESSOR_ELSE; }
475"#"[ \t]*"endif"             { return token::PREPROCESSOR_ENDIF; }
476"#"[ \t]*"error"             { return token::PREPROCESSOR_ERROR; }
477"#"[ \t]*"if"                { return token::PREPROCESSOR_IF; }
478"#"[ \t]*"ifdef"             { return token::PREPROCESSOR_IFDEF; }
479"#"[ \t]*"ifndef"            { return token::PREPROCESSOR_IFNDEF; }
480"#"[ \t]*"include"           { return token::PREPROCESSOR_INCLUDE; }
481"#"[ \t]*"line"              { return token::PREPROCESSOR_LINE; }
482"#"[ \t]*"pragma"            { return token::PREPROCESSOR_PRAGMA; }
483"#"[ \t]*"undef"             { return token::PREPROCESSOR_UNDEF; }
484
485 /*
486  * GLSL preprocessor directives
487  */
488
489"#"[ \t]*"version".*         { /* ignore for now */ }
490
491 /*
492  * LolFx preprocessor directives
493  */
494
495"#"[ \t]*(?i:pragma)[ \t]*(?i:lolfx) { return token::PRAGMA_LOLFX; }
496
497 /*
498  * HLSL reserved keywords
499  * Gathered from http://msdn.microsoft.com/en-us/library/windows/desktop/bb509569%28v=vs.85%29.aspx
500  */
501
502(?i:auto)                    { return token::HT_AUTO; }
503(?i:catch)                   { return token::HT_CATCH; }
504(?i:char)                    { return token::HT_CHAR; }
505(?i:class)                   { return token::HT_CLASS; }
506(?i:const_cast)              { return token::HT_CONST_CAST; }
507(?i:delete)                  { return token::HT_DELETE; }
508(?i:dynamic_cast)            { return token::HT_DYNAMIC_CAST; }
509(?i:enum)                    { return token::HT_ENUM; }
510(?i:explicit)                { return token::HT_EXPLICIT; }
511(?i:friend)                  { return token::HT_FRIEND; }
512(?i:goto)                    { return token::HT_GOTO; }
513(?i:long)                    { return token::HT_LONG; }
514(?i:mutable)                 { return token::HT_MUTABLE; }
515(?i:new)                     { return token::HT_NEW; }
516(?i:operator)                { return token::HT_OPERATOR; }
517(?i:private)                 { return token::HT_PRIVATE; }
518(?i:protected)               { return token::HT_PROTECTED; }
519(?i:public)                  { return token::HT_PUBLIC; }
520(?i:reinterpret_cast)        { return token::HT_REINTERPRET_CAST; }
521(?i:short)                   { return token::HT_SHORT; }
522(?i:signed)                  { return token::HT_SIGNED; }
523(?i:sizeof)                  { return token::HT_SIZEOF; }
524(?i:static_cast)             { return token::HT_STATIC_CAST; }
525(?i:template)                { return token::HT_TEMPLATE; }
526(?i:this)                    { return token::HT_THIS; }
527(?i:throw)                   { return token::HT_THROW; }
528(?i:try)                     { return token::HT_TRY; }
529(?i:typename)                { return token::HT_TYPENAME; }
530(?i:union)                   { return token::HT_UNION; }
531(?i:unsigned)                { return token::HT_UNSIGNED; }
532(?i:using)                   { return token::HT_USING; }
533(?i:virtual)                 { return token::HT_VIRTUAL; }
534
535 /*
536  * Various tokens
537  */
538
539"++"                    { return token::T_INC; }
540"--"                    { return token::T_DEC; }
541"<="                    { return token::T_LE; }
542">="                    { return token::T_GE; }
543"=="                    { return token::T_EQ; }
544"!="                    { return token::T_NE; }
545"<<"                    { return token::T_LEFT; }
546">>"                    { return token::T_RIGHT; }
547"&&"                    { return token::T_AND; }
548"||"                    { return token::T_OR; }
549"^^"                    { return token::T_XOR; }
550
551"*="                    { return token::T_MULEQ; }
552"/="                    { return token::T_DIVEQ; }
553"%="                    { return token::T_MODEQ; }
554"+="                    { return token::T_ADDEQ; }
555"-="                    { return token::T_SUBEQ; }
556"<<="                   { return token::T_LEFTEQ; }
557">>="                   { return token::T_RIGHTEQ; }
558"&="                    { return token::T_ANDEQ; }
559"^="                    { return token::T_XOREQ; }
560"|="                    { return token::T_OREQ; }
561
562(0|[1-9][0-9]*)\.[0-9]+ {
563    yylval->fval = std::atof(yytext);
564    return token::FLOATCONSTANT;
565}
566(0|[1-9][0-9]*)[uU]     {
567    yylval->uval = std::atoi(yytext);
568    return token::UINTCONSTANT;
569}
570(0|[1-9][0-9]*)         {
571    yylval->ival = std::atoi(yytext);
572    return token::INTCONSTANT;
573}
574
575[a-zA-Z][a-zA-Z0-9_]*   {
576    /* Copy token for now */
577    yylval->sval = strdup(yytext);
578    return token::IDENTIFIER;
579}
580
581[ \t]+              { /* ignore whitespace */ }
582[\n]                { ++yylineno; }
583.                   { return token::T_ERROR; }
584
585 /*
586  * Ignore C comments
587  */
588
589"/*"                { BEGIN(C_COMMENT); }
590<C_COMMENT>"*/"     { BEGIN(INITIAL); }
591<C_COMMENT>[^*\n]*  { }
592<C_COMMENT>\n       { ++yylineno; }
593<C_COMMENT>.        { }
594
595 /*
596  * Ignore C++ comments
597  */
598
599"//"              { BEGIN(CPP_COMMENT); }
600<CPP_COMMENT>\n   { ++yylineno; BEGIN(INITIAL); }
601<CPP_COMMENT>.*   { }
602
603%%
604
605lol::LolFxScanner::LolFxScanner(char const *command)
606    : LolFxFlexLexer(0, 0),
607      m_input(command)
608{
609}
610
611lol::LolFxScanner::~LolFxScanner()
612{
613}
614
615int lol::LolFxScanner::LexerInput(char* buf, int max_size)
616{
617    buf[0] = m_input[0];
618    if (buf[0])
619        ++m_input;
620    return buf[0] ? 1 : 0;
621}
622
623#ifdef yylex
624#undef yylex
625#endif
626int LolFxFlexLexer::yylex()
627{
628    std::cerr << "in LolFxFlexLexer::yylex() !" << std::endl;
629    return 0;
630}
631
632int LolFxFlexLexer::yywrap()
633{
634    return 1;
635}
636
Note: See TracBrowser for help on using the repository browser.