Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

843 lignes
21 KiB

  1. %{
  2. #include <cstdio>
  3. #include <iostream>
  4. extern "C" int yylex();
  5. extern "C" int yyparse();
  6. extern "C" FILE *yyin;
  7. extern "C" int yylineno;
  8. void yyerror(const char *s);
  9. %}
  10. /* The classic Bison union trick */
  11. %union
  12. {
  13. int ival;
  14. unsigned uval;
  15. float fval;
  16. char *sval;
  17. }
  18. %type <sval> lolfx_shader_name
  19. /*
  20. * GLSL and HLSL generic tokens
  21. */
  22. %token <ival> BOOLCONSTANT
  23. %token <ival> INTCONSTANT
  24. %token <uval> UINTCONSTANT
  25. %token <fval> FLOATCONSTANT
  26. %token /* TODO */ FIELDSELECTION
  27. %token <sval> IDENTIFIER
  28. %token <sval> TYPENAME
  29. /*
  30. * GLSL keywords
  31. * FIXME: unsorted
  32. */
  33. %token GT_SUBROUTINE GT_PATCH GT_SAMPLE GT_FLAT GT_SMOOTH GT_LAYOUT
  34. %token GT_INVARIANT GT_HIGHP GT_MEDIUMP GT_LOWP GT_PRECISION
  35. /*
  36. * GLSL types
  37. */
  38. %token GT_VEC2 GT_VEC3 GT_VEC4
  39. %token GT_BVEC2 GT_BVEC3 GT_BVEC4
  40. %token GT_DVEC2 GT_DVEC3 GT_DVEC4
  41. %token GT_IVEC2 GT_IVEC3 GT_IVEC4
  42. %token GT_UVEC2 GT_UVEC3 GT_UVEC4
  43. %token GT_MAT2 GT_MAT2X2 GT_MAT2X3 GT_MAT2X4
  44. %token GT_MAT3 GT_MAT3X2 GT_MAT3X3 GT_MAT3X4
  45. %token GT_MAT4 GT_MAT4X2 GT_MAT4X3 GT_MAT4X4
  46. %token GT_DMAT2 GT_DMAT2X2 GT_DMAT2X3 GT_DMAT2X4
  47. %token GT_DMAT3 GT_DMAT3X2 GT_DMAT3X3 GT_DMAT3X4
  48. %token GT_DMAT4 GT_DMAT4X2 GT_DMAT4X3 GT_DMAT4X4
  49. %token GT_SAMPLER1DSHADOW GT_SAMPLER1DARRAY GT_SAMPLER1DARRAYSHADOW
  50. %token GT_SAMPLER2DSHADOW GT_SAMPLER2DARRAY GT_SAMPLER2DARRAYSHADOW
  51. %token GT_SAMPLER2DRECT GT_SAMPLER2DRECTSHADOW
  52. %token GT_SAMPLER2DMS GT_SAMPLER2DMSARRAY
  53. %token GT_SAMPLERCUBESHADOW GT_SAMPLERCUBEARRAY GT_SAMPLERCUBEARRAYSHADOW
  54. %token GT_SAMPLERBUFFER
  55. %token GT_ISAMPLER1D GT_ISAMPLER1DARRAY
  56. %token GT_ISAMPLER2D GT_ISAMPLER2DARRAY
  57. %token GT_ISAMPLER2DRECT
  58. %token GT_ISAMPLER2DMS GT_ISAMPLER2DMSARRAY
  59. %token GT_ISAMPLER3D
  60. %token GT_ISAMPLERCUBE GT_ISAMPLERCUBEARRAY
  61. %token GT_ISAMPLERBUFFER
  62. %token GT_USAMPLER1D GT_USAMPLER1DARRAY
  63. %token GT_USAMPLER2D GT_USAMPLER2DARRAY
  64. %token GT_USAMPLER2DRECT
  65. %token GT_USAMPLER2DMS GT_USAMPLER2DMSARRAY
  66. %token GT_USAMPLER3D
  67. %token GT_USAMPLERCUBE GT_USAMPLERCUBEARRAY
  68. %token GT_USAMPLERBUFFER
  69. /*
  70. * HLSL and GLSL keywords
  71. */
  72. %token GHT_BOOL GHT_BREAK GHT_CASE GHT_CENTROID GHT_CONST GHT_CONTINUE
  73. %token GHT_DEFAULT GHT_DISCARD GHT_DO GHT_DOUBLE GHT_ELSE GHT_FLOAT GHT_FOR
  74. %token GHT_IF GHT_IN GHT_INOUT GHT_INT GHT_NOPERSPECTIVE GHT_OUT GHT_RETURN
  75. %token GHT_SAMPLER1D GHT_SAMPLER2D GHT_SAMPLER3D GHT_SAMPLERCUBE GHT_STRUCT
  76. %token GHT_SWITCH GHT_UINT GHT_UNIFORM GHT_VOID GHT_WHILE
  77. %token HGT_BOOL HGT_BREAK HGT_CASE HGT_CENTROID HGT_CONST HGT_CONTINUE
  78. %token HGT_DEFAULT HGT_DISCARD HGT_DO HGT_DOUBLE HGT_ELSE HGT_FLOAT HGT_FOR
  79. %token HGT_IF HGT_IN HGT_INOUT HGT_INT HGT_NOPERSPECTIVE HGT_OUT HGT_RETURN
  80. %token HGT_SAMPLER1D HGT_SAMPLER2D HGT_SAMPLER3D HGT_SAMPLERCUBE HGT_STRUCT
  81. %token HGT_SWITCH HGT_UINT HGT_UNIFORM HGT_VOID HGT_WHILE
  82. /*
  83. * HLSL keywords
  84. */
  85. %token HT_APPENDSTRUCTUREDBUFFER HT_ASM HT_ASM_FRAGMENT HT_BLENDSTATE
  86. %token HT_BUFFER HT_BYTEADDRESSBUFFER HT_CBUFFER
  87. %token HT_COLUMN_MAJOR HT_COMPILE HT_COMPILE_FRAGMENT HT_COMPILESHADER
  88. %token HT_COMPUTESHADER HT_CONSUMESTRUCTUREDBUFFER
  89. %token HT_DEPTHSTENCILSTATE HT_DEPTHSTENCILVIEW
  90. %token HT_DOMAINSHADER HT_DWORD HT_EXTERN HT_FALSE
  91. %token HT_FXGROUP HT_GEOMETRYSHADER HT_GROUPSHARED HT_HALF HT_HULLSHADER
  92. %token HT_INLINE HT_INPUTPATCH HT_INTERFACE HT_LINE
  93. %token HT_LINEADJ HT_LINEAR HT_LINESTREAM HT_MATRIX HT_NAMESPACE
  94. %token HT_NOINTERPOLATION HT_NULL HT_OUTPUTPATCH
  95. %token HT_PACKOFFSET HT_PASS HT_PIXELFRAGMENT HT_PIXELSHADER HT_POINT
  96. %token HT_POINTSTREAM HT_PRECISE HT_RASTERIZERSTATE HT_RENDERTARGETVIEW
  97. %token HT_REGISTER HT_ROW_MAJOR HT_RWBUFFER HT_RWBYTEADDRESSBUFFER
  98. %token HT_RWSTRUCTUREDBUFFER HT_RWTEXTURE1D HT_RWTEXTURE1DARRAY HT_RWTEXTURE2D
  99. %token HT_RWTEXTURE2DARRAY HT_RWTEXTURE3D HT_SAMPLER
  100. %token HT_SAMPLER_STATE HT_SAMPLERSTATE
  101. %token HT_SAMPLERCOMPARISONSTATE HT_SHARED HT_SNORM HT_STATEBLOCK
  102. %token HT_STATEBLOCK_STATE HT_STATIC HT_STRING
  103. %token HT_STRUCTUREDBUFFER HT_TBUFFER HT_TECHNIQUE HT_TECHNIQUE10
  104. %token HT_TECHNIQUE11XZ HT_TEXTURE HT_TEXTURE1D HT_TEXTURE1DARRAY HT_TEXTURE2D
  105. %token HT_TEXTURE2DARRAY HT_TEXTURE2DMS HT_TEXTURE2DMSARRAY HT_TEXTURE3D
  106. %token HT_TEXTURECUBE HT_TEXTURECUBEARRAY HT_TRUE HT_TYPEDEF HT_TRIANGLE
  107. %token HT_TRIANGLEADJ HT_TRIANGLESTREAM HT_UNORM HT_VECTOR
  108. %token HT_VERTEXFRAGMENT HT_VERTEXSHADER HT_VOLATILE
  109. /*
  110. * HLSL types
  111. */
  112. %token HT_BOOL1 HT_BOOL1x1 HT_BOOL2x1 HT_BOOL3x1 HT_BOOL4x1
  113. %token HT_BOOL2 HT_BOOL1x2 HT_BOOL2x2 HT_BOOL3x2 HT_BOOL4x2
  114. %token HT_BOOL3 HT_BOOL1x3 HT_BOOL2x3 HT_BOOL3x3 HT_BOOL4x3
  115. %token HT_BOOL4 HT_BOOL1x4 HT_BOOL2x4 HT_BOOL3x4 HT_BOOL4x4
  116. %token HT_FLOAT1 HT_FLOAT1x1 HT_FLOAT2x1 HT_FLOAT3x1 HT_FLOAT4x1
  117. %token HT_FLOAT2 HT_FLOAT1x2 HT_FLOAT2x2 HT_FLOAT3x2 HT_FLOAT4x2
  118. %token HT_FLOAT3 HT_FLOAT1x3 HT_FLOAT2x3 HT_FLOAT3x3 HT_FLOAT4x3
  119. %token HT_FLOAT4 HT_FLOAT1x4 HT_FLOAT2x4 HT_FLOAT3x4 HT_FLOAT4x4
  120. %token HT_DOUBLE1 HT_DOUBLE1x1 HT_DOUBLE2x1 HT_DOUBLE3x1 HT_DOUBLE4x1
  121. %token HT_DOUBLE2 HT_DOUBLE1x2 HT_DOUBLE2x2 HT_DOUBLE3x2 HT_DOUBLE4x2
  122. %token HT_DOUBLE3 HT_DOUBLE1x3 HT_DOUBLE2x3 HT_DOUBLE3x3 HT_DOUBLE4x3
  123. %token HT_DOUBLE4 HT_DOUBLE1x4 HT_DOUBLE2x4 HT_DOUBLE3x4 HT_DOUBLE4x4
  124. %token HT_DWORD1 HT_DWORD1x1 HT_DWORD2x1 HT_DWORD3x1 HT_DWORD4x1
  125. %token HT_DWORD2 HT_DWORD1x2 HT_DWORD2x2 HT_DWORD3x2 HT_DWORD4x2
  126. %token HT_DWORD3 HT_DWORD1x3 HT_DWORD2x3 HT_DWORD3x3 HT_DWORD4x3
  127. %token HT_DWORD4 HT_DWORD1x4 HT_DWORD2x4 HT_DWORD3x4 HT_DWORD4x4
  128. %token HT_INT1 HT_INT1x1 HT_INT2x1 HT_INT3x1 HT_INT4x1
  129. %token HT_INT2 HT_INT1x2 HT_INT2x2 HT_INT3x2 HT_INT4x2
  130. %token HT_INT3 HT_INT1x3 HT_INT2x3 HT_INT3x3 HT_INT4x3
  131. %token HT_INT4 HT_INT1x4 HT_INT2x4 HT_INT3x4 HT_INT4x4
  132. %token HT_UINT1 HT_UINT1x1 HT_UINT2x1 HT_UINT3x1 HT_UINT4x1
  133. %token HT_UINT2 HT_UINT1x2 HT_UINT2x2 HT_UINT3x2 HT_UINT4x2
  134. %token HT_UINT3 HT_UINT1x3 HT_UINT2x3 HT_UINT3x3 HT_UINT4x3
  135. %token HT_UINT4 HT_UINT1x4 HT_UINT2x4 HT_UINT3x4 HT_UINT4x4
  136. /*
  137. * HLSL preprocessor directives
  138. */
  139. %token PREPROCESSOR_DEFINE PREPROCESSOR_ELIF PREPROCESSOR_ELSE
  140. %token PREPROCESSOR_ENDIF PREPROCESSOR_ERROR PREPROCESSOR_IF
  141. %token PREPROCESSOR_IFDEF PREPROCESSOR_IFNDEF PREPROCESSOR_INCLUDE
  142. %token PREPROCESSOR_LINE PREPROCESSOR_PRAGMA PREPROCESSOR_UNDEF
  143. %token PREPROCESSOR_REGION
  144. /*
  145. * HLSL reserved keywords
  146. */
  147. %token HT_AUTO HT_CATCH HT_CHAR HT_CLASS HT_CONST_CAST
  148. %token HT_DELETE HT_DYNAMIC_CAST HT_ENUM HT_EXPLICIT HT_FRIEND HT_GOTO HT_LONG
  149. %token HT_MUTABLE HT_NEW HT_OPERATOR HT_PRIVATE HT_PROTECTED HT_PUBLIC
  150. %token HT_REINTERPRET_CAST HT_SHORT HT_SIGNED HT_SIZEOF HT_STATIC_CAST
  151. %token HT_TEMPLATE HT_THIS HT_THROW HT_TRY HT_TYPENAME HT_UNION HT_UNSIGNED
  152. %token HT_USING HT_VIRTUAL
  153. /*
  154. * Language keywords
  155. */
  156. %token T_INC T_DEC T_LE T_GE T_EQ T_NE T_LEFT T_RIGHT T_AND T_OR T_XOR
  157. %token T_MULEQ T_DIVEQ T_MODEQ T_ADDEQ T_SUBEQ T_LEFTEQ T_RIGHTEQ T_ANDEQ
  158. %token T_XOREQ T_OREQ
  159. /*
  160. * Temporary shit
  161. */
  162. %token <ival> INT
  163. %token <fval> FLOAT
  164. %token <sval> STRING NAME
  165. %%
  166. lolfx_file:
  167. lolfx_section_list
  168. ;
  169. lolfx_section_list:
  170. lolfx_section
  171. | lolfx_section_list lolfx_section
  172. ;
  173. lolfx_section:
  174. lolfx_technique
  175. | lolfx_shader
  176. ;
  177. /*
  178. * Grammar for techniques
  179. */
  180. lolfx_technique:
  181. HT_TECHNIQUE NAME '{' pass_list '}' { std::cout << "New tech" << std::endl; }
  182. ;
  183. /*
  184. * Grammar for passes
  185. */
  186. pass_list:
  187. pass
  188. | pass_list pass
  189. ;
  190. pass:
  191. HT_PASS NAME '{' pass_stmt_list '}' { std::cout << "New pass" << std::endl; }
  192. ;
  193. pass_stmt_list:
  194. pass_stmt
  195. | pass_stmt_list pass_stmt
  196. ;
  197. pass_stmt:
  198. ';'
  199. | NAME '=' NAME ';'
  200. | NAME '=' INT ';'
  201. | NAME '[' INT ']' '=' NAME ';'
  202. | NAME '[' INT ']' '=' INT ';'
  203. ;
  204. /*
  205. * Grammar for shaders
  206. */
  207. lolfx_shader:
  208. lolfx_shader_region glsl_translation_unit
  209. | lolfx_shader_region
  210. ;
  211. lolfx_shader_region:
  212. PREPROCESSOR_REGION lolfx_shader_name { std::cout << "new shader " << $2 << std::endl; }
  213. ;
  214. lolfx_shader_name:
  215. IDENTIFIER { $$ = $1; }
  216. | lolfx_shader_name '.' IDENTIFIER { $$ = $3; } /* FIXME: concatenate */
  217. ;
  218. /*
  219. * Grammar for GLSL
  220. */
  221. glsl_variable_identifier:
  222. IDENTIFIER
  223. ;
  224. glsl_primary_expression:
  225. glsl_variable_identifier
  226. | INTCONSTANT
  227. | UINTCONSTANT
  228. | FLOATCONSTANT
  229. | BOOLCONSTANT
  230. | '(' glsl_expression ')'
  231. ;
  232. glsl_postfix_expression:
  233. glsl_primary_expression
  234. | glsl_postfix_expression '[' glsl_integer_expression ']'
  235. | glsl_function_call
  236. | glsl_postfix_expression '.' FIELDSELECTION
  237. | glsl_postfix_expression T_INC
  238. | glsl_postfix_expression T_DEC
  239. ;
  240. glsl_integer_expression:
  241. glsl_expression
  242. ;
  243. glsl_function_call:
  244. glsl_function_call_or_method
  245. ;
  246. glsl_function_call_or_method:
  247. glsl_function_call_generic
  248. | glsl_postfix_expression '.' glsl_function_call_generic
  249. ;
  250. glsl_function_call_generic:
  251. glsl_function_call_header_with_parameters ')'
  252. | glsl_function_call_header_no_parameters ')'
  253. ;
  254. glsl_function_call_header_no_parameters:
  255. glsl_function_call_header GHT_VOID
  256. | glsl_function_call_header
  257. ;
  258. glsl_function_call_header_with_parameters:
  259. glsl_function_call_header glsl_assignment_expression
  260. | glsl_function_call_header_with_parameters ',' glsl_assignment_expression
  261. ;
  262. glsl_function_call_header:
  263. glsl_function_identifier '('
  264. ;
  265. glsl_function_identifier:
  266. glsl_type_specifier
  267. | IDENTIFIER
  268. | FIELDSELECTION
  269. ;
  270. glsl_unary_expression:
  271. glsl_postfix_expression
  272. | T_INC glsl_unary_expression
  273. | T_DEC glsl_unary_expression
  274. | glsl_unary_operator glsl_unary_expression
  275. ;
  276. glsl_unary_operator:
  277. '+'
  278. | '-'
  279. | '!'
  280. | '~'
  281. ;
  282. glsl_multiplicative_expression:
  283. glsl_unary_expression
  284. | glsl_multiplicative_expression '*' glsl_unary_expression
  285. | glsl_multiplicative_expression '/' glsl_unary_expression
  286. | glsl_multiplicative_expression '%' glsl_unary_expression
  287. ;
  288. glsl_additive_expression:
  289. glsl_multiplicative_expression
  290. | glsl_additive_expression '+' glsl_multiplicative_expression
  291. | glsl_additive_expression '-' glsl_multiplicative_expression
  292. ;
  293. glsl_shift_expression:
  294. glsl_additive_expression
  295. | glsl_shift_expression T_LEFT glsl_additive_expression
  296. | glsl_shift_expression T_RIGHT glsl_additive_expression
  297. ;
  298. glsl_relational_expression:
  299. glsl_shift_expression
  300. | glsl_relational_expression '<' glsl_shift_expression
  301. | glsl_relational_expression '>' glsl_shift_expression
  302. | glsl_relational_expression T_LE glsl_shift_expression
  303. | glsl_relational_expression T_GE glsl_shift_expression
  304. ;
  305. glsl_equality_expression:
  306. glsl_relational_expression
  307. | glsl_equality_expression T_EQ glsl_relational_expression
  308. | glsl_equality_expression T_NE glsl_relational_expression
  309. ;
  310. glsl_and_expression:
  311. glsl_equality_expression
  312. | glsl_and_expression '&' glsl_equality_expression
  313. ;
  314. glsl_exclusive_or_expression:
  315. glsl_and_expression
  316. | glsl_exclusive_or_expression '^' glsl_and_expression
  317. ;
  318. glsl_inclusive_or_expression:
  319. glsl_exclusive_or_expression
  320. | glsl_inclusive_or_expression '|' glsl_exclusive_or_expression
  321. ;
  322. glsl_logical_and_expression:
  323. glsl_inclusive_or_expression
  324. | glsl_logical_and_expression T_AND glsl_inclusive_or_expression
  325. ;
  326. glsl_logical_xor_expression:
  327. glsl_logical_and_expression
  328. | glsl_logical_xor_expression T_XOR glsl_logical_and_expression
  329. ;
  330. glsl_logical_or_expression:
  331. glsl_logical_xor_expression
  332. | glsl_logical_or_expression T_OR glsl_logical_xor_expression
  333. ;
  334. glsl_conditional_expression:
  335. glsl_logical_or_expression
  336. | glsl_logical_or_expression '?' glsl_expression ':' glsl_assignment_expression
  337. ;
  338. glsl_assignment_expression:
  339. glsl_conditional_expression
  340. | glsl_unary_expression glsl_assignment_operator glsl_assignment_expression
  341. ;
  342. glsl_assignment_operator:
  343. '='
  344. | T_MULEQ
  345. | T_DIVEQ
  346. | T_MODEQ
  347. | T_ADDEQ
  348. | T_SUBEQ
  349. | T_LEFTEQ
  350. | T_RIGHTEQ
  351. | T_ANDEQ
  352. | T_XOREQ
  353. | T_OREQ
  354. ;
  355. glsl_expression:
  356. glsl_assignment_expression
  357. | glsl_expression ',' glsl_assignment_expression
  358. ;
  359. glsl_constant_expression:
  360. glsl_conditional_expression
  361. ;
  362. glsl_declaration:
  363. glsl_function_prototype ';'
  364. | glsl_init_declarator_list ';'
  365. | GT_PRECISION glsl_precision_qualifier glsl_type_specifier_no_prec ';'
  366. | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' ';'
  367. | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER ';'
  368. | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER '[' ']' ';'
  369. | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER '[' glsl_constant_expression ']' ';'
  370. | glsl_type_qualifier ';'
  371. ;
  372. glsl_function_prototype:
  373. glsl_function_declarator ')'
  374. ;
  375. glsl_function_declarator:
  376. glsl_function_header
  377. | glsl_function_header_with_parameters
  378. ;
  379. glsl_function_header_with_parameters:
  380. glsl_function_header glsl_parameter_declaration
  381. | glsl_function_header_with_parameters ',' glsl_parameter_declaration
  382. ;
  383. glsl_function_header:
  384. glsl_fully_specified_type IDENTIFIER '('
  385. ;
  386. glsl_parameter_declarator:
  387. glsl_type_specifier IDENTIFIER
  388. | glsl_type_specifier IDENTIFIER '[' glsl_constant_expression ']'
  389. ;
  390. glsl_parameter_declaration:
  391. glsl_parameter_type_qualifier glsl_parameter_qualifier glsl_parameter_declarator
  392. | glsl_parameter_qualifier glsl_parameter_declarator
  393. | glsl_parameter_type_qualifier glsl_parameter_qualifier glsl_parameter_type_specifier
  394. | glsl_parameter_qualifier glsl_parameter_type_specifier
  395. ;
  396. glsl_parameter_qualifier:
  397. /* empty */
  398. | GHT_IN
  399. | GHT_OUT
  400. | GHT_INOUT
  401. ;
  402. glsl_parameter_type_specifier:
  403. glsl_type_specifier
  404. ;
  405. glsl_init_declarator_list:
  406. glsl_single_declaration
  407. | glsl_init_declarator_list ',' IDENTIFIER
  408. | glsl_init_declarator_list ',' IDENTIFIER '[' ']'
  409. | glsl_init_declarator_list ',' IDENTIFIER '[' glsl_constant_expression ']'
  410. | glsl_init_declarator_list ',' IDENTIFIER '[' ']' '=' glsl_initializer
  411. | glsl_init_declarator_list ',' IDENTIFIER '[' glsl_constant_expression ']' '=' glsl_initializer
  412. | glsl_init_declarator_list ',' IDENTIFIER '=' glsl_initializer
  413. ;
  414. glsl_single_declaration:
  415. glsl_fully_specified_type
  416. | glsl_fully_specified_type IDENTIFIER
  417. | glsl_fully_specified_type IDENTIFIER '[' ']'
  418. | glsl_fully_specified_type IDENTIFIER '[' glsl_constant_expression ']'
  419. | glsl_fully_specified_type IDENTIFIER '[' ']' '=' glsl_initializer
  420. | glsl_fully_specified_type IDENTIFIER '[' glsl_constant_expression ']' '=' glsl_initializer
  421. | glsl_fully_specified_type IDENTIFIER '=' glsl_initializer
  422. | GT_INVARIANT IDENTIFIER
  423. ;
  424. glsl_fully_specified_type:
  425. glsl_type_specifier
  426. | glsl_type_qualifier glsl_type_specifier
  427. ;
  428. glsl_invariant_qualifier:
  429. GT_INVARIANT
  430. ;
  431. glsl_interpolation_qualifier:
  432. GT_SMOOTH
  433. | GT_FLAT
  434. | GHT_NOPERSPECTIVE
  435. ;
  436. glsl_layout_qualifier:
  437. GT_LAYOUT '(' glsl_layout_qualifier_id_list ')'
  438. ;
  439. glsl_layout_qualifier_id_list:
  440. glsl_layout_qualifier_id
  441. | glsl_layout_qualifier_id_list ',' glsl_layout_qualifier_id
  442. ;
  443. glsl_layout_qualifier_id:
  444. IDENTIFIER
  445. | IDENTIFIER '=' INTCONSTANT
  446. ;
  447. glsl_parameter_type_qualifier:
  448. GHT_CONST
  449. ;
  450. glsl_type_qualifier:
  451. glsl_storage_qualifier
  452. | glsl_layout_qualifier
  453. | glsl_layout_qualifier glsl_storage_qualifier
  454. | glsl_interpolation_qualifier glsl_storage_qualifier
  455. | glsl_interpolation_qualifier
  456. | glsl_invariant_qualifier glsl_storage_qualifier
  457. | glsl_invariant_qualifier glsl_interpolation_qualifier glsl_storage_qualifier
  458. | glsl_invariant_qualifier
  459. ;
  460. glsl_storage_qualifier:
  461. GHT_CONST
  462. | GHT_IN
  463. | GHT_OUT
  464. | GHT_CENTROID GHT_IN
  465. | GHT_CENTROID GHT_OUT
  466. | GT_PATCH GHT_IN
  467. | GT_PATCH GHT_OUT
  468. | GT_SAMPLE GHT_IN
  469. | GT_SAMPLE GHT_OUT
  470. | GHT_UNIFORM
  471. ;
  472. glsl_type_specifier:
  473. glsl_type_specifier_no_prec
  474. | glsl_precision_qualifier glsl_type_specifier_no_prec
  475. ;
  476. glsl_type_specifier_no_prec:
  477. glsl_type_specifier_nonarray
  478. | glsl_type_specifier_nonarray '[' ']'
  479. | glsl_type_specifier_nonarray '[' glsl_constant_expression ']'
  480. glsl_type_specifier_nonarray:
  481. GHT_VOID
  482. | GHT_FLOAT
  483. | GHT_DOUBLE
  484. | GHT_INT
  485. | GHT_UINT
  486. | GHT_BOOL
  487. | GT_VEC2
  488. | GT_VEC3
  489. | GT_VEC4
  490. | GT_DVEC2
  491. | GT_DVEC3
  492. | GT_DVEC4
  493. | GT_BVEC2
  494. | GT_BVEC3
  495. | GT_BVEC4
  496. | GT_IVEC2
  497. | GT_IVEC3
  498. | GT_IVEC4
  499. | GT_UVEC2
  500. | GT_UVEC3
  501. | GT_UVEC4
  502. | GT_MAT2
  503. | GT_MAT3
  504. | GT_MAT4
  505. | GT_MAT2X2
  506. | GT_MAT2X3
  507. | GT_MAT2X4
  508. | GT_MAT3X2
  509. | GT_MAT3X3
  510. | GT_MAT3X4
  511. | GT_MAT4X2
  512. | GT_MAT4X3
  513. | GT_MAT4X4
  514. | GT_DMAT2
  515. | GT_DMAT3
  516. | GT_DMAT4
  517. | GT_DMAT2X2
  518. | GT_DMAT2X3
  519. | GT_DMAT2X4
  520. | GT_DMAT3X2
  521. | GT_DMAT3X3
  522. | GT_DMAT3X4
  523. | GT_DMAT4X2
  524. | GT_DMAT4X3
  525. | GT_DMAT4X4
  526. | GHT_SAMPLER1D
  527. | GHT_SAMPLER2D
  528. | GHT_SAMPLER3D
  529. | GHT_SAMPLERCUBE
  530. | GT_SAMPLER1DSHADOW
  531. | GT_SAMPLER2DSHADOW
  532. | GT_SAMPLERCUBESHADOW
  533. | GT_SAMPLER1DARRAY
  534. | GT_SAMPLER2DARRAY
  535. | GT_SAMPLER1DARRAYSHADOW
  536. | GT_SAMPLER2DARRAYSHADOW
  537. | GT_SAMPLERCUBEARRAY
  538. | GT_SAMPLERCUBEARRAYSHADOW
  539. | GT_ISAMPLER1D
  540. | GT_ISAMPLER2D
  541. | GT_ISAMPLER3D
  542. | GT_ISAMPLERCUBE
  543. | GT_ISAMPLER1DARRAY
  544. | GT_ISAMPLER2DARRAY
  545. | GT_ISAMPLERCUBEARRAY
  546. | GT_USAMPLER1D
  547. | GT_USAMPLER2D
  548. | GT_USAMPLER3D
  549. | GT_USAMPLERCUBE
  550. | GT_USAMPLER1DARRAY
  551. | GT_USAMPLER2DARRAY
  552. | GT_USAMPLERCUBEARRAY
  553. | GT_SAMPLER2DRECT
  554. | GT_SAMPLER2DRECTSHADOW
  555. | GT_ISAMPLER2DRECT
  556. | GT_USAMPLER2DRECT
  557. | GT_SAMPLERBUFFER
  558. | GT_ISAMPLERBUFFER
  559. | GT_USAMPLERBUFFER
  560. | GT_SAMPLER2DMS
  561. | GT_ISAMPLER2DMS
  562. | GT_USAMPLER2DMS
  563. | GT_SAMPLER2DMSARRAY
  564. | GT_ISAMPLER2DMSARRAY
  565. | GT_USAMPLER2DMSARRAY
  566. | glsl_struct_specifier
  567. | TYPENAME
  568. ;
  569. glsl_precision_qualifier:
  570. GT_HIGHP
  571. | GT_MEDIUMP
  572. | GT_LOWP
  573. ;
  574. glsl_struct_specifier:
  575. GHT_STRUCT IDENTIFIER '{' glsl_struct_declaration_list '}'
  576. | GHT_STRUCT '{' glsl_struct_declaration_list '}'
  577. ;
  578. glsl_struct_declaration_list:
  579. glsl_struct_declaration
  580. | glsl_struct_declaration_list glsl_struct_declaration
  581. ;
  582. glsl_struct_declaration:
  583. glsl_type_specifier glsl_struct_declarator_list ';'
  584. | glsl_type_qualifier glsl_type_specifier glsl_struct_declarator_list ';'
  585. ;
  586. glsl_struct_declarator_list:
  587. glsl_struct_declarator
  588. | glsl_struct_declarator_list ',' glsl_struct_declarator
  589. ;
  590. glsl_struct_declarator:
  591. IDENTIFIER
  592. | IDENTIFIER '[' ']'
  593. | IDENTIFIER '[' glsl_constant_expression ']'
  594. ;
  595. glsl_initializer:
  596. glsl_assignment_expression
  597. ;
  598. glsl_declaration_statement:
  599. glsl_declaration
  600. ;
  601. glsl_statement:
  602. glsl_compound_statement
  603. | glsl_simple_statement
  604. ;
  605. glsl_simple_statement:
  606. glsl_declaration_statement
  607. | glsl_expression_statement
  608. | glsl_selection_statement
  609. | glsl_switch_statement
  610. | glsl_case_label
  611. | glsl_iteration_statement
  612. | glsl_jump_statement
  613. ;
  614. glsl_compound_statement:
  615. '{' '}'
  616. | '{' glsl_statement_list '}'
  617. ;
  618. glsl_statement_no_new_scope:
  619. glsl_compound_statement_no_new_scope
  620. | glsl_simple_statement
  621. ;
  622. glsl_compound_statement_no_new_scope:
  623. '{' '}'
  624. | '{' glsl_statement_list '}'
  625. ;
  626. glsl_statement_list:
  627. glsl_statement
  628. | glsl_statement_list glsl_statement
  629. ;
  630. glsl_expression_statement:
  631. ';'
  632. | glsl_expression ';'
  633. ;
  634. glsl_selection_statement:
  635. GHT_IF '(' glsl_expression ')' glsl_selection_rest_statement
  636. ;
  637. glsl_selection_rest_statement:
  638. glsl_statement GHT_ELSE glsl_statement
  639. | glsl_statement
  640. ;
  641. glsl_condition:
  642. glsl_expression
  643. | glsl_fully_specified_type IDENTIFIER '=' glsl_initializer
  644. ;
  645. glsl_switch_statement:
  646. GHT_SWITCH '(' glsl_expression ')' '{' glsl_switch_statement_list '}'
  647. ;
  648. glsl_switch_statement_list:
  649. /* nothing */
  650. | glsl_statement_list
  651. ;
  652. glsl_case_label:
  653. GHT_CASE glsl_expression ':'
  654. | GHT_DEFAULT ':'
  655. ;
  656. glsl_iteration_statement:
  657. GHT_WHILE '(' glsl_condition ')' glsl_statement_no_new_scope
  658. | GHT_DO glsl_statement GHT_WHILE '(' glsl_expression ')' ';'
  659. | GHT_FOR '(' glsl_for_init_statement glsl_for_rest_statement ')' glsl_statement_no_new_scope
  660. ;
  661. glsl_for_init_statement:
  662. glsl_expression_statement
  663. | glsl_declaration_statement
  664. ;
  665. glsl_conditionopt:
  666. glsl_condition
  667. | /* empty */
  668. ;
  669. glsl_for_rest_statement:
  670. glsl_conditionopt ';'
  671. | glsl_conditionopt ';' glsl_expression
  672. ;
  673. glsl_jump_statement:
  674. GHT_CONTINUE ';'
  675. | GHT_BREAK ';'
  676. | GHT_RETURN ';'
  677. | GHT_RETURN glsl_expression ';'
  678. | GHT_DISCARD ';'
  679. ;
  680. glsl_translation_unit:
  681. glsl_external_declaration
  682. | glsl_translation_unit glsl_external_declaration
  683. ;
  684. glsl_external_declaration:
  685. glsl_function_definition
  686. | glsl_declaration
  687. ;
  688. glsl_function_definition:
  689. glsl_function_prototype glsl_compound_statement_no_new_scope
  690. ;
  691. %%
  692. main()
  693. {
  694. yyin = fopen("test.lolfx", "r");
  695. do
  696. {
  697. yyparse();
  698. }
  699. while (!feof(yyin));
  700. fclose(yyin);
  701. }
  702. void yyerror(const char *s)
  703. {
  704. std::cout << "Parse error line " << yylineno << ": " << s << std::endl;
  705. exit(-1);
  706. }