BsLexerFX.l 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. %{
  2. #include "BsParserFX.h"
  3. #define YY_USER_ACTION yylloc->first_column = yycolumn + 1; yylloc->first_line = yylineno + 1; yycolumn += (int)yyleng; yylloc->filename = getCurrentFilename(yyextra);
  4. #define YY_USER_INIT yylineno = 0; yycolumn = 0;
  5. %}
  6. %option yylineno reentrant noyywrap nounistd never-interactive warn nodefault bison-bridge bison-locations
  7. %option outfile="BsLexerFX.c" header-file="BsLexerFX.h"
  8. %option extra-type="struct tagParseState *"
  9. INTEGER -?[0-9][0-9]*
  10. INTEGER_16 0[xX][0-9a-fA-F]+
  11. FLOAT [0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]?
  12. STRING \"[^"\n]*\"
  13. IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
  14. WS [ \r\n\t]*
  15. SINGLEWS [ \r\n\t]
  16. COMMENT \/\/[^\n]*
  17. /* Start conditions */
  18. %x INCLUDE
  19. %x CODEBLOCK_HEADER
  20. %x CODEBLOCK_EQUALS
  21. %x CODEBLOCK
  22. %x CODEBLOCK_END
  23. %x DEFINE_COND
  24. %x UNDEF_COND
  25. %x CONDITIONAL_IF
  26. %x CONDITIONAL_IFN
  27. %x CONDITIONAL_ELIF
  28. %x CONDITIONAL_IGNORE
  29. %%
  30. {WS} { /* Skip blank */ }
  31. {INTEGER} { yylval->intValue = atoi(yytext); return TOKEN_INTEGER; }
  32. {INTEGER_16} { yylval->intValue = (int)strtol(yytext, 0, 0); return TOKEN_INTEGER; }
  33. {FLOAT} { yylval->floatValue = (float)atof(yytext); return TOKEN_FLOAT; }
  34. {STRING} { yylval->strValue = mmalloc_strdup(yyextra->memContext, yytext); return TOKEN_STRING; }
  35. true { yylval->intValue = 1; return TOKEN_BOOLEAN; }
  36. false { yylval->intValue = 0; return TOKEN_BOOLEAN; }
  37. /* Value types */
  38. int { yylval->intValue = PT_Int; return TOKEN_INTTYPE; }
  39. int2 { yylval->intValue = PT_Int2; return TOKEN_INT2TYPE; }
  40. int3 { yylval->intValue = PT_Int3; return TOKEN_INT3TYPE; }
  41. int4 { yylval->intValue = PT_Int4; return TOKEN_INT4TYPE; }
  42. float { yylval->intValue = PT_Float; return TOKEN_FLOATTYPE; }
  43. float2 { yylval->intValue = PT_Float2; return TOKEN_FLOAT2TYPE; }
  44. float3 { yylval->intValue = PT_Float3; return TOKEN_FLOAT3TYPE; }
  45. float4 { yylval->intValue = PT_Float4; return TOKEN_FLOAT4TYPE; }
  46. color { yylval->intValue = PT_Color; return TOKEN_COLORTYPE; }
  47. mat2x2 { yylval->intValue = PT_Mat2x2; return TOKEN_MAT2x2TYPE; }
  48. mat2x3 { yylval->intValue = PT_Mat2x3; return TOKEN_MAT2x3TYPE; }
  49. mat2x4 { yylval->intValue = PT_Mat2x4; return TOKEN_MAT2x4TYPE; }
  50. mat3x2 { yylval->intValue = PT_Mat3x2; return TOKEN_MAT3x2TYPE; }
  51. mat3x3 { yylval->intValue = PT_Mat3x3; return TOKEN_MAT3x3TYPE; }
  52. mat3x4 { yylval->intValue = PT_Mat3x4; return TOKEN_MAT3x4TYPE; }
  53. mat4x2 { yylval->intValue = PT_Mat4x2; return TOKEN_MAT4x2TYPE; }
  54. mat4x3 { yylval->intValue = PT_Mat4x3; return TOKEN_MAT4x3TYPE; }
  55. mat4x4 { yylval->intValue = PT_Mat4x4; return TOKEN_MAT4x4TYPE; }
  56. Sampler1D { yylval->intValue = PT_Sampler1D; return TOKEN_SAMPLER1D; }
  57. Sampler2D { yylval->intValue = PT_Sampler2D; return TOKEN_SAMPLER2D; }
  58. Sampler3D { yylval->intValue = PT_Sampler3D; return TOKEN_SAMPLER3D; }
  59. SamplerCUBE { yylval->intValue = PT_SamplerCUBE; return TOKEN_SAMPLERCUBE; }
  60. Sampler2DMS { yylval->intValue = PT_Sampler2DMS; return TOKEN_SAMPLER2DMS; }
  61. Texture1D { yylval->intValue = PT_Texture1D; return TOKEN_TEXTURE1D; }
  62. Texture2D { yylval->intValue = PT_Texture2D; return TOKEN_TEXTURE2D; }
  63. Texture3D { yylval->intValue = PT_Texture3D; return TOKEN_TEXTURE3D; }
  64. TextureCUBE { yylval->intValue = PT_TextureCUBE; return TOKEN_TEXTURECUBE; }
  65. Texture2DMS { yylval->intValue = PT_Texture2DMS; return TOKEN_TEXTURE2DMS; }
  66. ByteBuffer { yylval->intValue = PT_ByteBuffer; return TOKEN_BYTEBUFFER; }
  67. StructBuffer { yylval->intValue = PT_StructBuffer; return TOKEN_STRUCTBUFFER; }
  68. TypedBufferRW { yylval->intValue = PT_TypedBufferRW; return TOKEN_RWTYPEDBUFFER; }
  69. ByteBufferRW { yylval->intValue = PT_ByteBufferRW; return TOKEN_RWBYTEBUFFER; }
  70. StructBufferRW { yylval->intValue = PT_StructBufferRW; return TOKEN_RWSTRUCTBUFFER; }
  71. AppendBuffer { yylval->intValue = PT_AppendBuffer; return TOKEN_RWAPPENDBUFFER; }
  72. ConsumeBuffer { yylval->intValue = PT_ConsumeBuffer; return TOKEN_RWCONSUMEBUFFER; }
  73. Block { return TOKEN_PARAMSBLOCK; }
  74. /* Shader keywords */
  75. Separable { return TOKEN_SEPARABLE; }
  76. Queue { return TOKEN_QUEUE; }
  77. Priority { return TOKEN_PRIORITY; }
  78. Transparent { return TOKEN_TRANSPARENT; }
  79. Technique { return TOKEN_TECHNIQUE; }
  80. Parameters { return TOKEN_PARAMETERS; }
  81. Blocks { return TOKEN_BLOCKS; }
  82. /* Technique keywords */
  83. Renderer { return TOKEN_RENDERER; }
  84. Language { return TOKEN_LANGUAGE; }
  85. Pass { return TOKEN_PASS; }
  86. /* Pass keywords */
  87. StencilRef { return TOKEN_STENCILREF; }
  88. /* Rasterizer state keywords */
  89. Fill { return TOKEN_FILLMODE; }
  90. Cull { return TOKEN_CULLMODE; }
  91. DepthBias { return TOKEN_DEPTHBIAS; }
  92. ScaledDepthBias { return TOKEN_SDEPTHBIAS; }
  93. DepthClip { return TOKEN_DEPTHCLIP; }
  94. Scissor { return TOKEN_SCISSOR; }
  95. Multisample { return TOKEN_MULTISAMPLE; }
  96. AALine { return TOKEN_AALINE; }
  97. /* Depth-stencil state keywords */
  98. DepthRead { return TOKEN_DEPTHREAD; }
  99. DepthWrite { return TOKEN_DEPTHWRITE; }
  100. CompareFunc { return TOKEN_COMPAREFUNC; }
  101. Stencil { return TOKEN_STENCIL; }
  102. StencilReadMask { return TOKEN_STENCILREADMASK; }
  103. StencilWriteMask { return TOKEN_STENCILWRITEMASK; }
  104. StencilOpFront { return TOKEN_STENCILOPFRONT; }
  105. StencilOpBack { return TOKEN_STENCILOPBACK; }
  106. Fail { return TOKEN_FAIL; }
  107. ZFail { return TOKEN_ZFAIL; }
  108. /* Blend state keywords */
  109. AlphaToCoverage { return TOKEN_ALPHATOCOVERAGE; }
  110. IndependantBlend { return TOKEN_INDEPENDANTBLEND; }
  111. Target { return TOKEN_TARGET; }
  112. Index { return TOKEN_INDEX; }
  113. Blend { return TOKEN_BLEND; }
  114. Color { return TOKEN_COLOR; }
  115. Alpha { return TOKEN_ALPHA; }
  116. WriteMask { return TOKEN_WRITEMASK; }
  117. Source { return TOKEN_SOURCE; }
  118. Dest { return TOKEN_DEST; }
  119. Op { return TOKEN_OP; }
  120. /* Sampler state keywords */
  121. AddressMode { return TOKEN_ADDRMODE; }
  122. MinFilter { return TOKEN_MINFILTER; }
  123. MagFilter { return TOKEN_MAGFILTER; }
  124. MipFilter { return TOKEN_MIPFILTER; }
  125. MaxAniso { return TOKEN_MAXANISO; }
  126. MipmapBias { return TOKEN_MIPBIAS; }
  127. MipMin { return TOKEN_MIPMIN; }
  128. MipMax { return TOKEN_MIPMAX; }
  129. BorderColor { return TOKEN_BORDERCOLOR; }
  130. U { return TOKEN_U; }
  131. V { return TOKEN_V; }
  132. W { return TOKEN_W; }
  133. /* Qualifiers */
  134. auto { return TOKEN_AUTO; }
  135. alias { return TOKEN_ALIAS; }
  136. shared { return TOKEN_SHARED; }
  137. usage { return TOKEN_USAGE; }
  138. /* State values */
  139. WIRE { yylval->intValue = FMV_Wire; return TOKEN_FILLMODEVALUE; }
  140. SOLID { yylval->intValue = FMV_Solid; return TOKEN_FILLMODEVALUE; }
  141. NOCULL { yylval->intValue = CMV_None; return TOKEN_CULLMODEVALUE; }
  142. CW { yylval->intValue = CMV_CW; return TOKEN_CULLMODEVALUE; }
  143. CCW { yylval->intValue = CMV_CCW; return TOKEN_CULLMODEVALUE; }
  144. FAIL { yylval->intValue = CFV_Fail; return TOKEN_COMPFUNCVALUE; }
  145. PASS { yylval->intValue = CFV_Pass; return TOKEN_COMPFUNCVALUE; }
  146. LT { yylval->intValue = CFV_LT; return TOKEN_COMPFUNCVALUE; }
  147. LTE { yylval->intValue = CFV_LTE; return TOKEN_COMPFUNCVALUE; }
  148. EQ { yylval->intValue = CFV_EQ; return TOKEN_COMPFUNCVALUE; }
  149. NEQ { yylval->intValue = CFV_NEQ; return TOKEN_COMPFUNCVALUE; }
  150. GTE { yylval->intValue = CFV_GTE; return TOKEN_COMPFUNCVALUE; }
  151. GT { yylval->intValue = CFV_GT; return TOKEN_COMPFUNCVALUE; }
  152. KEEP { yylval->intValue = OV_Keep; return TOKEN_OPVALUE; }
  153. ZERO { yylval->intValue = OV_Zero; return TOKEN_OPVALUE; }
  154. REPLACE { yylval->intValue = OV_Replace; return TOKEN_OPVALUE; }
  155. INC { yylval->intValue = OV_Incr; return TOKEN_OPVALUE; }
  156. DEC { yylval->intValue = OV_Decr; return TOKEN_OPVALUE; }
  157. INCWRAP { yylval->intValue = OV_IncrWrap; return TOKEN_OPVALUE; }
  158. DECWRAP { yylval->intValue = OV_DecrWrap; return TOKEN_OPVALUE; }
  159. INV { yylval->intValue = OV_Invert; return TOKEN_OPVALUE; }
  160. ONE { yylval->intValue = OV_One; return TOKEN_OPVALUE; }
  161. DSTRGB { yylval->intValue = OV_DestColor; return TOKEN_OPVALUE; }
  162. SRCRGB { yylval->intValue = OV_SrcColor; return TOKEN_OPVALUE; }
  163. DSTIRGB { yylval->intValue = OV_InvDestColor; return TOKEN_OPVALUE; }
  164. SRCIRGB { yylval->intValue = OV_InvSrcColor; return TOKEN_OPVALUE; }
  165. DSTA { yylval->intValue = OV_DestAlpha; return TOKEN_OPVALUE; }
  166. SRCA { yylval->intValue = OV_SrcAlpha; return TOKEN_OPVALUE; }
  167. DSTIA { yylval->intValue = OV_InvDestAlpha; return TOKEN_OPVALUE; }
  168. SRCIA { yylval->intValue = OV_InvSrcAlpha; return TOKEN_OPVALUE; }
  169. ADD { yylval->intValue = BOV_Add; return TOKEN_BLENDOPVALUE; }
  170. SUB { yylval->intValue = BOV_Subtract; return TOKEN_BLENDOPVALUE; }
  171. RSUB { yylval->intValue = BOV_RevSubtract; return TOKEN_BLENDOPVALUE; }
  172. MIN { yylval->intValue = BOV_Min; return TOKEN_BLENDOPVALUE; }
  173. MAX { yylval->intValue = BOV_Max; return TOKEN_BLENDOPVALUE; }
  174. NOCOLOR { yylval->intValue = 0x0; return TOKEN_COLORMASK; }
  175. R { yylval->intValue = 0x1; return TOKEN_COLORMASK; }
  176. G { yylval->intValue = 0x2; return TOKEN_COLORMASK; }
  177. B { yylval->intValue = 0x4; return TOKEN_COLORMASK; }
  178. A { yylval->intValue = 0x8; return TOKEN_COLORMASK; }
  179. RG { yylval->intValue = 0x3; return TOKEN_COLORMASK; }
  180. RB { yylval->intValue = 0x5; return TOKEN_COLORMASK; }
  181. RA { yylval->intValue = 0x9; return TOKEN_COLORMASK; }
  182. GB { yylval->intValue = 0x6; return TOKEN_COLORMASK; }
  183. GA { yylval->intValue = 0xA; return TOKEN_COLORMASK; }
  184. BA { yylval->intValue = 0xC; return TOKEN_COLORMASK; }
  185. RGB { yylval->intValue = 0x7; return TOKEN_COLORMASK; }
  186. RGA { yylval->intValue = 0xB; return TOKEN_COLORMASK; }
  187. RBA { yylval->intValue = 0xD; return TOKEN_COLORMASK; }
  188. GBA { yylval->intValue = 0xE; return TOKEN_COLORMASK; }
  189. RGBA { yylval->intValue = 0xF; return TOKEN_COLORMASK; }
  190. WRAP { yylval->intValue = AMV_Wrap; return TOKEN_ADDRMODEVALUE; }
  191. MIRROR { yylval->intValue = AMV_Mirror; return TOKEN_ADDRMODEVALUE; }
  192. CLAMP { yylval->intValue = AMV_Clamp; return TOKEN_ADDRMODEVALUE; }
  193. BORDER { yylval->intValue = AMV_Border; return TOKEN_ADDRMODEVALUE; }
  194. NOFILTER { yylval->intValue = FV_None; return TOKEN_FILTERVALUE; }
  195. POINT { yylval->intValue = FV_Point; return TOKEN_FILTERVALUE; }
  196. LINEAR { yylval->intValue = FV_Linear; return TOKEN_FILTERVALUE; }
  197. ANISO { yylval->intValue = FV_Anisotropic; return TOKEN_FILTERVALUE; }
  198. POINTC { yylval->intValue = FV_PointCmp; return TOKEN_FILTERVALUE; }
  199. LINEARC { yylval->intValue = FV_LinearCmp; return TOKEN_FILTERVALUE; }
  200. ANISOC { yylval->intValue = FV_AnisotropicCmp; return TOKEN_FILTERVALUE; }
  201. STATIC { yylval->intValue = BUV_Static; return TOKEN_BUFFERUSAGE; }
  202. DYNAMIC { yylval->intValue = BUV_Dynamic; return TOKEN_BUFFERUSAGE; }
  203. /* Preprocessor */
  204. #include { BEGIN(INCLUDE); }
  205. <INCLUDE>{WS} { /* Skip blank */ }
  206. <INCLUDE>{STRING} {
  207. int size = 0;
  208. char* includeBuffer = includePush(yyextra, yytext, yylineno, yycolumn, &size);
  209. if(!includeBuffer)
  210. yyterminate();
  211. YY_BUFFER_STATE currentBuffer = YY_CURRENT_BUFFER;
  212. YY_BUFFER_STATE newBuffer = yy_scan_buffer(includeBuffer, size, yyscanner);
  213. yy_switch_to_buffer(currentBuffer, yyscanner);
  214. yypush_buffer_state(newBuffer, yyscanner);
  215. yylineno = 0;
  216. yycolumn = 0;
  217. BEGIN(INITIAL);
  218. }
  219. <INCLUDE>. { return yytext[0]; }
  220. <<EOF>> {
  221. if(!yyextra->includeStack)
  222. yyterminate();
  223. yypop_buffer_state(yyscanner);
  224. includePop(yyextra);
  225. }
  226. #define { BEGIN(DEFINE_COND); }
  227. <DEFINE_COND>{WS} { /* Skip blank */ }
  228. <DEFINE_COND>{IDENTIFIER} { addDefine(yyextra, yytext); BEGIN(INITIAL); }
  229. <DEFINE_COND>. { return yytext[0]; }
  230. #undef { BEGIN(UNDEF_COND); }
  231. <UNDEF_COND>{WS} { /* Skip blank */ }
  232. <UNDEF_COND>{IDENTIFIER} { removeDefine(yyextra, yytext); BEGIN(INITIAL); }
  233. <UNDEF_COND>. { return yytext[0]; }
  234. #ifdef { BEGIN(CONDITIONAL_IF); }
  235. <CONDITIONAL_IF>{WS} { /* Skip blank */ }
  236. <CONDITIONAL_IF>{IDENTIFIER} {
  237. int isEnabled = pushConditional(yyextra, hasDefine(yyextra, yytext));
  238. if(!isEnabled)
  239. BEGIN(CONDITIONAL_IGNORE);
  240. else
  241. BEGIN(INITIAL);
  242. }
  243. <CONDITIONAL_IF>. { return yytext[0]; }
  244. #ifndef { BEGIN(CONDITIONAL_IFN); }
  245. <CONDITIONAL_IFN>{WS} { /* Skip blank */ }
  246. <CONDITIONAL_IFN>{IDENTIFIER} {
  247. int isEnabled = pushConditional(yyextra, !hasDefine(yyextra, yytext));
  248. if(!isEnabled)
  249. BEGIN(CONDITIONAL_IGNORE);
  250. else
  251. BEGIN(INITIAL);
  252. }
  253. <CONDITIONAL_IFN>. { return yytext[0]; }
  254. #else { BEGIN(CONDITIONAL_IGNORE); }
  255. #elif { BEGIN(CONDITIONAL_IGNORE); }
  256. #endif { popConditional(yyextra); }
  257. <CONDITIONAL_IGNORE>{WS} { /* Skip */ }
  258. <CONDITIONAL_IGNORE>#ifdef { pushConditional(yyextra, 0); }
  259. <CONDITIONAL_IGNORE>#ifndef { pushConditional(yyextra, 0); }
  260. <CONDITIONAL_IGNORE>#else {
  261. if(switchConditional(yyextra))
  262. BEGIN(INITIAL);
  263. }
  264. <CONDITIONAL_IGNORE>#elif { BEGIN(CONDITIONAL_ELIF); }
  265. <CONDITIONAL_IGNORE>#endif {
  266. if(popConditional(yyextra))
  267. BEGIN(INITIAL);
  268. }
  269. <CONDITIONAL_IGNORE>. { /* Skip */ }
  270. <CONDITIONAL_ELIF>{WS} { /* Skip blank */ }
  271. <CONDITIONAL_ELIF>{IDENTIFIER} {
  272. int isEnabled = setConditional(yyextra, hasDefine(yyextra, yytext));
  273. if(!isEnabled)
  274. BEGIN(CONDITIONAL_IGNORE);
  275. else
  276. BEGIN(INITIAL);
  277. }
  278. <CONDITIONAL_ELIF>. { return yytext[0]; }
  279. /* Code blocks */
  280. Vertex { BEGIN(CODEBLOCK_HEADER); return TOKEN_VERTEX; }
  281. Fragment { BEGIN(CODEBLOCK_HEADER); return TOKEN_FRAGMENT; }
  282. Geometry { BEGIN(CODEBLOCK_HEADER); return TOKEN_GEOMETRY; }
  283. Hull { BEGIN(CODEBLOCK_HEADER); return TOKEN_HULL; }
  284. Domain { BEGIN(CODEBLOCK_HEADER); return TOKEN_DOMAIN; }
  285. Compute { BEGIN(CODEBLOCK_HEADER); return TOKEN_COMPUTE; }
  286. Common { BEGIN(CODEBLOCK_HEADER); return TOKEN_COMMON; }
  287. /* Track when the code block begins, insert all code block characters into our own buffer, record a sequential index */
  288. /* of all code blocks in the text, and track bracket open/closed state so we know when we're done with the code block. */
  289. /* And finally output a sequential code block index to the parser (it shouldn't be aware of anything else in the block). */
  290. <CODEBLOCK_HEADER>= { BEGIN(CODEBLOCK_EQUALS); return yytext[0]; }
  291. <CODEBLOCK_HEADER>{WS} { /* Skip blank */ }
  292. <CODEBLOCK_HEADER>. { return yytext[0]; }
  293. <CODEBLOCK_EQUALS>\{ { BEGIN(CODEBLOCK); beginCodeBlock(yyextra); yyextra->numOpenBrackets = 1; return yytext[0]; }
  294. <CODEBLOCK_EQUALS>{WS} { /* Skip blank */ }
  295. <CODEBLOCK_EQUALS>. { return yytext[0]; }
  296. <CODEBLOCK>\{ { yyextra->numOpenBrackets++; appendCodeBlock(yyextra, yytext, 1); }
  297. <CODEBLOCK>\} {
  298. yyextra->numOpenBrackets--;
  299. if(yyextra->numOpenBrackets == 0)
  300. {
  301. BEGIN(CODEBLOCK_END);
  302. unput('0');
  303. }
  304. else
  305. appendCodeBlock(yyextra, yytext, 1);
  306. }
  307. <CODEBLOCK>.|{SINGLEWS} { appendCodeBlock(yyextra, yytext, 1); }
  308. /* Logic for manually inserting "Index = codeBlockIndex;". We insert arbitrary numbers which allows us to sequentially */
  309. /* output all the tokens we need. We use only single-character values so we don't override anything in the text buffer */
  310. /* (since the starting value was also a single character "{"). */
  311. <CODEBLOCK_END>0 { unput('1'); return TOKEN_INDEX; }
  312. <CODEBLOCK_END>1 { unput('2'); return '='; }
  313. <CODEBLOCK_END>2 { yylval->intValue = getCodeBlockIndex(yyextra); unput('3'); return TOKEN_INTEGER; }
  314. <CODEBLOCK_END>3 { unput('4'); return ';'; }
  315. <CODEBLOCK_END>4 { BEGIN(INITIAL); return '}'; }
  316. <CODEBLOCK_END>.|{WS} { /* Never reached */ }
  317. /* Catch all rules */
  318. {COMMENT} { }
  319. {IDENTIFIER} { yylval->strValue = mmalloc_strdup(yyextra->memContext, yytext); return TOKEN_IDENTIFIER; }
  320. . { return yytext[0]; }
  321. %%