3 using System.Collections.Generic;
4 using System.Diagnostics.CodeAnalysis;
7 using SiliconStudio.Shaders.Ast;
8 using SiliconStudio.Shaders.Utility;
10 namespace SiliconStudio.Shaders.
Grammar
18 [SuppressMessage(
"StyleCop.CSharp.DocumentationRules",
"SA1600:ElementsMustBeDocumented", Justification =
"Reviewed. Suppression is OK here.")]
19 [SuppressMessage(
"StyleCop.CSharp.NamingRules",
"SA1310:FieldNamesMustNotContainUnderscore", Justification =
"Reviewed. Suppression is OK here.")]
20 [SuppressMessage(
"StyleCop.CSharp.NamingRules",
"SA1304:NonPrivateReadonlyFieldsMustBeginWithUpperCaseLetter", Justification =
"Reviewed. Suppression is OK here.")]
21 public abstract partial class ShaderGrammar : Irony.
Parsing.
Grammar
38 public readonly
NonTerminal boolean = T(
"boolean", (context, node) => node.AstNode =
bool.Parse(node.ChildNodes[0].Token.Text));
43 public readonly
Terminal unknown =
new Terminal(
"unknown", Irony.Parsing.TokenCategory.Content);
54 protected readonly
NonTerminal additive_expression = TT(
"additive_expression");
55 protected readonly
NonTerminal additive_expression_raw = T(
"additive_expression_raw", CreateBinaryExpressionAst);
56 protected readonly
NonTerminal and_expression = TT(
"and_expression");
57 protected readonly
NonTerminal and_expression_raw = T(
"and_expression_raw", CreateBinaryExpressionAst);
58 protected readonly
NonTerminal argument_expression_list = T(
"argument_expression_list", CreateListFromNode<Expression>);
59 protected readonly
NonTerminal array_initializer_expression = T(
"array_initializer_expression", CreateArrayInitializerExpressionAst);
60 protected readonly
NonTerminal assignment_expression = TT(
"assignment_expression");
61 protected readonly
NonTerminal assignment_expression_raw = T(
"assignment_expression_raw", CreateAssignementExpressionAst);
62 protected readonly
NonTerminal assignment_operator = T(
"assignment_operator", CreateAssignmentOperator);
63 protected readonly
NonTerminal attribute_qualifier_pre = TT(
"attribute_qualifier_pre");
65 protected readonly
NonTerminal block_statement = T(
"block_statement", CreateBlockStatementAst);
66 protected readonly
NonTerminal break_statement = T(
"break_statement", CreateExpressionStatementAst);
67 protected readonly
NonTerminal cast_expression = TT(
"cast_expression");
68 protected readonly
NonTerminal conditional_expression = TT(
"conditional_expression");
69 protected readonly
NonTerminal conditional_expression_raw = T(
"conditional_expression_raw", CreateConditionalExpressionAst);
70 protected readonly
NonTerminal constant_expression = TT(
"constant_expression");
71 protected readonly
NonTerminal continue_statement = T(
"continue_statement", CreateExpressionStatementAst);
72 protected readonly
NonTerminal declaration = TT(
"declaration");
73 protected readonly
NonTerminal declaration_specifiers = T(
"declaration_specifiers", CreateDeclarationSpecifier);
74 protected readonly
NonTerminal declaration_statement = T(
"declaration_statement", CreateDeclarationStatementAst);
75 protected readonly
NonTerminal discard_statement = T(
"discard_statement", CreateExpressionStatementAst);
76 protected readonly
NonTerminal do_while_statement = T(
"do_while_statement", CreateDoWhileStatementAst);
77 protected readonly
NonTerminal empty_statement = T(
"empty_statement", CreateEmptyStatementAst);
78 protected readonly
NonTerminal equality_expression = TT(
"equality_expression");
79 protected readonly
NonTerminal equality_expression_raw = T(
"equality_expression_raw", CreateBinaryExpressionAst);
80 protected readonly
NonTerminal exclusive_or_expression = TT(
"exclusive_or_expression");
81 protected readonly
NonTerminal exclusive_or_expression_raw = T(
"exclusive_or_expression_raw", CreateBinaryExpressionAst);
83 protected readonly
NonTerminal expression_list = T(
"expression_list", CreateExpressionListAst);
84 protected readonly
NonTerminal expression_or_empty = T(
"expression_or_empty", CreateExpressionOrEmptyAst);
85 protected readonly
NonTerminal expression_statement = T(
"expression_statement", CreateExpressionStatementAst);
86 protected readonly
NonTerminal for_statement = T(
"for_statement", CreateForStatementAst);
87 protected readonly
NonTerminal field_declaration = T(
"field_declaration", CheckFieldDeclarationAst);
88 protected readonly
NonTerminal identifier_list = T(
"identifier_list", CreateIdentifierListAst);
89 protected readonly
NonTerminal if_statement = T(
"if_terminal", CreateIfStatementAst);
90 protected readonly
NonTerminal inclusive_or_expression = TT(
"inclusive_or_expression");
91 protected readonly
NonTerminal inclusive_or_expression_raw = T(
"inclusive_or_expression_raw", CreateBinaryExpressionAst);
92 protected readonly
NonTerminal incr_or_decr = TT(
"incr_or_decr");
93 protected readonly
NonTerminal identifier_extended = T(
"identifier_extended", CreateIdentifierAst);
94 protected readonly
NonTerminal indexable_identifier = T(
"identifier_indexable", CreateIdentifierIndexableAst);
95 protected readonly
NonTerminal indexable_identifier_declarator = T(
"indexable_identifier_declarator", CreateIdentifierIndexableAst);
96 protected readonly
NonTerminal indexer_expression = T(
"indexer-expression", CreateIndexerExpressionAst);
97 protected readonly
NonTerminal initializer = TT(
"initializer");
98 protected readonly
NonTerminal initializer_list = T(
"initializer_list", CreateListFromNode<Expression>);
99 protected readonly
NonTerminal iteration_statement = TT(
"iteration_statement");
100 protected readonly
NonTerminal jump_statement = TT(
"jump_statement");
101 protected readonly
NonTerminal literal = T(
"literal", CreateLiteralAst);
102 protected readonly
NonTerminal literal_expression = T(
"literal-expression", CreateLiteralExpressionAst);
103 protected readonly
NonTerminal literal_list = T(
"literal_list", CreateListFromNode<Literal>);
104 protected readonly
NonTerminal logical_and_expression = TT(
"logical_and_expression");
105 protected readonly
NonTerminal logical_and_expression_raw = T(
"logical_and_expression_raw", CreateBinaryExpressionAst);
106 protected readonly
NonTerminal logical_or_expression = TT(
"logical_or_expression");
107 protected readonly
NonTerminal logical_or_expression_raw = T(
"logical_or_expression_raw", CreateBinaryExpressionAst);
109 protected readonly
NonTerminal matrix_type_simple = T(
"matrix_type_simple");
110 protected readonly
NonTerminal matrix_type_list = TT(
"matricx_type_list");
111 protected readonly
NonTerminal member_reference_expression = T(
"member_reference_expression", CreateMemberReferenceExpressionAst);
112 protected readonly
NonTerminal method_declaration = T(
"method_declaration", CreateMethodDeclarationAst);
113 protected readonly
NonTerminal method_declaration_raw = T(
"method_declaration_raw", CreateMethodDeclarationRawAst);
114 protected readonly
NonTerminal method_declarator = T(
"method_declarator", CreateMethodDeclaratorAst);
115 protected readonly
NonTerminal method_definition = T(
"method_definition", CreateMethodDefinitionAst);
116 protected readonly
NonTerminal method_definition_or_declaration = TT(
"method_definition_or_declaration");
117 protected readonly
NonTerminal method_invoke_expression = T(
"method_invoke_expression", CreateMethodInvokeExpressionAst);
118 protected readonly
NonTerminal method_invoke_expression_simple = T(
"method_invoke_expression_simple", CreateMethodInvokeExpressionAst);
119 protected readonly
NonTerminal method_qualifier_post = TT(
"method_qualifier_post");
120 protected readonly
NonTerminal multiplicative_expression = TT(
"multiplicative_expression");
121 protected readonly
NonTerminal multiplicative_expression_raw = T(
"multiplicative_expression_raw", CreateBinaryExpressionAst);
123 protected readonly
NonTerminal parameter_declaration = T(
"parameter_declaration");
124 protected readonly
NonTerminal parameter_list = T(
"parameter_list", CreateListFromNode<Parameter>);
125 protected readonly
NonTerminal parameter_qualifier_pre = T(
"parameter_qualifier_pre");
126 protected readonly
NonTerminal parameter_qualifier_post = T(
"parameter_qualifier_post");
127 protected readonly
NonTerminal parameter_type = TT(
"parameter_type");
128 protected readonly
NonTerminal parenthesized_expression = T(
"parenthesized_expression", CreateParenthesizedExpressionAst);
129 protected readonly
NonTerminal post_incr_decr_expression = T(
"post_incr_decr_expression", CreatePostfixUnaryExpressionAst);
130 protected readonly
NonTerminal postfix_expression = TT(
"postfix_expression");
131 protected readonly
NonTerminal primary_expression = TT(
"primary-expression");
132 protected readonly
NonTerminal rank_specifier = T(
"rank_specifier", CreateRankSpecifierAst);
133 protected readonly
NonTerminal rank_specifier_empty = T(
"rank_specifier_empty", CreateRankSpecifierAst);
134 protected readonly
NonTerminal relational_expression = TT(
"relational_expression");
135 protected readonly
NonTerminal relational_expression_raw = T(
"relational_expression_raw", CreateBinaryExpressionAst);
136 protected readonly
NonTerminal return_statement = T(
"return_statement", CreateReturnStatementAst);
139 protected readonly
NonTerminal scalars_and_vectors = TT(
"scalars_and_vectors");
140 protected readonly
NonTerminal scalars_or_typename = TT(
"scalars_or_typename");
141 protected readonly
NonTerminal scope_declaration = TT(
"scope_declaration");
142 protected readonly
NonTerminal selection_statement = TT(
"selection_statement");
143 protected readonly
NonTerminal shader = T(
"shader", CreateShaderAst);
144 protected readonly
NonTerminal shift_expression = TT(
"shift_expression");
145 protected readonly
NonTerminal shift_expression_raw = T(
"shift_expression_raw", CreateBinaryExpressionAst);
146 protected readonly
NonTerminal simple_assignment_expression_statement = T(
"simple_assignment_expression_statement", CreateAssignementExpressionAst);
148 protected readonly
NonTerminal simple_type_or_type_name = TT(
"simple_type_or_type_name");
149 protected readonly
NonTerminal statement = T(
"Statement", CreateStatementAst);
150 protected readonly
NonTerminal statement_raw = TT(
"statement_raw");
151 protected readonly
NonTerminal storage_qualifier = T(
"storage_qualifier");
152 protected readonly
NonTerminal storage_qualifier_list_opt = T(
"storage_qualifier_list_opt", CreateQualifiers);
153 protected readonly
NonTerminal struct_specifier = T(
"struct_specifier", CreateStructureAst);
154 protected readonly
NonTerminal switch_case_group = T(
"switch_case_group", CreateSwitchCastGroupAst);
155 protected readonly
NonTerminal switch_case_statement = T(
"switch_case_statement", CreateCaseStatementAst);
156 protected readonly
NonTerminal switch_statement = T(
"switch_statement", CreateSwitchStatementAst);
157 protected readonly
NonTerminal toplevel_declaration = TT(
"toplevel_declaration");
158 protected readonly
NonTerminal toplevel_declaration_list = T(
"toplevel_declaration_list", CreateListFromNode<Node>);
160 protected readonly
NonTerminal type_for_cast = TT(
"type_for_cast");
161 protected readonly
NonTerminal type_name = T(
"type_name", CreateTypeNameAst);
162 protected readonly
NonTerminal typename_for_cast = T(
"typename_for_cast", CreateTypeNameAst);
163 protected readonly
NonTerminal unary_expression = TT(
"unary_expression");
164 protected readonly
NonTerminal unary_expression_raw = T(
"unary_expression_raw", CreateUnaryExpressionAst);
165 protected readonly
NonTerminal unary_operator = TT(
"unary_operator");
167 protected readonly
NonTerminal type_reference_expression = T(
"type_reference_expression", CreateTypeReferenceExpression);
168 protected readonly
NonTerminal variable_declaration = T(
"variable_declaration", CreateVariableGroupAst);
169 protected readonly
NonTerminal variable_declaration_raw = T(
"variable_declaration_raw", CreateVariableGroupRawAst);
170 protected readonly
NonTerminal variable_declarator = T(
"variable_declarator");
171 protected readonly
NonTerminal variable_declarator_raw = T(
"variable_declarator_raw");
172 protected readonly
NonTerminal variable_declarator_qualifier_post = TT(
"variable_declarator_qualifier_post");
173 protected readonly
NonTerminal variable_declarator_list = T(
"variable_declarator_list", CreateListFromNode<Variable>);
174 protected readonly
NonTerminal variable_identifier = T(
"variable_identifier", CreateVariableReferenceExpressionAst);
180 protected readonly
NonTerminal vector_type_list = TT(
"vector_type_list");
181 protected readonly
NonTerminal void_type = T(
"void_type", (context, node) => Ast<TypeName>(node).Name =
new Identifier(
"void") { Span = SpanConverter.Convert(node.Span) });
182 protected readonly
NonTerminal while_statement = T(
"while_statement", CreateWhileStatementAst);
186 internal Dictionary<TokenType, Terminal> TokenTypeToTerminals =
new Dictionary<TokenType, Terminal>();
193 GrammarComments =
"Shader abstract";
263 Op(
"<<=",
TokenType.BitwiseShiftLeftAssign);
264 Op(
">>=",
TokenType.BitwiseShiftRightAssign);
272 NonGrammarTerminals.Add(single_line_comment);
273 NonGrammarTerminals.Add(multi_line_comment);
275 identifier.Rule = identifier_raw;
276 identifier_raw.AstNodeCreator = CreateIdentifierAst;
278 semi_opt.Rule = Empty | PreferShiftHere() +
";";
280 less_than.Rule =
"<";
287 number.Rule = integer_literal | float_literal;
288 integer_literal.AstNodeCreator = CreateIntegerLiteral;
289 float_literal.AstNodeCreator = CreateFloatLiteral;
295 literal.Rule = number | boolean;
298 scalars_and_vectors.Rule = vector_type_list | scalars | type_name;
300 scalars_or_typename.Rule = scalars | type_name;
306 simple_type.Rule = scalars
311 value_type.Rule = simple_type
315 object_type.Rule = sampler_type;
318 void_type.Rule =
Keyword(
"void");
321 type.Rule = type_name
327 parameter_type.Rule = type_name
331 simple_type_or_type_name.Rule = type_name | simple_type;
335 type_reference_expression.Rule = simple_type;
340 field_declaration.Rule = variable_declaration;
342 struct_specifier.Rule =
Keyword(
"struct") + identifier.Opt() +
"{" + field_declaration.ListOpt() +
"}";
349 primary_expression.Rule = variable_identifier | literal_expression | parenthesized_expression;
351 identifier_extended.Rule = identifier;
353 variable_identifier.Rule = identifier_extended;
355 literal_expression.Rule = literal;
357 parenthesized_expression.Rule =
"(" + expression +
")";
360 postfix_expression.Rule = primary_expression
362 | method_invoke_expression
363 | member_reference_expression
364 | post_incr_decr_expression;
366 indexer_expression.Rule = postfix_expression + rank_specifier;
368 method_invoke_expression_simple.Rule = identifier +
"(" + argument_expression_list.Opt() +
")";
371 method_invoke_expression.Rule = type_reference_expression +
"(" + argument_expression_list.Opt() +
")"
372 | postfix_expression +
"(" + argument_expression_list.Opt() +
")";
374 member_reference_expression.Rule = postfix_expression +
"." + identifier;
376 post_incr_decr_expression.Rule = postfix_expression + incr_or_decr;
378 argument_expression_list.Rule = MakePlusRule(argument_expression_list, ToTerm(
","), assignment_expression);
381 unary_expression_raw.Rule = incr_or_decr + unary_expression
382 | unary_operator + cast_expression;
384 unary_expression.Rule = postfix_expression
385 | unary_expression_raw;
387 incr_or_decr.Rule = ToTerm(
"++") |
"--";
389 unary_operator.Rule = ToTerm(
"+") |
"-" |
"!" |
"~" |
"*";
391 cast_expression.Rule = unary_expression;
394 multiplicative_expression_raw.Rule = multiplicative_expression +
"*" + cast_expression
395 | multiplicative_expression +
"/" + cast_expression
396 | multiplicative_expression +
"%" + cast_expression;
398 multiplicative_expression.Rule = cast_expression | multiplicative_expression_raw;
401 additive_expression_raw.Rule = additive_expression +
"+" + multiplicative_expression | additive_expression +
"-" + multiplicative_expression;
403 additive_expression.Rule = multiplicative_expression | additive_expression_raw;
406 shift_expression_raw.Rule = shift_expression +
"<<" + additive_expression | shift_expression +
">>" + additive_expression;
408 shift_expression.Rule = additive_expression | shift_expression_raw;
411 relational_expression_raw.Rule = relational_expression + less_than + shift_expression | relational_expression +
">" + shift_expression
412 | relational_expression +
"<=" + shift_expression | relational_expression +
">=" + shift_expression;
414 relational_expression.Rule = shift_expression | relational_expression_raw;
417 equality_expression_raw.Rule = equality_expression +
"==" + relational_expression | equality_expression +
"!=" + relational_expression;
419 equality_expression.Rule = relational_expression | equality_expression_raw;
422 and_expression_raw.Rule = and_expression +
"&" + equality_expression;
424 and_expression.Rule = equality_expression
425 | and_expression_raw;
428 exclusive_or_expression_raw.Rule = exclusive_or_expression +
"^" + and_expression;
429 exclusive_or_expression.Rule = and_expression
430 | exclusive_or_expression_raw;
433 inclusive_or_expression_raw.Rule = inclusive_or_expression +
"|" + exclusive_or_expression;
435 inclusive_or_expression.Rule = exclusive_or_expression | inclusive_or_expression_raw;
438 logical_and_expression_raw.Rule = logical_and_expression +
"&&" + inclusive_or_expression;
440 logical_and_expression.Rule = inclusive_or_expression | logical_and_expression_raw;
443 logical_or_expression_raw.Rule = logical_or_expression +
"||" + logical_and_expression;
445 logical_or_expression.Rule = logical_and_expression
446 | logical_or_expression_raw;
449 conditional_expression.Rule = logical_or_expression
450 | conditional_expression_raw;
452 conditional_expression_raw.Rule = logical_or_expression +
"?" + expression +
":" + conditional_expression;
455 assignment_expression.Rule = conditional_expression
456 | assignment_expression_raw;
458 assignment_expression_raw.Rule = unary_expression + assignment_operator + assignment_expression;
460 assignment_operator.Rule = ToTerm(
"=") |
"+=" |
"-=" |
"*=" |
"/=" |
"%=" |
"&=" |
"|=" |
"^=" |
"<<=" |
">>=";
463 expression.Rule = expression_list;
465 expression_list.Rule = MakePlusRule(expression_list, ToTerm(
","), assignment_expression);
468 expression_or_empty.Rule = Empty | expression;
471 rank_specifier.Rule =
"[" + expression +
"]";
472 rank_specifier_empty.Rule =
"[" + expression_or_empty +
"]";
474 simple_assignment_expression_statement.Rule = indexable_identifier + assignment_operator + expression +
";";
476 indexable_identifier.Rule = identifier_extended + rank_specifier.ListOpt();
478 indexable_identifier_declarator.Rule = identifier_extended + rank_specifier_empty.ListOpt();
481 constant_expression.Rule = conditional_expression;
488 storage_qualifier.AstNodeCreator = CreateStorageQualifier;
490 storage_qualifier_list_opt.Rule = Empty | storage_qualifier.List();
496 variable_declarator_qualifier_post.Rule = null;
501 declaration.Rule = variable_declaration;
503 variable_declaration.Rule = attribute_qualifier_pre + variable_declaration_raw;
505 variable_declaration_raw.Rule = declaration_specifiers + variable_declarator_list.Opt() +
";";
507 declaration_specifiers.Rule = type
508 | storage_qualifier.List() + type;
510 variable_declarator_list.Rule = MakePlusRule(variable_declarator_list, ToTerm(
","), variable_declarator);
512 variable_declarator_raw.Rule = indexable_identifier_declarator + variable_declarator_qualifier_post;
513 variable_declarator_raw.AstNodeCreator = CreateVariableDeclaratorRawAst;
515 variable_declarator.Rule = variable_declarator_raw
516 | variable_declarator_raw +
"=" + initializer;
517 variable_declarator.AstNodeCreator = CreateVariableDeclaratorAst;
519 initializer.Rule = assignment_expression
520 | array_initializer_expression;
522 array_initializer_expression.Rule =
"{" + initializer_list +
"}"
523 |
"{" + initializer_list +
"," +
"}";
525 initializer_list.Rule = MakePlusRule(initializer_list, ToTerm(
","), initializer);
528 attribute_qualifier_pre.Rule = null;
531 method_qualifier_post.Rule = null;
533 method_declaration_raw.Rule = attribute_qualifier_pre + declaration_specifiers + method_declarator + method_qualifier_post;
535 method_declaration.Rule = method_declaration_raw +
";";
537 var optional_block_statement_list = block_item.ListOpt();
538 method_definition.Rule = method_declaration_raw +
"{" + optional_block_statement_list +
"}" + semi_opt;
541 method_definition_or_declaration.Rule = method_declaration | method_definition;
543 method_declarator.Rule = identifier +
"(" + parameter_list +
")"
544 | identifier +
"(" +
"void" +
")"
545 | identifier +
"(" +
")";
547 parameter_list.Rule = MakePlusRule(parameter_list, ToTerm(
","), parameter_declaration);
550 parameter_qualifier_pre.Rule = null;
551 parameter_qualifier_post.Rule = null;
553 parameter_declaration.Rule = attribute_qualifier_pre + parameter_qualifier_pre + parameter_type + indexable_identifier.Opt() + parameter_qualifier_post;
554 parameter_declaration.AstNodeCreator = CreateParameterAst;
556 identifier_list.Rule = MakePlusRule(identifier_list, ToTerm(
","), identifier);
561 statement.Rule = attribute_qualifier_pre + statement_raw;
563 statement_raw.Rule = discard_statement
565 | expression_statement
566 | selection_statement
567 | iteration_statement
570 discard_statement.Rule =
Keyword(
"discard") +
";";
575 block_statement.Rule =
"{" + optional_block_statement_list +
"}";
578 optional_block_statement_list.ErrorRule =
SyntaxError +
";";
580 declaration_statement.Rule = declaration;
582 block_item.Rule = declaration_statement
585 empty_statement.Rule =
";";
587 expression_statement.Rule = empty_statement
590 selection_statement.Rule = if_statement
593 iteration_statement.Rule = while_statement
597 if_statement.Rule =
Keyword(
"if") +
"(" + expression +
")" + statement
598 |
Keyword(
"if") +
"(" + expression +
")" + statement + PreferShiftHere() +
Keyword(
"else") + statement;
601 switch_statement.Rule =
Keyword(
"switch") +
"(" + expression +
")" +
"{" + switch_case_group.ListOpt() +
"}";
603 switch_case_group.Rule = switch_case_statement.List() + statement.List();
605 switch_case_statement.Rule =
Keyword(
"case") + constant_expression +
":"
608 while_statement.Rule =
Keyword(
"while") +
"(" + expression +
")" + statement;
610 do_while_statement.Rule =
Keyword(
"do") + statement +
"while" +
"(" + expression +
")" +
";";
612 for_statement.Rule =
Keyword(
"for") +
"(" + expression_statement + expression.Opt() +
";" + expression.Opt() +
")" + statement
613 |
Keyword(
"for") +
"(" + variable_declaration_raw + expression.Opt() +
";" + expression.Opt() +
")" + statement;
615 break_statement.Rule =
Keyword(
"break") +
";";
616 continue_statement.Rule =
Keyword(
"continue") +
";";
617 return_statement.Rule =
Keyword(
"return") +
";" |
Keyword(
"return") + expression +
";";
619 jump_statement.Rule = continue_statement
623 literal_list.Rule = MakePlusRule(literal_list, ToTerm(
","), literal);
628 toplevel_declaration.Rule = scope_declaration;
630 scope_declaration.Rule = method_definition_or_declaration | declaration | empty_statement;
632 toplevel_declaration_list.Rule = MakeStarRule(toplevel_declaration_list, null, toplevel_declaration);
634 shader.Rule = toplevel_declaration_list;
652 Delimiters =
"{}[](),:;+-*/%&|^!~<>=";
653 MarkPunctuation(
";",
",",
":");
656 LineTerminators =
"\r\n\u2085\u2028\u2029";
659 WhitespaceChars =
" \t\r\n\v\u2085\u2028\u2029";
ShaderGrammar()
Initializes a new instance of the ShaderGrammar class.