Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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