Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ParadoxGrammar.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using Irony.Parsing;
4 
5 using SiliconStudio.Paradox.Shaders.Parser.Ast;
6 using SiliconStudio.Shaders.Ast;
7 using SiliconStudio.Shaders.Grammar;
8 using SiliconStudio.Shaders.Grammar.Hlsl;
9 
10 namespace SiliconStudio.Paradox.Shaders.Parser.Grammar
11 {
12  [Language("hotei2", "5.0", "Paradox2 hlsl grammar")]
13  public partial class ParadoxGrammar : HlslGrammar
14  {
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); // TODO: look if really needed
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);
31 
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");
36 
37  public NonTerminal ExpressionNonTerminal
38  {
39  get
40  {
41  return expression;
42  }
43  }
44 
45  /// <summary>
46  /// Initializes a new instance of the <see cref="ParadoxGrammar"/> class.
47  /// </summary>
48  public ParadoxGrammar()
49  {
50  SnippetRoots.Add(expression);
51 
52  //object_type.Rule |= shader_class_specifier;
53 
54  semantic_type.Rule = Keyword("Semantic");
55  type.Rule |= semantic_type;
56 
57  link_type.Rule = Keyword("LinkType");
58  type.Rule |= link_type;
59 
60  var_type.Rule = Keyword("var");
61  object_type.Rule |= var_type;
62 
63  identifier_extended.Rule |= Keyword("stage");
64 
65  // Allow simple types within generics (numbers, etc...)
66  //type_name.Rule = identifier_or_generic + new IdentifierResolverHint(true);
67  type_name.Rule = identifier_or_generic;
68  identifier_sub_generic.Rule |= number;
69  //identifier_sub_generic.Rule |= boolean;
70  identifier_sub_generic.Rule |= identifier_dot;
71  identifier_sub_generic.Rule |= simple_type;
72 
73  // Foreach statement
74  foreach_statement.Rule = Keyword("foreach") + "(" + type + identifier + Keyword("in") + expression + ")" + statement;
75  iteration_statement.Rule |= foreach_statement;
76 
77  // Add inheritance qualifiers
78  storage_qualifier.Rule |= Keyword("override") | Keyword("abstract") | Keyword("stream") | Keyword("patchstream") | Keyword("stage") | Keyword("clone") | Keyword("compose");
79 
80  // override Hlsl class
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;
86 
87  variable_identifier.Rule |= identifier_generic;
88 
89  // Allow generic identifier on member expressions
90  member_reference_expression.Rule = postfix_expression + "." + identifier_or_generic;
91 
92  // ---------------------------------------------------
93  // New Mixin System
94  // ---------------------------------------------------
95  params_block.Rule = attribute_qualifier_pre + Keyword("params") + identifier_raw + block_statement;
96 
97  shader_block.Rule = attribute_qualifier_pre + Keyword("partial").Opt() + Keyword("shader") + identifier_raw + block_statement;
98 
99  using_params_statement.Rule = Keyword("using") + Keyword("params") + expression + ";"
100  | Keyword("using") + Keyword("params") + expression + block_statement;
101 
102 
103  using_statement.Rule = Keyword("using") + identifier_or_dot + ";";
104 
105  foreach_params_statement.Rule = Keyword("foreach") + "(" + Keyword("params") + conditional_expression + ")" + statement;
106  iteration_statement.Rule |= foreach_params_statement;
107 
108  mixin_statement.Rule = Keyword("mixin") + Keyword("compose") + expression + ";"
109  | Keyword("mixin") + Keyword("remove") + expression + ";"
110  | Keyword("mixin") + Keyword("macro") + expression + ";"
111  | Keyword("mixin") + Keyword("child") + expression + ";"
112  | Keyword("mixin") + Keyword("clone") + ";"
113  | Keyword("mixin") + expression + ";";
114 
115  enum_item.Rule = identifier_raw + "=" + conditional_expression
116  | identifier_raw;
117 
118  enum_item_list.Rule = MakeStarRule(enum_item_list, ToTerm(","), enum_item);
119 
120  enum_block.Rule = attribute_qualifier_pre + Keyword("enum") + identifier_raw + "{" + enum_item_list + "}";
121 
122  statement_raw.Rule |= mixin_statement | using_statement | using_params_statement;
123 
124  toplevel_declaration_block.Rule = "{" + toplevel_declaration_list + "}";
125 
126  namespace_block.Rule = Keyword("namespace") + identifier_or_dot + toplevel_declaration_block;
127 
128  toplevel_declaration.Rule |= params_block | shader_block | enum_block | namespace_block | using_statement;
129 
130  // override class specifier
131  class_specifier.Rule = Keyword("class") + class_identifier_or_generic + class_base_type + "{" + scope_declaration.ListOpt() + "}";
132  class_identifier_or_generic.Rule = identifier + new IdentifierResolverHint(true)
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;
138  }
139  }
140 }
ParadoxGrammar()
Initializes a new instance of the ParadoxGrammar class.
Methods used to create the Abstract Syntax Tree..