Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ShaderGrammar.Helpers.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 System;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Text;
7 
8 using Irony.Parsing;
9 using SiliconStudio.Shaders.Ast;
10 
11 namespace SiliconStudio.Shaders.Grammar
12 {
13  public abstract partial class ShaderGrammar
14  {
15  #region Public Methods
16 
17  protected KeyTerm Keyword(string term, bool isCaseInsensitive = false)
18  {
19  var keyTerm = ToTerm(term);
20  keyTerm.AstNodeConfig = new TokenInfo { TokenCategory = TokenCategory.Keyword, IsCaseInsensitive = isCaseInsensitive};
21  return keyTerm;
22  }
23 
24  protected KeyTerm TypeName(string term)
25  {
26  var keyTerm = ToTerm(term);
27  keyTerm.AstNodeConfig = new TokenInfo { TokenCategory = TokenCategory.Typename};
28  return keyTerm;
29  }
30 
31  protected void Term(Terminal terminal, TokenCategory category, TokenType type)
32  {
33  var config = (TokenInfo)terminal.AstNodeConfig;
34  if (config == null)
35  {
36  config = new TokenInfo { TokenCategory = category };
37  terminal.AstNodeConfig = config;
38  }
39  TokenTypeToTerminals.Add(type, terminal);
40  }
41 
42  protected KeyTerm Op(string term, TokenType type)
43  {
44  var keyTerm = ToTerm(term);
45  keyTerm.AstNodeConfig = new TokenInfo { TokenCategory = TokenCategory.Operator};
46  TokenTypeToTerminals.Add(type, keyTerm);
47  return keyTerm;
48  }
49 
50  protected KeyTerm Punc(string term, TokenType type)
51  {
52  var keyTerm = ToTerm(term);
53  keyTerm.AstNodeConfig = new TokenInfo { TokenCategory = TokenCategory.Puntuation };
54  TokenTypeToTerminals.Add(type, keyTerm);
55  return keyTerm;
56  }
57 
58  #endregion
59 
60  #region Methods
61 
62  protected static T GetOptional<T>(ParseTreeNode node) where T : class
63  {
64  if (node.ChildNodes.Count == 1) return (T)node.ChildNodes[0].AstNode;
65  return null;
66  }
67 
68  protected static T CreateEnumFlags<T>(T initialValue, IEnumerable<ParseTreeNode> enumValues) where T : CompositeEnum, new()
69  {
70  T value = initialValue;
71  foreach (var storageClassItem in enumValues)
72  {
73  value = CompositeEnum.OperatorOr(value, (T)storageClassItem.AstNode);
74  }
75 
76  return value;
77  }
78 
80  {
81  return CreateRuleFromObjectTypes(types.AsEnumerable());
82  }
83 
85  {
86  BnfExpression rule = null;
87 
88  foreach (var type in types)
89  {
90  if (rule == null)
91  {
92  rule = TypeName(type.Name);
93  }
94  else
95  {
96  rule |= TypeName(type.Name);
97  }
98 
99  // Add alternative names as well
100  foreach (var alternativeName in type.AlternativeNames)
101  rule |= TypeName(alternativeName);
102  }
103  return rule;
104  }
105 
106  private static void CreateListFromNode<T>(ParsingContext context, ParseTreeNode node)
107  {
108  var list = new List<T>();
109  FillListFromNodes(node.ChildNodes, list);
110  node.AstNode = list;
111  }
112 
113  protected static void FillListFromNodes<TItem>(IEnumerable<ParseTreeNode> nodes, IList<TItem> items)
114  {
115  foreach (var childNode in nodes)
116  {
117  if (childNode.AstNode != null)
118  items.Add((TItem)childNode.AstNode);
119  }
120  }
121 
122  protected static void FillTokenText(ParseTreeNode node, StringBuilder builder)
123  {
124  if (node.Token != null) builder.Append(node.Token.Text);
125 
126  foreach (var subNode in node.ChildNodes)
127  {
128  FillTokenText(subNode, builder);
129  }
130  }
131 
132  protected static string GetTokenText(ParseTreeNode node)
133  {
134  var builder = new StringBuilder();
135  FillTokenText(node, builder);
136  return builder.ToString();
137  }
138 
139  private static T ParseEnumFromNode<T>(ParseTreeNode node) where T : struct, IConvertible
140  {
141  if (node.ChildNodes.Count != 1)
142  {
143  return (T)Enum.ToObject(typeof(T), 0);
144  }
145 
146  return (T)Enum.Parse(typeof(T), node.ChildNodes[0].Token.Text, true);
147  }
148 
149  protected static string ParseStringFromNode(ParseTreeNode node)
150  {
151  while (node.ChildNodes.Count == 1)
152  {
153  node = node.ChildNodes[0];
154  }
155 
156  return (string)node.AstNode;
157  }
158 
159  protected static NonTerminal T(string name)
160  {
161  return new NonTerminal(name);
162  }
163 
164  protected static NonTerminal T(string name, AstNodeCreator nodeCreator)
165  {
166  return new NonTerminal(name, nodeCreator);
167  }
168 
169  protected static NonTerminal TT(string name)
170  {
171  var nonTerminal = T(name);
172  nonTerminal.Flags = TermFlags.IsTransient | TermFlags.NoAstNode;
173  return nonTerminal;
174  }
175  #endregion
176  }
177 }
A typeless reference.
Definition: TypeName.cs:10
static string ParseStringFromNode(ParseTreeNode node)
KeyTerm Punc(string term, TokenType type)
static void FillTokenText(ParseTreeNode node, StringBuilder builder)
static NonTerminal T(string name, AstNodeCreator nodeCreator)
delegate void AstNodeCreator(ParsingContext context, ParseTreeNode parseNode)
KeyTerm Op(string term, TokenType type)
ParseTreeNodeList ChildNodes
Definition: ParseTree.cs:41
static string GetTokenText(ParseTreeNode node)
BnfExpression CreateRuleFromObjectTypes(IEnumerable< ObjectType > types)
void Term(Terminal terminal, TokenCategory category, TokenType type)
BnfExpression CreateRuleFromObjectTypes(params ObjectType[] types)
KeyTerm Keyword(string term, bool isCaseInsensitive=false)