Skip to content

Latest commit

 

History

History
586 lines (494 loc) · 38.1 KB

mojoshader_parser_hlsl.lemon

File metadata and controls

586 lines (494 loc) · 38.1 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
/**
* 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
Aug 26, 2009
Aug 26, 2009
22
23
// Some shift-reduce conflicts are basically unavoidable, but if the final
// conflict count matches this value, we consider it known and acceptable.
Aug 26, 2009
Aug 26, 2009
24
%expect 2
Aug 26, 2009
Aug 26, 2009
25
Feb 27, 2009
Feb 27, 2009
26
27
%start_symbol shader
%token_prefix TOKEN_HLSL_
Aug 23, 2009
Aug 23, 2009
28
%token_type { TokenData }
Feb 27, 2009
Feb 27, 2009
29
30
31
%extra_argument { Context *ctx }
%include {
Feb 28, 2009
Feb 28, 2009
32
33
34
#ifndef __MOJOSHADER_HLSL_COMPILER__
#error Do not compile this file directly.
#endif
35
}
Feb 27, 2009
Feb 27, 2009
36
Aug 23, 2009
Aug 23, 2009
37
%syntax_error {
Feb 19, 2010
Feb 19, 2010
38
// !!! FIXME: make this a proper fail() function.
Feb 22, 2010
Feb 22, 2010
39
fail(ctx, "Syntax error");
Aug 23, 2009
Aug 23, 2009
40
41
}
Feb 27, 2009
Feb 27, 2009
42
%parse_failure {
Feb 9, 2010
Feb 9, 2010
43
// !!! FIXME: make this a proper fail() function.
Feb 22, 2010
Feb 22, 2010
44
fail(ctx, "Giving up. Parser is hopelessly lost...");
Feb 27, 2009
Feb 27, 2009
45
46
47
}
%stack_overflow {
Feb 9, 2010
Feb 9, 2010
48
// !!! FIXME: make this a proper fail() function.
Feb 22, 2010
Feb 22, 2010
49
fail(ctx, "Giving up. Parser stack overflow");
Feb 27, 2009
Feb 27, 2009
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
}
// 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
71
72
73
74
// 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
75
76
77
// The rules...
Oct 28, 2010
Oct 28, 2010
78
shader ::= compilation_units(B). { assert(ctx->ast == NULL); REVERSE_LINKED_LIST(MOJOSHADER_astCompilationUnit, B); ctx->ast = (MOJOSHADER_astNode *) B; }
Feb 19, 2010
Feb 19, 2010
79
Oct 28, 2010
Oct 28, 2010
80
%type compilation_units { MOJOSHADER_astCompilationUnit * }
Feb 19, 2010
Feb 19, 2010
81
82
83
84
%destructor compilation_units { delete_compilation_unit(ctx, $$); }
compilation_units(A) ::= compilation_unit(B). { A = B; }
compilation_units(A) ::= compilation_units(B) compilation_unit(C). { if (C) { C->next = B; A = C; } }
Oct 28, 2010
Oct 28, 2010
85
%type compilation_unit { MOJOSHADER_astCompilationUnit * }
Feb 19, 2010
Feb 19, 2010
86
%destructor compilation_unit { delete_compilation_unit(ctx, $$); }
May 31, 2010
May 31, 2010
87
//compilation_unit(A) ::= PRAGMA . { A = NULL; } // !!! FIXME: deal with pragmas.
Feb 19, 2010
Feb 19, 2010
88
89
90
91
92
93
94
compilation_unit(A) ::= variable_declaration(B). { A = new_global_variable(ctx, B); }
compilation_unit(A) ::= function_signature(B) SEMICOLON. { A = new_function(ctx, B, NULL); }
compilation_unit(A) ::= function_signature(B) statement_block(C). { A = new_function(ctx, B, C); }
compilation_unit(A) ::= typedef(B). { A = new_global_typedef(ctx, B); }
compilation_unit(A) ::= struct_declaration(B) SEMICOLON. { A = new_global_struct(ctx, B); }
//compilation_unit(A) ::= error SEMICOLON. { A = NULL; } // !!! FIXME: research using the error nonterminal
Oct 28, 2010
Oct 28, 2010
95
%type typedef { MOJOSHADER_astTypedef * }
Feb 19, 2010
Feb 19, 2010
96
97
%destructor typedef { delete_typedef(ctx, $$); }
// !!! FIXME: should CONST be here, or in datatype?
Nov 2, 2010
Nov 2, 2010
98
99
typedef(A) ::= TYPEDEF CONST datatype(B) scalar_or_array(C). { A = new_typedef(ctx, 1, B, C); push_usertype(ctx, C->identifier, "?"); }
typedef(A) ::= TYPEDEF datatype(B) scalar_or_array(C). { A = new_typedef(ctx, 0, B, C); push_usertype(ctx, C->identifier, "?"); }
Feb 19, 2010
Feb 19, 2010
100
Oct 28, 2010
Oct 28, 2010
101
%type function_signature { MOJOSHADER_astFunctionSignature * }
Feb 19, 2010
Feb 19, 2010
102
103
104
105
106
107
%destructor function_signature { delete_function_signature(ctx, $$); }
function_signature(A) ::= function_storageclass(B) function_details(C) semantic(D). { A = C; A->storage_class = B; A->semantic = D; }
function_signature(A) ::= function_storageclass(B) function_details(C). { A = C; A->storage_class = B; }
function_signature(A) ::= function_details(B) semantic(C). { A = B; A->semantic = C; }
function_signature(A) ::= function_details(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
108
%type function_details { MOJOSHADER_astFunctionSignature * }
Feb 19, 2010
Feb 19, 2010
109
%destructor function_details { delete_function_signature(ctx, $$); }
Oct 25, 2010
Oct 25, 2010
110
111
function_details(A) ::= datatype(B) IDENTIFIER(C) LPAREN function_parameters(D) RPAREN. { A = new_function_signature(ctx, B, C.string, D); }
function_details(A) ::= VOID IDENTIFIER(B) LPAREN function_parameters(C) RPAREN. { A = new_function_signature(ctx, NULL, B.string, C); }
Mar 7, 2009
Mar 7, 2009
112
113
114
115
116
117
118
// !!! FIXME: there is a "target" storage class that is the name of the
// !!! FIXME: platform that this function is meant for...but I don't know
// !!! FIXME: what tokens are valid here.
// !!! FIXME: Also, the docs say "one of" inline or target, but I bet you can
// !!! FIXME: specify both.
Oct 28, 2010
Oct 28, 2010
119
%type function_storageclass { MOJOSHADER_astFunctionStorageClass }
Feb 19, 2010
Feb 19, 2010
120
//function_storageclass(A) ::= target(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
121
function_storageclass(A) ::= INLINE. { A = MOJOSHADER_AST_FNSTORECLS_INLINE; }
Feb 19, 2010
Feb 19, 2010
122
Oct 28, 2010
Oct 28, 2010
123
%type function_parameters { MOJOSHADER_astFunctionParameters * }
Oct 25, 2010
Oct 25, 2010
124
125
%destructor function_parameters { delete_function_params(ctx, $$); }
function_parameters(A) ::= VOID. { A = NULL; }
Oct 28, 2010
Oct 28, 2010
126
function_parameters(A) ::= function_parameter_list(B). { REVERSE_LINKED_LIST(MOJOSHADER_astFunctionParameters, B); A = B; }
Oct 25, 2010
Oct 25, 2010
127
function_parameters(A) ::= . { A = NULL; }
Feb 19, 2010
Feb 19, 2010
128
Oct 28, 2010
Oct 28, 2010
129
%type function_parameter_list { MOJOSHADER_astFunctionParameters * }
Oct 25, 2010
Oct 25, 2010
130
131
132
%destructor function_parameter_list { delete_function_params(ctx, $$); }
function_parameter_list(A) ::= function_parameter(B). { A = B; }
function_parameter_list(A) ::= function_parameter_list(B) COMMA function_parameter(C). { C->next = B; A = C; }
Feb 19, 2010
Feb 19, 2010
133
134
// !!! FIXME: this is pretty unreadable.
Oct 28, 2010
Oct 28, 2010
135
%type function_parameter { MOJOSHADER_astFunctionParameters * }
Oct 25, 2010
Oct 25, 2010
136
137
138
%destructor function_parameter { delete_function_params(ctx, $$); }
function_parameter(A) ::= input_modifier(B) datatype(C) IDENTIFIER(D) semantic(E) interpolation_mod(F) initializer(G). { A = new_function_param(ctx, B, C, D.string, E, F, G); }
function_parameter(A) ::= input_modifier(B) datatype(C) IDENTIFIER(D) semantic(E) interpolation_mod(F). { A = new_function_param(ctx, B, C, D.string, E, F, NULL); }
Oct 28, 2010
Oct 28, 2010
139
140
function_parameter(A) ::= input_modifier(B) datatype(C) IDENTIFIER(D) semantic(E) initializer(F). { A = new_function_param(ctx, B, C, D.string, E, MOJOSHADER_AST_INTERPMOD_NONE, F); }
function_parameter(A) ::= input_modifier(B) datatype(C) IDENTIFIER(D) semantic(E). { A = new_function_param(ctx, B, C, D.string, E, MOJOSHADER_AST_INTERPMOD_NONE, NULL); }
Oct 25, 2010
Oct 25, 2010
141
142
function_parameter(A) ::= input_modifier(B) datatype(C) IDENTIFIER(D) interpolation_mod(E) initializer(F). { A = new_function_param(ctx, B, C, D.string, NULL, E, F); }
function_parameter(A) ::= input_modifier(B) datatype(C) IDENTIFIER(D) interpolation_mod(E). { A = new_function_param(ctx, B, C, D.string, NULL, E, NULL); }
Oct 28, 2010
Oct 28, 2010
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
function_parameter(A) ::= input_modifier(B) datatype(C) IDENTIFIER(D) initializer(E). { A = new_function_param(ctx, B, C, D.string, NULL, MOJOSHADER_AST_INTERPMOD_NONE, E); }
function_parameter(A) ::= input_modifier(B) datatype(C) IDENTIFIER(D). { A = new_function_param(ctx, B, C, D.string, NULL, MOJOSHADER_AST_INTERPMOD_NONE, NULL); }
function_parameter(A) ::= datatype(B) IDENTIFIER(C) semantic(D) interpolation_mod(E) initializer(F). { A = new_function_param(ctx, MOJOSHADER_AST_INPUTMOD_NONE, B, C.string, D, E, F); }
function_parameter(A) ::= datatype(B) IDENTIFIER(C) semantic(D) interpolation_mod(E). { A = new_function_param(ctx, MOJOSHADER_AST_INPUTMOD_NONE, B, C.string, D, E, NULL); }
function_parameter(A) ::= datatype(B) IDENTIFIER(C) semantic(D) initializer(E). { A = new_function_param(ctx, MOJOSHADER_AST_INPUTMOD_NONE, B, C.string, D, MOJOSHADER_AST_INTERPMOD_NONE, E); }
function_parameter(A) ::= datatype(B) IDENTIFIER(C) semantic(D). { A = new_function_param(ctx, MOJOSHADER_AST_INPUTMOD_NONE, B, C.string, D, MOJOSHADER_AST_INTERPMOD_NONE, NULL); }
function_parameter(A) ::= datatype(B) IDENTIFIER(C) interpolation_mod(D) initializer(E). { A = new_function_param(ctx, MOJOSHADER_AST_INPUTMOD_NONE, B, C.string, NULL, D, E); }
function_parameter(A) ::= datatype(B) IDENTIFIER(C) interpolation_mod(D). { A = new_function_param(ctx, MOJOSHADER_AST_INPUTMOD_NONE, B, C.string, NULL, D, NULL); }
function_parameter(A) ::= datatype(B) IDENTIFIER(C) initializer(D). { A = new_function_param(ctx, MOJOSHADER_AST_INPUTMOD_NONE, B, C.string, NULL, MOJOSHADER_AST_INTERPMOD_NONE, D); }
function_parameter(A) ::= datatype(B) IDENTIFIER(C). { A = new_function_param(ctx, MOJOSHADER_AST_INPUTMOD_NONE, B, C.string, NULL, MOJOSHADER_AST_INTERPMOD_NONE, NULL); }
%type input_modifier { MOJOSHADER_astInputModifier }
input_modifier(A) ::= IN. { A = MOJOSHADER_AST_INPUTMOD_IN; }
input_modifier(A) ::= INOUT. { A = MOJOSHADER_AST_INPUTMOD_INOUT; }
input_modifier(A) ::= OUT. { A = MOJOSHADER_AST_INPUTMOD_OUT; }
input_modifier(A) ::= IN OUT. { A = MOJOSHADER_AST_INPUTMOD_INOUT; }
input_modifier(A) ::= OUT IN. { A = MOJOSHADER_AST_INPUTMOD_INOUT; }
input_modifier(A) ::= UNIFORM. { A = MOJOSHADER_AST_INPUTMOD_UNIFORM; }
Feb 19, 2010
Feb 19, 2010
161
162
%type semantic { const char * }
Feb 21, 2010
Feb 21, 2010
163
semantic(A) ::= COLON IDENTIFIER(B). { A = B.string; }
Mar 7, 2009
Mar 7, 2009
164
165
// DX10 only?
Oct 28, 2010
Oct 28, 2010
166
167
168
169
170
171
172
173
%type interpolation_mod { MOJOSHADER_astInterpolationModifier }
interpolation_mod(A) ::= LINEAR. { A = MOJOSHADER_AST_INTERPMOD_LINEAR; }
interpolation_mod(A) ::= CENTROID. { A = MOJOSHADER_AST_INTERPMOD_CENTROID; }
interpolation_mod(A) ::= NOINTERPOLATION. { A = MOJOSHADER_AST_INTERPMOD_NOINTERPOLATION; }
interpolation_mod(A) ::= NOPERSPECTIVE. { A = MOJOSHADER_AST_INTERPMOD_NOPERSPECTIVE; }
interpolation_mod(A) ::= SAMPLE. { A = MOJOSHADER_AST_INTERPMOD_SAMPLE; }
%type variable_declaration { MOJOSHADER_astVariableDeclaration * }
Feb 19, 2010
Feb 19, 2010
174
%destructor variable_declaration { delete_variable_declaration(ctx, $$); }
Oct 28, 2010
Oct 28, 2010
175
176
177
variable_declaration(A) ::= variable_attribute_list(B) datatype(C) variable_declaration_details_list(D) SEMICOLON. { REVERSE_LINKED_LIST(MOJOSHADER_astVariableDeclaration, D); A = D; A->attributes = B; A->datatype = C; }
variable_declaration(A) ::= datatype(B) variable_declaration_details_list(C) SEMICOLON. { REVERSE_LINKED_LIST(MOJOSHADER_astVariableDeclaration, C); A = C; A->datatype = B; }
variable_declaration(A) ::= struct_declaration(B) variable_declaration_details_list(C) SEMICOLON. { REVERSE_LINKED_LIST(MOJOSHADER_astVariableDeclaration, C); A = C; A->anonymous_datatype = B; }
Feb 19, 2010
Feb 19, 2010
178
179
180
181
182
183
%type variable_attribute_list { int }
variable_attribute_list(A) ::= variable_attribute(B). { A = B; }
variable_attribute_list(A) ::= variable_attribute_list(B) variable_attribute(C). { A = B | C; }
%type variable_attribute { int }
Oct 28, 2010
Oct 28, 2010
184
185
186
187
188
189
190
191
192
193
194
variable_attribute(A) ::= EXTERN. { A = MOJOSHADER_AST_VARATTR_EXTERN; }
variable_attribute(A) ::= NOINTERPOLATION. { A = MOJOSHADER_AST_VARATTR_NOINTERPOLATION; }
variable_attribute(A) ::= SHARED. { A = MOJOSHADER_AST_VARATTR_SHARED; }
variable_attribute(A) ::= STATIC. { A = MOJOSHADER_AST_VARATTR_STATIC; }
variable_attribute(A) ::= UNIFORM. { A = MOJOSHADER_AST_VARATTR_UNIFORM; }
variable_attribute(A) ::= VOLATILE. { A = MOJOSHADER_AST_VARATTR_VOLATILE; }
variable_attribute(A) ::= CONST. { A = MOJOSHADER_AST_VARATTR_CONST; }
variable_attribute(A) ::= ROWMAJOR. { A = MOJOSHADER_AST_VARATTR_ROWMAJOR; }
variable_attribute(A) ::= COLUMNMAJOR. { A = MOJOSHADER_AST_VARATTR_COLUMNMAJOR; }
%type variable_declaration_details_list { MOJOSHADER_astVariableDeclaration * }
Feb 19, 2010
Feb 19, 2010
195
196
197
198
%destructor variable_declaration_details_list { delete_variable_declaration(ctx, $$); }
variable_declaration_details_list(A) ::= variable_declaration_details(B). { A = B; }
variable_declaration_details_list(A) ::= variable_declaration_details_list(B) COMMA variable_declaration_details(C). { A = C; A->next = B; }
Oct 28, 2010
Oct 28, 2010
199
%type variable_declaration_details { MOJOSHADER_astVariableDeclaration * }
Feb 19, 2010
Feb 19, 2010
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
%destructor variable_declaration_details { delete_variable_declaration(ctx, $$); }
variable_declaration_details(A) ::= scalar_or_array(B) semantic(C) annotations(D) initializer(E) variable_lowlevel(F). { A = new_variable_declaration(ctx, B, C, D, E, F); }
variable_declaration_details(A) ::= scalar_or_array(B) semantic(C) annotations(D) initializer(E). { A = new_variable_declaration(ctx, B, C, D, E, NULL); }
variable_declaration_details(A) ::= scalar_or_array(B) semantic(C) annotations(D) variable_lowlevel(E). { A = new_variable_declaration(ctx, B, C, D, NULL, E); }
variable_declaration_details(A) ::= scalar_or_array(B) semantic(C) annotations(D). { A = new_variable_declaration(ctx, B, C, D, NULL, NULL); }
variable_declaration_details(A) ::= scalar_or_array(B) semantic(C) initializer(D) variable_lowlevel(E). { A = new_variable_declaration(ctx, B, C, NULL, D, E); }
variable_declaration_details(A) ::= scalar_or_array(B) semantic(C) initializer(D). { A = new_variable_declaration(ctx, B, C, NULL, D, NULL); }
variable_declaration_details(A) ::= scalar_or_array(B) semantic(C) variable_lowlevel(D). { A = new_variable_declaration(ctx, B, C, NULL, NULL, D); }
variable_declaration_details(A) ::= scalar_or_array(B) semantic(C). { A = new_variable_declaration(ctx, B, C, NULL, NULL, NULL); }
variable_declaration_details(A) ::= scalar_or_array(B) annotations(C) initializer(D) variable_lowlevel(E). { A = new_variable_declaration(ctx, B, NULL, C, D, E); }
variable_declaration_details(A) ::= scalar_or_array(B) annotations(C) initializer(D). { A = new_variable_declaration(ctx, B, NULL, C, D, NULL); }
variable_declaration_details(A) ::= scalar_or_array(B) annotations(C) variable_lowlevel(D). { A = new_variable_declaration(ctx, B, NULL, C, NULL, D); }
variable_declaration_details(A) ::= scalar_or_array(B) annotations(C). { A = new_variable_declaration(ctx, B, NULL, C, NULL, NULL); }
variable_declaration_details(A) ::= scalar_or_array(B) initializer(C) variable_lowlevel(D). { A = new_variable_declaration(ctx, B, NULL, NULL, C, D); }
variable_declaration_details(A) ::= scalar_or_array(B) initializer(C). { A = new_variable_declaration(ctx, B, NULL, NULL, C, NULL); }
variable_declaration_details(A) ::= scalar_or_array(B) variable_lowlevel(C). { A = new_variable_declaration(ctx, B, NULL, NULL, NULL, C); }
variable_declaration_details(A) ::= scalar_or_array(B). { A = new_variable_declaration(ctx, B, NULL, NULL, NULL, NULL); }
Mar 7, 2009
Mar 7, 2009
217
Mar 7, 2009
Mar 7, 2009
218
219
// !!! FIXME: we don't handle full sampler declarations at the moment.
Feb 19, 2010
Feb 19, 2010
220
Oct 28, 2010
Oct 28, 2010
221
%type struct_declaration { MOJOSHADER_astStructDeclaration * }
Feb 19, 2010
Feb 19, 2010
222
%destructor struct_declaration { delete_struct_declaration(ctx, $$); }
Oct 28, 2010
Oct 28, 2010
223
struct_declaration(A) ::= struct_intro(B) LBRACE struct_member_list(C) RBRACE. { REVERSE_LINKED_LIST(MOJOSHADER_astStructMembers, C); A = new_struct_declaration(ctx, B, C); }
Feb 22, 2010
Feb 22, 2010
224
225
226
// This has to be separate from struct_declaration so that the struct is in the usertypemap when parsing its members.
%type struct_intro { const char * }
Nov 2, 2010
Nov 2, 2010
227
struct_intro(A) ::= STRUCT IDENTIFIER(B). { A = B.string; push_usertype(ctx, A, "?"); }
Mar 7, 2009
Mar 7, 2009
228
Oct 28, 2010
Oct 28, 2010
229
%type struct_member_list { MOJOSHADER_astStructMembers * }
Feb 19, 2010
Feb 19, 2010
230
231
232
233
%destructor struct_member_list { delete_struct_member(ctx, $$); }
struct_member_list(A) ::= struct_member(B). { A = B; }
struct_member_list(A) ::= struct_member_list(B) struct_member(C). { A = C; A->next = B; }
Oct 28, 2010
Oct 28, 2010
234
%type struct_member { MOJOSHADER_astStructMembers * }
Feb 19, 2010
Feb 19, 2010
235
%destructor struct_member { delete_struct_member(ctx, $$); }
Oct 28, 2010
Oct 28, 2010
236
struct_member(A) ::= interpolation_mod(B) struct_member_details(C). { MOJOSHADER_astStructMembers *i = C; A = C; while (i) { i->interpolation_mod = B; i = i->next; } }
Feb 19, 2010
Feb 19, 2010
237
238
struct_member(A) ::= struct_member_details(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
239
%type struct_member_details { MOJOSHADER_astStructMembers * }
Feb 19, 2010
Feb 19, 2010
240
%destructor struct_member_details { delete_struct_member(ctx, $$); }
Oct 28, 2010
Oct 28, 2010
241
struct_member_details(A) ::= datatype(B) struct_member_item_list(C) SEMICOLON. { MOJOSHADER_astStructMembers *i = C; A = C; while (i) { i->datatype = B; i = i->next; } }
Feb 19, 2010
Feb 19, 2010
242
Oct 28, 2010
Oct 28, 2010
243
%type struct_member_item_list { MOJOSHADER_astStructMembers * }
Feb 19, 2010
Feb 19, 2010
244
245
246
247
248
%destructor struct_member_item_list { delete_struct_member(ctx, $$); }
struct_member_item_list(A) ::= scalar_or_array(B). { A = new_struct_member(ctx, B, NULL); }
struct_member_item_list(A) ::= scalar_or_array(B) semantic(C). { A = new_struct_member(ctx, B, C); }
struct_member_item_list(A) ::= struct_member_item_list(B) COMMA IDENTIFIER(C). { A = new_struct_member(ctx, new_scalar_or_array(ctx, C.string, 0, NULL), NULL); A->next = B; A->semantic = B->semantic; }
Oct 28, 2010
Oct 28, 2010
249
%type variable_lowlevel { MOJOSHADER_astVariableLowLevel * }
Feb 19, 2010
Feb 19, 2010
250
251
252
253
254
255
256
%destructor variable_lowlevel { delete_variable_lowlevel(ctx, $$); }
variable_lowlevel(A) ::= packoffset(B) register(C). { A = new_variable_lowlevel(ctx, B, C); }
variable_lowlevel(A) ::= register(B) packoffset(C). { A = new_variable_lowlevel(ctx, C, B); }
variable_lowlevel(A) ::= packoffset(B). { A = new_variable_lowlevel(ctx, B, NULL); }
variable_lowlevel(A) ::= register(B). { A = new_variable_lowlevel(ctx, NULL, B); }
// !!! FIXME: I sort of hate this type name.
Oct 28, 2010
Oct 28, 2010
257
%type scalar_or_array { MOJOSHADER_astScalarOrArray * }
Feb 19, 2010
Feb 19, 2010
258
259
260
261
262
%destructor scalar_or_array { delete_scalar_or_array(ctx, $$); }
scalar_or_array(A) ::= IDENTIFIER(B) LBRACKET RBRACKET. { A = new_scalar_or_array(ctx, B.string, 1, NULL); }
scalar_or_array(A) ::= IDENTIFIER(B) LBRACKET expression(C) RBRACKET. { A = new_scalar_or_array(ctx, B.string, 1, C); }
scalar_or_array(A) ::= IDENTIFIER(B). { A = new_scalar_or_array(ctx, B.string, 0, NULL); }
Oct 28, 2010
Oct 28, 2010
263
%type packoffset { MOJOSHADER_astPackOffset * }
Feb 19, 2010
Feb 19, 2010
264
265
266
267
268
269
270
271
272
273
%destructor packoffset { delete_pack_offset(ctx, $$); }
packoffset(A) ::= COLON PACKOFFSET LPAREN IDENTIFIER(B) DOT IDENTIFIER(C) RPAREN. { A = new_pack_offset(ctx, B.string, C.string); }
packoffset(A) ::= COLON PACKOFFSET LPAREN IDENTIFIER(B) RPAREN. { A = new_pack_offset(ctx, B.string, NULL); }
// !!! FIXME: can take a profile, like ": register(ps_5_0, s)"
// !!! FIXME: IDENTIFIER is wrong: "s[2]" works, apparently. Use scalar_or_array instead?
// !!! FIXME: (these might be SM4 features)
%type register { const char * }
register(A) ::= COLON REGISTER LPAREN IDENTIFIER(B) RPAREN. { A = B.string; }
Oct 28, 2010
Oct 28, 2010
274
%type annotations { MOJOSHADER_astAnnotations * }
Feb 19, 2010
Feb 19, 2010
275
%destructor annotations { delete_annotation(ctx, $$); }
Oct 28, 2010
Oct 28, 2010
276
annotations(A) ::= LT annotation_list(B) GT. { REVERSE_LINKED_LIST(MOJOSHADER_astAnnotations, B); A = B; }
Feb 19, 2010
Feb 19, 2010
277
Oct 28, 2010
Oct 28, 2010
278
%type annotation_list { MOJOSHADER_astAnnotations * }
Feb 19, 2010
Feb 19, 2010
279
280
281
282
283
%destructor annotation_list { delete_annotation(ctx, $$); }
annotation_list(A) ::= annotation(B). { A = B; }
annotation_list(A) ::= annotation_list(B) annotation(C). { A = C; A->next = B; }
// !!! FIXME: can this take a USERTYPE if we typedef'd a scalar type?
Oct 28, 2010
Oct 28, 2010
284
%type annotation { MOJOSHADER_astAnnotations * }
Feb 19, 2010
Feb 19, 2010
285
286
287
%destructor annotation { delete_annotation(ctx, $$); }
annotation(A) ::= datatype_scalar(B) initializer(C) SEMICOLON. { A = new_annotation(ctx, B, C); }
Oct 28, 2010
Oct 28, 2010
288
%type initializer_block_list { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
289
290
291
%destructor initializer_block_list { delete_expr(ctx, $$); }
initializer_block_list(A) ::= expression(B). { A = B; }
initializer_block_list(A) ::= LBRACE initializer_block_list(B) RBRACE. { A = B; }
Oct 28, 2010
Oct 28, 2010
292
initializer_block_list(A) ::= initializer_block_list(B) COMMA initializer_block_list(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_COMMA, B, C); }
Feb 19, 2010
Feb 19, 2010
293
Oct 28, 2010
Oct 28, 2010
294
%type initializer_block { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
295
296
297
%destructor initializer_block { delete_expr(ctx, $$); }
initializer_block(A) ::= LBRACE initializer_block_list(B) RBRACE. { A = B; }
Oct 28, 2010
Oct 28, 2010
298
%type initializer { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
%destructor initializer { delete_expr(ctx, $$); }
initializer(A) ::= ASSIGN initializer_block(B). { A = B; }
initializer(A) ::= ASSIGN expression(B). { A = B; }
%type intrinsic_datatype { const char * }
intrinsic_datatype(A) ::= datatype_vector(B). { A = B; }
intrinsic_datatype(A) ::= datatype_matrix(B). { A = B; }
intrinsic_datatype(A) ::= datatype_scalar(B). { A = B; }
intrinsic_datatype(A) ::= datatype_sampler(B). { A = B; }
%type datatype { const char * }
datatype(A) ::= intrinsic_datatype(B). { A = B; }
datatype(A) ::= USERTYPE(B). { A = B.string; }
%type datatype_sampler { const char * }
Oct 26, 2010
Oct 26, 2010
314
315
316
317
318
319
320
321
datatype_sampler(A) ::= SAMPLER. { A = ctx->str_s1; }
datatype_sampler(A) ::= SAMPLER1D. { A = ctx->str_s1; }
datatype_sampler(A) ::= SAMPLER2D. { A = ctx->str_s2; }
datatype_sampler(A) ::= SAMPLER3D. { A = ctx->str_s3; }
datatype_sampler(A) ::= SAMPLERCUBE. { A = ctx->str_sc; }
datatype_sampler(A) ::= SAMPLER_STATE. { A = ctx->str_ss; }
datatype_sampler(A) ::= SAMPLERSTATE. { A = ctx->str_ss; }
datatype_sampler(A) ::= SAMPLERCOMPARISONSTATE. { A = ctx->str_sS; }
Feb 19, 2010
Feb 19, 2010
322
323
%type datatype_scalar { const char * }
Oct 26, 2010
Oct 26, 2010
324
325
326
327
328
329
330
331
332
333
datatype_scalar(A) ::= BOOL. { A = ctx->str_b; }
datatype_scalar(A) ::= INT. { A = ctx->str_i; }
datatype_scalar(A) ::= UINT. { A = ctx->str_u; }
datatype_scalar(A) ::= HALF. { A = ctx->str_h; }
datatype_scalar(A) ::= FLOAT. { A = ctx->str_f; }
datatype_scalar(A) ::= DOUBLE. { A = ctx->str_d; }
datatype_scalar(A) ::= STRING. { A = ctx->str_S; } // this is for the effects framework, not HLSL.
datatype_scalar(A) ::= SNORM FLOAT. { A = ctx->str_ns; }
datatype_scalar(A) ::= UNORM FLOAT. { A = ctx->str_nu; }
datatype_scalar(A) ::= BUFFER LT datatype_scalar(B) GT. { A = stringcache_fmt(ctx->strcache, "B{%s}", B); }
Mar 7, 2009
Mar 7, 2009
334
335
336
337
338
339
// !!! FIXME: MSDN suggests that the matrix ones are just typedefs inserted
// !!! FIXME: before parsing begins, like:
// !!! FIXME: typedef matrix <bool,4,3> bool4x3;
// !!! FIXME: ...maybe we can rip these out of the grammar and just create
// !!! FIXME: them at startup?
Feb 19, 2010
Feb 19, 2010
340
%type datatype_vector { const char * }
Oct 26, 2010
Oct 26, 2010
341
datatype_vector(A) ::= VECTOR LT datatype_scalar(B) COMMA INT_CONSTANT(C) GT. { A = stringcache_fmt(ctx->strcache, "V{%d,%s}", (int) C.i64, B); }
Mar 7, 2009
Mar 7, 2009
342
Feb 19, 2010
Feb 19, 2010
343
%type datatype_matrix { const char * }
Oct 26, 2010
Oct 26, 2010
344
datatype_matrix(A) ::= MATRIX LT datatype_scalar(B) COMMA INT_CONSTANT(C) COMMA INT_CONSTANT(D) GT. { A = stringcache_fmt(ctx->strcache, "M{%d,%d,%s}", (int) C.i64, (int) D.i64, B); }
Mar 7, 2009
Mar 7, 2009
345
Oct 28, 2010
Oct 28, 2010
346
%type statement_block { MOJOSHADER_astStatement * }
Feb 19, 2010
Feb 19, 2010
347
%destructor statement_block { delete_statement(ctx, $$); }
Oct 13, 2010
Oct 13, 2010
348
statement_block(A) ::= LBRACE RBRACE. { A = new_block_statement(ctx, NULL); }
Oct 28, 2010
Oct 28, 2010
349
statement_block(A) ::= LBRACE statement_list(B) RBRACE. { REVERSE_LINKED_LIST(MOJOSHADER_astStatement, B); A = new_block_statement(ctx, B); }
Feb 27, 2009
Feb 27, 2009
350
Oct 28, 2010
Oct 28, 2010
351
%type statement_list { MOJOSHADER_astStatement * }
Feb 19, 2010
Feb 19, 2010
352
353
%destructor statement_list { delete_statement(ctx, $$); }
statement_list(A) ::= statement(B). { A = B; }
Feb 23, 2010
Feb 23, 2010
354
statement_list(A) ::= statement_list(B) statement(C). { A = C; A->next = B; }
Mar 7, 2009
Mar 7, 2009
355
Aug 26, 2009
Aug 26, 2009
356
// These are for Shader Model 4 and Xbox 360 only, apparently.
Feb 19, 2010
Feb 19, 2010
357
358
359
360
361
362
363
364
365
366
// !!! FIXME: ...so we ignore them for now.
// !!! FIXME: can these stack? "[isolate][unused]{}" or something?
%type statement_attribute { int }
statement_attribute(A) ::= ISOLATE. { A = 0; } // !!! FIXME
statement_attribute(A) ::= MAXINSTRUCTIONCOUNT LPAREN INT_CONSTANT RPAREN. { A = 0; } // !!! FIXME
statement_attribute(A) ::= NOEXPRESSIONOPTIMIZATIONS. { A = 0; } // !!! FIXME
statement_attribute(A) ::= REMOVEUNUSEDINPUTS. { A = 0; } // !!! FIXME
statement_attribute(A) ::= UNUSED. { A = 0; } // !!! FIXME
statement_attribute(A) ::= XPS. { A = 0; } // !!! FIXME
Oct 28, 2010
Oct 28, 2010
367
%type statement { MOJOSHADER_astStatement * }
Feb 19, 2010
Feb 19, 2010
368
369
370
371
372
373
374
375
376
377
378
%destructor statement { delete_statement(ctx, $$); }
statement(A) ::= BREAK SEMICOLON. { A = new_break_statement(ctx); }
statement(A) ::= CONTINUE SEMICOLON. { A = new_continue_statement(ctx); }
statement(A) ::= DISCARD SEMICOLON. { A = new_discard_statement(ctx); }
statement(A) ::= LBRACKET statement_attribute(B) RBRACKET statement_block(C). { A = C; /* !!! FIXME: A->attributes = B;*/ B = 0; }
statement(A) ::= variable_declaration(B). { A = new_vardecl_statement(ctx, B); }
statement(A) ::= struct_declaration(B) SEMICOLON. { A = new_struct_statement(ctx, B); }
statement(A) ::= do_intro(B) DO statement(C) WHILE LPAREN expression(D) RPAREN SEMICOLON. { A = new_do_statement(ctx, B, C, D); }
statement(A) ::= while_intro(B) LPAREN expression(C) RPAREN statement(D). { A = new_while_statement(ctx, B, C, D); }
statement(A) ::= if_intro(B) LPAREN expression(C) RPAREN statement(D). { A = new_if_statement(ctx, B, C, D, NULL); }
statement(A) ::= if_intro(B) LPAREN expression(C) RPAREN statement(D) ELSE statement(E). { A = new_if_statement(ctx, B, C, D, E); }
Oct 28, 2010
Oct 28, 2010
379
statement(A) ::= switch_intro(B) LPAREN expression(C) RPAREN LBRACE switch_case_list(D) RBRACE. { REVERSE_LINKED_LIST(MOJOSHADER_astSwitchCases, D); A = new_switch_statement(ctx, B, C, D); }
Feb 19, 2010
Feb 19, 2010
380
381
382
383
384
385
386
387
388
statement(A) ::= typedef(B). { A = new_typedef_statement(ctx, B); }
statement(A) ::= SEMICOLON. { A = new_empty_statement(ctx); }
statement(A) ::= expression(B) SEMICOLON. { A = new_expr_statement(ctx, B); }
statement(A) ::= RETURN SEMICOLON. { A = new_return_statement(ctx, NULL); }
statement(A) ::= RETURN expression(B) SEMICOLON. { A = new_return_statement(ctx, B); }
statement(A) ::= statement_block(B). { A = B; }
statement(A) ::= for_statement(B). { A = B; }
//statement(A) ::= error SEMICOLON. { A = NULL; } // !!! FIXME: research using the error nonterminal
Oct 28, 2010
Oct 28, 2010
389
%type while_intro { int }
Feb 19, 2010
Feb 19, 2010
390
391
392
while_intro(A) ::= LBRACKET UNROLL LPAREN INT_CONSTANT(B) RPAREN RBRACKET WHILE. { A = (B.i64 < 0) ? 0 : B.i64; }
while_intro(A) ::= LBRACKET UNROLL RBRACKET WHILE. { A = -1; }
while_intro(A) ::= LBRACKET LOOP RBRACKET WHILE. { A = 0; }
Feb 23, 2010
Feb 23, 2010
393
while_intro(A) ::= WHILE. { A = -2; }
Feb 19, 2010
Feb 19, 2010
394
Oct 28, 2010
Oct 28, 2010
395
%type for_statement { MOJOSHADER_astStatement * }
Feb 19, 2010
Feb 19, 2010
396
%destructor for_statement { delete_statement(ctx, $$); }
Oct 28, 2010
Oct 28, 2010
397
for_statement(A) ::= for_intro(B) for_details(C). { A = C; ((MOJOSHADER_astForStatement *) A)->unroll = B; }
Feb 19, 2010
Feb 19, 2010
398
Oct 28, 2010
Oct 28, 2010
399
%type for_intro { int }
Feb 19, 2010
Feb 19, 2010
400
401
402
for_intro(A) ::= LBRACKET UNROLL LPAREN INT_CONSTANT(B) RPAREN RBRACKET FOR. { A = (B.i64 < 0) ? 0 : B.i64; }
for_intro(A) ::= LBRACKET UNROLL RBRACKET FOR. { A = -1; }
for_intro(A) ::= LBRACKET LOOP RBRACKET FOR. { A = 0; }
Feb 23, 2010
Feb 23, 2010
403
for_intro(A) ::= FOR. { A = -2; }
Feb 19, 2010
Feb 19, 2010
404
Oct 28, 2010
Oct 28, 2010
405
%type for_details { MOJOSHADER_astStatement * }
Feb 19, 2010
Feb 19, 2010
406
407
408
409
410
411
412
413
414
415
416
417
418
419
%destructor for_details { delete_statement(ctx, $$); }
for_details(A) ::= LPAREN expression(B) SEMICOLON expression(C) SEMICOLON expression(D) RPAREN statement(E). { A = new_for_statement(ctx, NULL, B, C, D, E); }
for_details(A) ::= LPAREN SEMICOLON SEMICOLON RPAREN statement(B). { A = new_for_statement(ctx, NULL, NULL, NULL, NULL, B); }
for_details(A) ::= LPAREN SEMICOLON SEMICOLON expression(B) RPAREN statement(C). { A = new_for_statement(ctx, NULL, NULL, NULL, B, C); }
for_details(A) ::= LPAREN SEMICOLON expression(B) SEMICOLON RPAREN statement(C). { A = new_for_statement(ctx, NULL, NULL, B, NULL, C); }
for_details(A) ::= LPAREN SEMICOLON expression(B) SEMICOLON expression(C) RPAREN statement(D). { A = new_for_statement(ctx, NULL, NULL, B, C, D); }
for_details(A) ::= LPAREN expression(B) SEMICOLON SEMICOLON RPAREN statement(C). { A = new_for_statement(ctx, NULL, B, NULL, NULL, C); }
for_details(A) ::= LPAREN expression(B) SEMICOLON SEMICOLON expression(C) RPAREN statement(D). { A = new_for_statement(ctx, NULL, B, NULL, C, D); }
for_details(A) ::= LPAREN expression(B) SEMICOLON expression(C) SEMICOLON RPAREN statement(D). { A = new_for_statement(ctx, NULL, B, C, NULL, D); }
for_details(A) ::= LPAREN variable_declaration(B) expression(C) SEMICOLON expression(D) RPAREN statement(E). { A = new_for_statement(ctx, B, NULL, C, D, E); }
for_details(A) ::= LPAREN variable_declaration(B) SEMICOLON RPAREN statement(C). { A = new_for_statement(ctx, B, NULL, NULL, NULL, C); }
for_details(A) ::= LPAREN variable_declaration(B) SEMICOLON expression(C) RPAREN statement(D). { A = new_for_statement(ctx, B, NULL, C, NULL, D); }
for_details(A) ::= LPAREN variable_declaration(B) expression(C) SEMICOLON RPAREN statement(D). { A = new_for_statement(ctx, B, NULL, C, NULL, D); }
Oct 28, 2010
Oct 28, 2010
420
%type do_intro { int }
Feb 19, 2010
Feb 19, 2010
421
422
423
do_intro(A) ::= LBRACKET UNROLL LPAREN INT_CONSTANT(B) RPAREN RBRACKET DO. { A = (B.i64 < 0) ? 0 : (int) B.i64; }
do_intro(A) ::= LBRACKET UNROLL RBRACKET DO. { A = -1; }
do_intro(A) ::= LBRACKET LOOP RBRACKET DO. { A = 0; }
Feb 23, 2010
Feb 23, 2010
424
do_intro(A) ::= DO. { A = -2; }
Feb 19, 2010
Feb 19, 2010
425
426
%type if_intro { int }
Oct 28, 2010
Oct 28, 2010
427
428
429
430
431
432
433
if_intro(A) ::= LBRACKET BRANCH RBRACKET IF. { A = MOJOSHADER_AST_IFATTR_BRANCH; }
if_intro(A) ::= LBRACKET FLATTEN RBRACKET IF. { A = MOJOSHADER_AST_IFATTR_FLATTEN; }
if_intro(A) ::= LBRACKET IFALL RBRACKET IF. { A = MOJOSHADER_AST_IFATTR_IFALL; }
if_intro(A) ::= LBRACKET IFANY RBRACKET IF. { A = MOJOSHADER_AST_IFATTR_IFANY; }
if_intro(A) ::= LBRACKET PREDICATE RBRACKET IF. { A = MOJOSHADER_AST_IFATTR_PREDICATE; }
if_intro(A) ::= LBRACKET PREDICATEBLOCK RBRACKET IF. { A = MOJOSHADER_AST_IFATTR_PREDICATEBLOCK; }
if_intro(A) ::= IF. { A = MOJOSHADER_AST_IFATTR_NONE; }
Feb 19, 2010
Feb 19, 2010
434
435
%type switch_intro { int }
Oct 28, 2010
Oct 28, 2010
436
437
438
439
440
switch_intro(A) ::= LBRACKET FLATTEN RBRACKET SWITCH. { A = MOJOSHADER_AST_SWITCHATTR_FLATTEN; }
switch_intro(A) ::= LBRACKET BRANCH RBRACKET SWITCH. { A = MOJOSHADER_AST_SWITCHATTR_BRANCH; }
switch_intro(A) ::= LBRACKET FORCECASE RBRACKET SWITCH. { A = MOJOSHADER_AST_SWITCHATTR_FORCECASE; }
switch_intro(A) ::= LBRACKET CALL RBRACKET SWITCH. { A = MOJOSHADER_AST_SWITCHATTR_CALL; }
switch_intro(A) ::= SWITCH. { A = MOJOSHADER_AST_SWITCHATTR_NONE; }
Feb 19, 2010
Feb 19, 2010
441
Oct 28, 2010
Oct 28, 2010
442
%type switch_case_list { MOJOSHADER_astSwitchCases * }
Feb 19, 2010
Feb 19, 2010
443
444
445
%destructor switch_case_list { delete_switch_case(ctx, $$); }
switch_case_list(A) ::= switch_case(B). { A = B; }
switch_case_list(A) ::= switch_case_list(B) switch_case(C). { A = C; A->next = B; }
Mar 7, 2009
Mar 7, 2009
446
447
448
// You can do math here, apparently, as long as it produces an int constant.
// ...so "case 3+2:" works.
Oct 28, 2010
Oct 28, 2010
449
%type switch_case { MOJOSHADER_astSwitchCases * }
Feb 19, 2010
Feb 19, 2010
450
%destructor switch_case { delete_switch_case(ctx, $$); }
Oct 28, 2010
Oct 28, 2010
451
switch_case(A) ::= CASE expression(B) COLON statement_list(C). { REVERSE_LINKED_LIST(MOJOSHADER_astStatement, C); A = new_switch_case(ctx, B, C); }
Feb 19, 2010
Feb 19, 2010
452
switch_case(A) ::= CASE expression(B) COLON. { A = new_switch_case(ctx, B, NULL); }
Oct 28, 2010
Oct 28, 2010
453
switch_case(A) ::= DEFAULT COLON statement_list(B). { REVERSE_LINKED_LIST(MOJOSHADER_astStatement, B); A = new_switch_case(ctx, NULL, B); }
Feb 19, 2010
Feb 19, 2010
454
switch_case(A) ::= DEFAULT COLON. { A = new_switch_case(ctx, NULL, NULL); }
Mar 7, 2009
Mar 7, 2009
455
456
// the expression stuff is based on Jeff Lee's ANSI C grammar.
Oct 28, 2010
Oct 28, 2010
457
%type primary_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
458
%destructor primary_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
459
460
461
462
primary_expr(A) ::= IDENTIFIER(B). { A = new_identifier_expr(ctx, B.string); }
primary_expr(A) ::= INT_CONSTANT(B). { A = new_literal_int_expr(ctx, B.i64); }
primary_expr(A) ::= FLOAT_CONSTANT(B). { A = new_literal_float_expr(ctx, B.dbl); }
primary_expr(A) ::= STRING_LITERAL(B). { A = new_literal_string_expr(ctx, B.string); }
Oct 20, 2010
Oct 20, 2010
463
464
primary_expr(A) ::= TRUE. { A = new_literal_boolean_expr(ctx, 1); }
primary_expr(A) ::= FALSE. { A = new_literal_boolean_expr(ctx, 0); }
Feb 9, 2010
Feb 9, 2010
465
466
primary_expr(A) ::= LPAREN expression(B) RPAREN. { A = B; }
Oct 28, 2010
Oct 28, 2010
467
%type postfix_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
468
%destructor postfix_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
469
postfix_expr(A) ::= primary_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
470
postfix_expr(A) ::= postfix_expr(B) LBRACKET expression(C) RBRACKET. { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_DEREF_ARRAY, B, C); }
Oct 25, 2010
Oct 25, 2010
471
472
postfix_expr(A) ::= postfix_expr(B) arguments(C). { A = new_callfunc_expr(ctx, B, C); }
postfix_expr(A) ::= datatype(B) arguments(C). { A = new_constructor_expr(ctx, B, C); } // HLSL constructor
Oct 26, 2010
Oct 26, 2010
473
postfix_expr(A) ::= postfix_expr(B) DOT IDENTIFIER(C). { A = new_deref_struct_expr(ctx, B, C.string); }
Oct 28, 2010
Oct 28, 2010
474
475
postfix_expr(A) ::= postfix_expr(B) PLUSPLUS. { A = new_unary_expr(ctx, MOJOSHADER_AST_OP_POSTINCREMENT, B); }
postfix_expr(A) ::= postfix_expr(B) MINUSMINUS. { A = new_unary_expr(ctx, MOJOSHADER_AST_OP_POSTDECREMENT, B); }
Feb 9, 2010
Feb 9, 2010
476
Oct 28, 2010
Oct 28, 2010
477
%type arguments { MOJOSHADER_astArguments * }
Oct 25, 2010
Oct 25, 2010
478
479
%destructor arguments { delete_arguments(ctx, $$); }
arguments(A) ::= LPAREN RPAREN. { A = NULL; }
Oct 28, 2010
Oct 28, 2010
480
arguments(A) ::= LPAREN argument_list(B) RPAREN. { REVERSE_LINKED_LIST(MOJOSHADER_astArguments, B); A = B; }
Oct 25, 2010
Oct 25, 2010
481
Oct 28, 2010
Oct 28, 2010
482
%type argument_list { MOJOSHADER_astArguments * }
Oct 25, 2010
Oct 25, 2010
483
484
485
%destructor argument_list { delete_arguments(ctx, $$); }
argument_list(A) ::= assignment_expr(B). { A = new_argument(ctx, B); }
argument_list(A) ::= argument_list(B) COMMA assignment_expr(C). { A = new_argument(ctx, C); A->next = B; }
Feb 9, 2010
Feb 9, 2010
486
Oct 28, 2010
Oct 28, 2010
487
%type unary_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
488
489
%destructor unary_expr { delete_expr(ctx, $$); }
unary_expr(A) ::= postfix_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
490
491
unary_expr(A) ::= PLUSPLUS unary_expr(B). { A = new_unary_expr(ctx, MOJOSHADER_AST_OP_PREINCREMENT, B); }
unary_expr(A) ::= MINUSMINUS unary_expr(B). { A = new_unary_expr(ctx, MOJOSHADER_AST_OP_PREDECREMENT, B); }
Feb 9, 2010
Feb 9, 2010
492
unary_expr(A) ::= PLUS cast_expr(B). { A = B; } // unary "+x" is always a no-op, so throw it away here.
Oct 28, 2010
Oct 28, 2010
493
494
495
unary_expr(A) ::= MINUS cast_expr(B). { A = new_unary_expr(ctx, MOJOSHADER_AST_OP_NEGATE, B); }
unary_expr(A) ::= COMPLEMENT cast_expr(B). { A = new_unary_expr(ctx, MOJOSHADER_AST_OP_COMPLEMENT, B); }
unary_expr(A) ::= EXCLAMATION cast_expr(B). { A = new_unary_expr(ctx, MOJOSHADER_AST_OP_NOT, B); }
Feb 9, 2010
Feb 9, 2010
496
Oct 28, 2010
Oct 28, 2010
497
%type cast_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
498
%destructor cast_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
499
cast_expr(A) ::= unary_expr(B). { A = B; }
Feb 20, 2010
Feb 20, 2010
500
cast_expr(A) ::= LPAREN datatype(B) RPAREN cast_expr(C). { A = new_cast_expr(ctx, B, C); }
Feb 9, 2010
Feb 9, 2010
501
Oct 28, 2010
Oct 28, 2010
502
%type multiplicative_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
503
%destructor multiplicative_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
504
multiplicative_expr(A) ::= cast_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
505
506
507
multiplicative_expr(A) ::= multiplicative_expr(B) STAR cast_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_MULTIPLY, B, C); }
multiplicative_expr(A) ::= multiplicative_expr(B) SLASH cast_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_DIVIDE, B, C); }
multiplicative_expr(A) ::= multiplicative_expr(B) PERCENT cast_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_MODULO, B, C); }
Feb 9, 2010
Feb 9, 2010
508
Oct 28, 2010
Oct 28, 2010
509
%type additive_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
510
%destructor additive_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
511
additive_expr(A) ::= multiplicative_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
512
513
additive_expr(A) ::= additive_expr(B) PLUS multiplicative_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_ADD, B, C); }
additive_expr(A) ::= additive_expr(B) MINUS multiplicative_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_SUBTRACT, B, C); }
Feb 9, 2010
Feb 9, 2010
514
Oct 28, 2010
Oct 28, 2010
515
%type shift_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
516
%destructor shift_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
517
shift_expr(A) ::= additive_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
518
519
shift_expr(A) ::= shift_expr(B) LSHIFT additive_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_LSHIFT, B, C); }
shift_expr(A) ::= shift_expr(B) RSHIFT additive_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_RSHIFT, B, C); }
Feb 9, 2010
Feb 9, 2010
520
Oct 28, 2010
Oct 28, 2010
521
%type relational_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
522
%destructor relational_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
523
relational_expr(A) ::= shift_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
524
525
526
527
relational_expr(A) ::= relational_expr(B) LT shift_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_LESSTHAN, B, C); }
relational_expr(A) ::= relational_expr(B) GT shift_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_GREATERTHAN, B, C); }
relational_expr(A) ::= relational_expr(B) LEQ shift_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_LESSTHANOREQUAL, B, C); }
relational_expr(A) ::= relational_expr(B) GEQ shift_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_GREATERTHANOREQUAL, B, C); }
Feb 9, 2010
Feb 9, 2010
528
Oct 28, 2010
Oct 28, 2010
529
%type equality_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
530
%destructor equality_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
531
equality_expr(A) ::= relational_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
532
533
equality_expr(A) ::= equality_expr(B) EQL relational_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_EQUAL, B, C); }
equality_expr(A) ::= equality_expr(B) NEQ relational_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_NOTEQUAL, B, C); }
Feb 9, 2010
Feb 9, 2010
534
Oct 28, 2010
Oct 28, 2010
535
%type and_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
536
%destructor and_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
537
and_expr(A) ::= equality_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
538
and_expr(A) ::= and_expr(B) AND equality_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_BINARYAND, B, C); }
Feb 9, 2010
Feb 9, 2010
539
Oct 28, 2010
Oct 28, 2010
540
%type exclusive_or_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
541
%destructor exclusive_or_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
542
exclusive_or_expr(A) ::= and_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
543
exclusive_or_expr(A) ::= exclusive_or_expr(B) XOR and_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_BINARYXOR, B, C); }
Feb 9, 2010
Feb 9, 2010
544
Oct 28, 2010
Oct 28, 2010
545
%type inclusive_or_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
546
%destructor inclusive_or_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
547
inclusive_or_expr(A) ::= exclusive_or_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
548
inclusive_or_expr(A) ::= inclusive_or_expr(B) OR exclusive_or_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_BINARYOR, B, C); }
Feb 9, 2010
Feb 9, 2010
549
Oct 28, 2010
Oct 28, 2010
550
%type logical_and_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
551
%destructor logical_and_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
552
logical_and_expr(A) ::= inclusive_or_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
553
logical_and_expr(A) ::= logical_and_expr(B) ANDAND inclusive_or_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_LOGICALAND, B, C); }
Feb 9, 2010
Feb 9, 2010
554
Oct 28, 2010
Oct 28, 2010
555
%type logical_or_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
556
%destructor logical_or_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
557
logical_or_expr(A) ::= logical_and_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
558
logical_or_expr(A) ::= logical_or_expr(B) OROR logical_and_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_LOGICALOR, B, C); }
Feb 9, 2010
Feb 9, 2010
559
Oct 28, 2010
Oct 28, 2010
560
%type conditional_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
561
%destructor conditional_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
562
conditional_expr(A) ::= logical_or_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
563
conditional_expr(A) ::= logical_or_expr(B) QUESTION logical_or_expr(C) COLON conditional_expr(D). { A = new_ternary_expr(ctx, MOJOSHADER_AST_OP_CONDITIONAL, B, C, D); }
Feb 9, 2010
Feb 9, 2010
564
Oct 28, 2010
Oct 28, 2010
565
%type assignment_expr { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
566
%destructor assignment_expr { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
567
assignment_expr(A) ::= conditional_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
568
569
570
571
572
573
574
575
576
577
578
579
580
assignment_expr(A) ::= unary_expr(B) ASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_ASSIGN, B, C); }
assignment_expr(A) ::= unary_expr(B) MULASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_MULASSIGN, B, C); }
assignment_expr(A) ::= unary_expr(B) DIVASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_DIVASSIGN, B, C); }
assignment_expr(A) ::= unary_expr(B) MODASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_MODASSIGN, B, C); }
assignment_expr(A) ::= unary_expr(B) ADDASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_ADDASSIGN, B, C); }
assignment_expr(A) ::= unary_expr(B) SUBASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_SUBASSIGN, B, C); }
assignment_expr(A) ::= unary_expr(B) LSHIFTASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_LSHIFTASSIGN, B, C); }
assignment_expr(A) ::= unary_expr(B) RSHIFTASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_RSHIFTASSIGN, B, C); }
assignment_expr(A) ::= unary_expr(B) ANDASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_ANDASSIGN, B, C); }
assignment_expr(A) ::= unary_expr(B) XORASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_XORASSIGN, B, C); }
assignment_expr(A) ::= unary_expr(B) ORASSIGN assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_ORASSIGN, B, C); }
%type expression { MOJOSHADER_astExpression * }
Feb 19, 2010
Feb 19, 2010
581
%destructor expression { delete_expr(ctx, $$); }
Feb 9, 2010
Feb 9, 2010
582
expression(A) ::= assignment_expr(B). { A = B; }
Oct 28, 2010
Oct 28, 2010
583
expression(A) ::= expression(B) COMMA assignment_expr(C). { A = new_binary_expr(ctx, MOJOSHADER_AST_OP_COMMA, B, C); }
Feb 27, 2009
Feb 27, 2009
584
585
// end of mojoshader_parser_hlsl.lemon ...