Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

797 строки
32 KiB

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