5 using SiliconStudio.Paradox.Shaders.Parser.Ast;
6 using SiliconStudio.Shaders.Ast;
7 using SiliconStudio.Shaders.Grammar;
8 using SiliconStudio.Shaders.Grammar.Hlsl;
12 [Language(
"hotei2",
"5.0",
"Paradox2 hlsl grammar")]
15 protected readonly
NonTerminal semantic_type = T(
"semantic_type", CreateSemanticTypeAst);
16 protected readonly
NonTerminal link_type = T(
"link_type", CreateLinkTypeAst);
17 protected readonly
NonTerminal var_type = T(
"var_type", CreateVarTypeAst);
18 protected readonly
NonTerminal foreach_statement = T(
"foreach_statement", CreateForEachStatementAst);
19 protected readonly
NonTerminal foreach_params_statement = T(
"foreach_params_statement", CreateForEachParamsStatementAst);
20 protected readonly
NonTerminal class_type = T(
"class_type", CreateClassTypeAst);
21 protected readonly
NonTerminal params_block = T(
"params_block", CreateParametersAst);
22 protected readonly
NonTerminal shader_block = T(
"shader_block", CreateShaderBlockAst);
23 protected readonly
NonTerminal toplevel_declaration_block = T(
"toplevel_declaration_block", CreateDeclarationBlockAst);
24 protected readonly
NonTerminal mixin_statement = T(
"mixin_statement", CreateMixinStatementAst);
25 protected readonly
NonTerminal using_statement = T(
"using_statement", CreateUsingStatement);
26 protected readonly
NonTerminal using_params_statement = T(
"using_params_statement", CreateUsingParametersStatement);
27 protected readonly
NonTerminal enum_block = T(
"enum_block", CreateEnumBlockAst);
28 protected readonly
NonTerminal enum_item = T(
"enum_item", CreateEnumItemAst);
29 protected readonly
NonTerminal enum_item_list = T(
"enum_item_list", CreateListFromNode<Expression>);
30 protected readonly
NonTerminal namespace_block = T(
"namespace_block", CreateNamespaceBlockAst);
32 protected readonly
NonTerminal class_identifier_or_generic = TT(
"class_identifier_or_generic");
33 protected readonly
NonTerminal class_identifier_generic = T(
"class_identifier_generic", CreateClassIdentifierGenericAst);
34 protected readonly
NonTerminal class_identifier_generic_parameter_list = T(
"class_identifier_generic_parameter_list", CreateListFromNode<Variable>);
35 protected readonly
NonTerminal class_identifier_sub_generic = T(
"class_identifier_sub_generic");
50 SnippetRoots.Add(expression);
54 semantic_type.Rule =
Keyword(
"Semantic");
55 type.Rule |= semantic_type;
57 link_type.Rule =
Keyword(
"LinkType");
58 type.Rule |= link_type;
61 object_type.Rule |= var_type;
63 identifier_extended.Rule |=
Keyword(
"stage");
67 type_name.Rule = identifier_or_generic;
68 identifier_sub_generic.Rule |= number;
70 identifier_sub_generic.Rule |= identifier_dot;
71 identifier_sub_generic.Rule |= simple_type;
74 foreach_statement.Rule =
Keyword(
"foreach") +
"(" + type + identifier +
Keyword(
"in") + expression +
")" + statement;
75 iteration_statement.Rule |= foreach_statement;
81 class_specifier.AstNodeCreator = CreateShaderClassSpecifierAst;
82 class_base_type.AstNodeCreator = CreateShaderClassBaseTypeAst;
83 class_base_type_list.AstNodeCreator = CreateListFromNode<ShaderTypeName>;
84 class_base_type_list.Rule = MakePlusRule(class_base_type_list, ToTerm(
","), class_type);
85 class_type.Rule = identifier_or_generic;
87 variable_identifier.Rule |= identifier_generic;
90 member_reference_expression.Rule = postfix_expression +
"." + identifier_or_generic;
95 params_block.Rule = attribute_qualifier_pre +
Keyword(
"params") + identifier_raw + block_statement;
97 shader_block.Rule = attribute_qualifier_pre +
Keyword(
"partial").Opt() +
Keyword(
"shader") + identifier_raw + block_statement;
99 using_params_statement.Rule =
Keyword(
"using") +
Keyword(
"params") + expression +
";"
100 |
Keyword(
"using") +
Keyword(
"params") + expression + block_statement;
103 using_statement.Rule =
Keyword(
"using") + identifier_or_dot +
";";
105 foreach_params_statement.Rule =
Keyword(
"foreach") +
"(" +
Keyword(
"params") + conditional_expression +
")" + statement;
106 iteration_statement.Rule |= foreach_params_statement;
108 mixin_statement.Rule =
Keyword(
"mixin") +
Keyword(
"compose") + expression +
";"
113 |
Keyword(
"mixin") + expression +
";";
115 enum_item.Rule = identifier_raw +
"=" + conditional_expression
118 enum_item_list.Rule = MakeStarRule(enum_item_list, ToTerm(
","), enum_item);
120 enum_block.Rule = attribute_qualifier_pre +
Keyword(
"enum") + identifier_raw +
"{" + enum_item_list +
"}";
122 statement_raw.Rule |= mixin_statement | using_statement | using_params_statement;
124 toplevel_declaration_block.Rule =
"{" + toplevel_declaration_list +
"}";
126 namespace_block.Rule =
Keyword(
"namespace") + identifier_or_dot + toplevel_declaration_block;
128 toplevel_declaration.Rule |= params_block | shader_block | enum_block | namespace_block | using_statement;
131 class_specifier.Rule =
Keyword(
"class") + class_identifier_or_generic + class_base_type +
"{" + scope_declaration.ListOpt() +
"}";
133 | class_identifier_generic + this.ReduceHere();
134 class_identifier_generic.Rule = identifier +
new GenericResolverHint(_skipTokensInPreview) +
"<" + class_identifier_generic_parameter_list +
">";
135 class_identifier_generic_parameter_list.Rule = MakePlusRule(class_identifier_generic_parameter_list, ToTerm(
","), class_identifier_sub_generic);
136 class_identifier_sub_generic.Rule = type + identifier;
137 class_identifier_sub_generic.AstNodeCreator = CreateClassIdentifierSubGenericAst;
ParadoxGrammar()
Initializes a new instance of the ParadoxGrammar class.
Methods used to create the Abstract Syntax Tree..