Skip to content

Latest commit

 

History

History
348 lines (268 loc) · 11.4 KB

mojoshader_parser_hlsl.lemon

File metadata and controls

348 lines (268 loc) · 11.4 KB
 
Feb 27, 2009
Feb 27, 2009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* MojoShader; generate shader programs from bytecode of compiled
* Direct3D shaders.
*
* Please see the file LICENSE.txt in the source's root directory.
*
* This file written by Ryan C. Gordon.
*/
// This is a Lemon Parser grammar for HLSL. It is based on an ANSI C YACC
// grammar by Jeff Lee: http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
// Lemon is here: http://www.hwaci.com/sw/lemon/ ... the source is included
// with MojoShader, and built with the library, so you don't have to track
// down the dependency.
// HLSL syntax is described, informally, here:
// http://msdn.microsoft.com/en-us/library/bb509615(VS.85).aspx
%name ParseHLSL
%start_symbol shader
%token_prefix TOKEN_HLSL_
%token_type { IncludeState * }
%extra_argument { Context *ctx }
%include {
#define __MOJOSHADER_INTERNAL__ 1
#include "mojoshader_internal.h"
30
}
Feb 27, 2009
Feb 27, 2009
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
%parse_failure {
fprintf(stderr,"Giving up. Parser is hopelessly lost...\n");
}
%stack_overflow {
fprintf(stderr,"Giving up. Parser stack overflow\n");
}
// operator precedence (matches C spec)...
%left COMMA.
%right ASSIGN ADDASSIGN SUBASSIGN MULASSIGN DIVASSIGN MODASSIGN LSHIFTASSIGN
RSHIFTASSIGN ANDASSIGN ORASSIGN XORASSIGN.
%right QUESTION.
%left OROR.
%left ANDAND.
%left OR.
%left XOR.
%left AND.
%left EQL NEQ.
%left LT LEQ GT GEQ.
%left LSHIFT RSHIFT.
%left PLUS MINUS.
%left STAR SLASH PERCENT.
%right TYPECAST EXCLAMATION COMPLEMENT MINUSMINUS PLUSPLUS.
%left DOT LBRACKET RBRACKET LPAREN RPAREN.
Feb 27, 2009
Feb 27, 2009
59
60
61
62
// bump up the precedence of ELSE, to avoid shift/reduce conflict on the
// usual "dangling else ambiguity" ...
%right ELSE.
Feb 27, 2009
Feb 27, 2009
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
// The rules...
shader ::= file.
primary_expr ::= identifier.
primary_expr ::= CONSTANT.
primary_expr ::= STRING_LITERAL.
primary_expr ::= LPAREN expr RPAREN.
postfix_expr ::= primary_expr.
postfix_expr ::= postfix_expr LBRACKET expr RBRACKET.
postfix_expr ::= postfix_expr LPAREN RPAREN.
postfix_expr ::= postfix_expr LPAREN argument_expr_list RPAREN.
postfix_expr ::= postfix_expr DOT identifier.
postfix_expr ::= postfix_expr PTR_OP identifier.
postfix_expr ::= postfix_expr INC_OP.
postfix_expr ::= postfix_expr DEC_OP.
argument_expr_list ::= assignment_expr.
argument_expr_list ::= argument_expr_list COMMA assignment_expr.
unary_expr ::= postfix_expr.
unary_expr ::= INC_OP unary_expr.
unary_expr ::= DEC_OP unary_expr.
unary_expr ::= unary_operator cast_expr.
unary_expr ::= SIZEOF unary_expr.
unary_expr ::= SIZEOF LPAREN type_name RPAREN.
unary_operator ::= AND.
unary_operator ::= STAR.
unary_operator ::= PLUS.
unary_operator ::= MINUS.
unary_operator ::= COMPLEMENT.
unary_operator ::= EXCLAMATION.
cast_expr ::= unary_expr.
cast_expr ::= LPAREN type_name RPAREN cast_expr.
multiplicative_expr ::= cast_expr.
multiplicative_expr ::= multiplicative_expr STAR cast_expr.
multiplicative_expr ::= multiplicative_expr SLASH cast_expr.
multiplicative_expr ::= multiplicative_expr PERCENT cast_expr.
additive_expr ::= multiplicative_expr.
additive_expr ::= additive_expr PLUS multiplicative_expr.
additive_expr ::= additive_expr MINUS multiplicative_expr.
shift_expr ::= additive_expr.
shift_expr ::= shift_expr LSHIFT additive_expr.
shift_expr ::= shift_expr RSHIFT additive_expr.
relational_expr ::= shift_expr.
relational_expr ::= relational_expr LT shift_expr.
relational_expr ::= relational_expr GT shift_expr.
relational_expr ::= relational_expr LEQ shift_expr.
relational_expr ::= relational_expr GEQ shift_expr.
equality_expr ::= relational_expr.
equality_expr ::= equality_expr EQL relational_expr.
equality_expr ::= equality_expr NEQ relational_expr.
and_expr ::= equality_expr.
and_expr ::= and_expr AND equality_expr.
exclusive_or_expr ::= and_expr.
exclusive_or_expr ::= exclusive_or_expr XOR and_expr.
inclusive_or_expr ::= exclusive_or_expr.
inclusive_or_expr ::= inclusive_or_expr OR exclusive_or_expr.
logical_and_expr ::= inclusive_or_expr.
logical_and_expr ::= logical_and_expr ANDAND inclusive_or_expr.
logical_or_expr ::= logical_and_expr.
logical_or_expr ::= logical_or_expr OROR logical_and_expr.
conditional_expr ::= logical_or_expr.
conditional_expr ::= logical_or_expr QUESTION logical_or_expr COLON conditional_expr.
assignment_expr ::= conditional_expr.
assignment_expr ::= unary_expr assignment_operator assignment_expr.
assignment_operator ::= ASSIGN.
assignment_operator ::= MULASSIGN.
assignment_operator ::= DIVASSIGN.
assignment_operator ::= MODASSIGN.
assignment_operator ::= ADDASSIGN.
assignment_operator ::= SUBASSIGN.
assignment_operator ::= LSHIFTASSIGN.
assignment_operator ::= RSHIFTASSIGN.
assignment_operator ::= ANDASSIGN.
assignment_operator ::= XORASSIGN.
assignment_operator ::= ORASSIGN.
expr ::= assignment_expr.
expr ::= expr COMMA assignment_expr.
constant_expr ::= conditional_expr.
declaration ::= declaration_specifiers SEMICOLON.
declaration ::= declaration_specifiers init_declarator_list SEMICOLON.
declaration_specifiers ::= storage_class_specifier.
declaration_specifiers ::= storage_class_specifier declaration_specifiers.
declaration_specifiers ::= type_specifier.
declaration_specifiers ::= type_specifier declaration_specifiers.
init_declarator_list ::= init_declarator.
init_declarator_list ::= init_declarator_list COMMA init_declarator.
init_declarator ::= declarator.
init_declarator ::= declarator ASSIGN initializer.
storage_class_specifier ::= TYPEDEF.
storage_class_specifier ::= EXTERN.
storage_class_specifier ::= STATIC.
storage_class_specifier ::= AUTO.
storage_class_specifier ::= REGISTER.
type_specifier ::= CHAR.
type_specifier ::= SHORT.
type_specifier ::= INT.
type_specifier ::= LONG.
type_specifier ::= SIGNED.
type_specifier ::= UNSIGNED.
type_specifier ::= FLOAT.
type_specifier ::= DOUBLE.
type_specifier ::= CONST.
type_specifier ::= VOLATILE.
type_specifier ::= VOID.
type_specifier ::= struct_or_union_specifier.
type_specifier ::= enum_specifier.
type_specifier ::= TYPE_NAME.
struct_or_union_specifier ::= struct_or_union identifier LBRACE
struct_declaration_list RBRACE.
struct_or_union_specifier ::= struct_or_union LBRACE struct_declaration_list
RBRACE.
struct_or_union_specifier ::= struct_or_union identifier.
struct_or_union ::= STRUCT.
struct_or_union ::= UNION.
struct_declaration_list ::= struct_declaration.
struct_declaration_list ::= struct_declaration_list struct_declaration.
struct_declaration ::= type_specifier_list struct_declarator_list SEMICOLON.
struct_declarator_list ::= struct_declarator.
struct_declarator_list ::= struct_declarator_list COMMA struct_declarator.
struct_declarator ::= declarator.
struct_declarator ::= COLON constant_expr.
struct_declarator ::= declarator COLON constant_expr.
enum_specifier ::= ENUM LBRACE enumerator_list RBRACE.
enum_specifier ::= ENUM identifier LBRACE enumerator_list RBRACE.
enum_specifier ::= ENUM identifier.
enumerator_list ::= enumerator.
enumerator_list ::= enumerator_list COMMA enumerator.
enumerator ::= identifier.
enumerator ::= identifier ASSIGN constant_expr.
declarator ::= declarator2.
declarator ::= pointer declarator2.
declarator2 ::= identifier.
declarator2 ::= LPAREN declarator RPAREN.
declarator2 ::= declarator2 LBRACKET RBRACKET.
declarator2 ::= declarator2 LBRACKET constant_expr RBRACKET.
declarator2 ::= declarator2 LPAREN RPAREN.
declarator2 ::= declarator2 LPAREN parameter_type_list RPAREN.
declarator2 ::= declarator2 LPAREN parameter_identifier_list RPAREN.
pointer ::= STAR.
pointer ::= STAR type_specifier_list.
pointer ::= STAR pointer.
pointer ::= STAR type_specifier_list pointer.
type_specifier_list ::= type_specifier.
type_specifier_list ::= type_specifier_list type_specifier.
parameter_identifier_list ::= identifier_list.
parameter_identifier_list ::= identifier_list COMMA ELIPSIS.
identifier_list ::= identifier.
identifier_list ::= identifier_list COMMA identifier.
parameter_type_list ::= parameter_list.
parameter_type_list ::= parameter_list COMMA ELIPSIS.
parameter_list ::= parameter_declaration.
parameter_list ::= parameter_list COMMA parameter_declaration.
parameter_declaration ::= type_specifier_list declarator.
parameter_declaration ::= type_name.
type_name ::= type_specifier_list.
type_name ::= type_specifier_list abstract_declarator.
abstract_declarator ::= pointer.
abstract_declarator ::= abstract_declarator2.
abstract_declarator ::= pointer abstract_declarator2.
abstract_declarator2 ::= LPAREN abstract_declarator RPAREN.
abstract_declarator2 ::= LBRACKET RBRACKET.
abstract_declarator2 ::= LBRACKET constant_expr RBRACKET.
abstract_declarator2 ::= abstract_declarator2 LBRACKET RBRACKET.
abstract_declarator2 ::= abstract_declarator2 LBRACKET constant_expr RBRACKET.
abstract_declarator2 ::= LPAREN RPAREN.
abstract_declarator2 ::= LPAREN parameter_type_list RPAREN.
abstract_declarator2 ::= abstract_declarator2 LPAREN RPAREN.
abstract_declarator2 ::= abstract_declarator2 LPAREN parameter_type_list RPAREN.
initializer ::= assignment_expr.
initializer ::= LBRACE initializer_list RBRACE.
initializer ::= LBRACE initializer_list COMMA RBRACE.
initializer_list ::= initializer.
initializer_list ::= initializer_list COMMA initializer.
statement ::= labeled_statement.
statement ::= compound_statement.
statement ::= expression_statement.
statement ::= selection_statement.
statement ::= iteration_statement.
statement ::= jump_statement.
labeled_statement ::= identifier COLON statement.
labeled_statement ::= CASE constant_expr COLON statement.
labeled_statement ::= DEFAULT COLON statement.
compound_statement ::= LBRACE RBRACE.
compound_statement ::= LBRACE statement_list RBRACE.
compound_statement ::= LBRACE declaration_list RBRACE.
compound_statement ::= LBRACE declaration_list statement_list RBRACE.
declaration_list ::= declaration.
declaration_list ::= declaration_list declaration.
statement_list ::= statement.
statement_list ::= statement_list statement.
expression_statement ::= SEMICOLON.
expression_statement ::= expr SEMICOLON.
selection_statement ::= IF LPAREN expr RPAREN statement.
selection_statement ::= IF LPAREN expr RPAREN statement ELSE statement.
selection_statement ::= SWITCH LPAREN expr RPAREN statement.
iteration_statement ::= WHILE LPAREN expr RPAREN statement.
iteration_statement ::= DO statement WHILE LPAREN expr RPAREN SEMICOLON.
iteration_statement ::= FOR LPAREN SEMICOLON SEMICOLON RPAREN statement.
iteration_statement ::= FOR LPAREN SEMICOLON SEMICOLON expr RPAREN statement.
iteration_statement ::= FOR LPAREN SEMICOLON expr SEMICOLON RPAREN statement.
iteration_statement ::= FOR LPAREN SEMICOLON expr SEMICOLON expr RPAREN statement.
iteration_statement ::= FOR LPAREN expr SEMICOLON SEMICOLON RPAREN statement.
iteration_statement ::= FOR LPAREN expr SEMICOLON SEMICOLON expr RPAREN statement.
iteration_statement ::= FOR LPAREN expr SEMICOLON expr SEMICOLON RPAREN statement.
iteration_statement ::= FOR LPAREN expr SEMICOLON expr SEMICOLON expr RPAREN statement.
jump_statement ::= GOTO identifier SEMICOLON.
jump_statement ::= CONTINUE SEMICOLON.
jump_statement ::= BREAK SEMICOLON.
jump_statement ::= RETURN SEMICOLON.
jump_statement ::= RETURN expr SEMICOLON.
file ::= external_definition.
file ::= file external_definition.
external_definition ::= function_definition.
external_definition ::= declaration.
function_definition ::= declarator function_body.
function_definition ::= declaration_specifiers declarator function_body.
function_body ::= compound_statement.
function_body ::= declaration_list compound_statement.
identifier ::= IDENTIFIER.
// end of mojoshader_parser_hlsl.lemon ...