4 using System.Collections.Generic;
5 using System.Globalization;
8 using SiliconStudio.Shaders.Ast;
9 using SiliconStudio.Shaders.Ast.Hlsl;
10 using SiliconStudio.Shaders.Utility;
13 namespace SiliconStudio.Shaders.
Grammar
38 ((Node)obj).Span = SpanConverter.Convert(node.Span);
55 var value = Ast<T>(node);
56 value.Key = string.Empty;
57 value.Values.Add(value);
70 var value = Qualifier.None;
71 foreach (var subNode
in node.ChildNodes)
78 value.Span = SpanConverter.Convert(node.Span);
95 var value = Ast<ArrayInitializerExpression>(node);
96 value.Items = (List<Expression>)node.
ChildNodes[1].AstNode;
110 var value = Ast<AssignmentExpression>(node);
112 value.Target = GetExpression(node.
ChildNodes[0]);
114 value.Value = GetExpression(node.
ChildNodes[2]);
141 node.AstNode = AssignmentOperatorHelper.FromString(node.ChildNodes[0].Token.Text);
155 var value = Ast<BinaryExpression>(node);
171 var value = Ast<BlockStatement>(node);
175 FillListFromNodes(node.
ChildNodes[1].ChildNodes, value.Statements);
187 var caseStatement = Ast<CaseStatement>(node);
208 var value = Ast<ConditionalExpression>(node);
213 value.Left = (
Expression)node.ChildNodes[2].AstNode;
229 var storageQualifier = Qualifier.None;
235 storageQualifier = CollectQualifiers(node.
ChildNodes[0]);
240 node.
AstNode =
new Tuple<Qualifier, TypeBase>(storageQualifier, typeBase);
252 var declarationStatement = Ast<DeclarationStatement>(node);
265 var value = Ast<WhileStatement>(node);
271 value.Statement = (
Statement)node.ChildNodes[1].AstNode;
272 value.IsDoWhile =
true;
286 node.AstNode = node.ChildNodes[0].AstNode;
291 Ast<EmptyExpression>(node);
297 Ast<EmptyStatement>(node);
315 node.AstNode = node.ChildNodes[0].AstNode;
319 var expressionStatement = Ast<ExpressionStatement>(node);
323 expressionStatement.Expression = (Expression)node.
ChildNodes[0].AstNode;
329 CreateIdentifierAst(context, node.
ChildNodes[0]);
330 expressionStatement.Expression =
new KeywordExpression((Identifier)node.
ChildNodes[0].AstNode) { Span = SpanConverter.Convert(node.Span) };
343 var value = Ast<ForStatement>(node);
359 value.Condition = GetOptional<Expression>(node.ChildNodes[3]);
360 value.Next = GetOptional<Expression>(node.ChildNodes[4]);
376 while (nextNode.AstNode == null && nextNode.ChildNodes.Count > 0)
378 nextNode = nextNode.ChildNodes[0];
381 node.AstNode = nextNode.AstNode as Identifier;
386 var value = Ast<Identifier>(node);
387 value.Text = nextNode.Token.Text;
401 var value = Ast<Identifier>(node);
402 var identifier = (Identifier)node.
ChildNodes[0].AstNode;
403 value.Text = identifier.Text;
404 value.Indices =
new List<Expression>();
405 FillListFromNodes(node.
ChildNodes[1].ChildNodes, value.Indices);
417 var identifiers = Ast<List<Identifier>>(node);
418 FillListFromNodes(node.
ChildNodes, identifiers);
430 var value = Ast<IfStatement>(node);
436 value.Condition = (Expression)node.
ChildNodes[2].AstNode;
437 value.Then = (
Statement)node.ChildNodes[4].AstNode;
453 var value = Ast<IndexerExpression>(node);
457 value.Target = (Expression)node.
ChildNodes[0].AstNode;
458 value.Index = (Expression)node.ChildNodes[1].AstNode;
470 var literalValueNode = node.ChildNodes[0].AstNode;
471 if (literalValueNode is
Literal)
473 node.AstNode = literalValueNode;
477 var value = Ast<Literal>(node);
478 value.Value = literalValueNode;
479 value.Text = GetTokenText(node.
ChildNodes[0]);
492 var value = Ast<LiteralExpression>(node);
505 var value = Ast<MemberReferenceExpression>(node);
509 value.Target = (Expression)node.
ChildNodes[0].AstNode;
510 value.Member = (Identifier)node.ChildNodes[2].AstNode;
523 node.AstNode = node.ChildNodes[0].AstNode;
539 node.
AstNode = methodDeclaration;
542 methodDeclaration.Attributes.AddRange((List<AttributeBase>)node.
ChildNodes[0].AstNode);
543 var declarationSpecifiers = (Tuple<Qualifier, TypeBase>)node.
ChildNodes[1].AstNode;
544 methodDeclaration.Qualifiers = declarationSpecifiers.Item1;
545 methodDeclaration.ReturnType = declarationSpecifiers.Item2;
546 methodDeclaration.Qualifiers |= (
Qualifier)node.ChildNodes[3].AstNode;
548 methodDeclaration.UpdateParameters();
560 var methodDeclaration = Ast<MethodDeclaration>(node);
568 methodDeclaration.Name = (Identifier)node.
ChildNodes[0].AstNode;
571 if (node.
ChildNodes[2].AstNode is List<Parameter>)
573 methodDeclaration.Parameters = (List<Parameter>)node.
ChildNodes[2].AstNode;
575 else if (node.
ChildNodes[2].AstNode is List<Identifier>)
577 var identifiers = (List<Identifier>)node.
ChildNodes[2].AstNode;
578 foreach (var identifier in identifiers)
580 methodDeclaration.Parameters.Add(
new Parameter() { Name = identifier, Span = identifier.Span });
598 var methodDefinition = Ast<MethodDefinition>(node);
601 methodDefinition.UpdateParameters();
605 FillListFromNodes(node.
ChildNodes[2].ChildNodes, methodDefinition.Body);
617 var value = Ast<MethodInvocationExpression>(node);
622 value.Target = GetExpression(node.
ChildNodes[0]);
624 var arguments = GetOptional<List<Expression>>(node.ChildNodes[2]);
625 if (arguments != null)
627 value.Arguments = arguments;
643 var parameter = Ast<Parameter>(node);
645 parameter.Attributes.AddRange((List<AttributeBase>)node.
ChildNodes[0].AstNode);
647 parameter.Name = GetOptional<Identifier>(node.
ChildNodes[3]);
650 if (parameter.Name != null && parameter.Name.HasIndices)
653 parameter.Type =
new ArrayType { Dimensions =
new List<Expression>(parameter.Name.Indices), Type = parameter.Type, Span = parameter.Name.Span };
655 parameter.Name.Indices = null;
668 var value = Ast<ParenthesizedExpression>(node);
672 value.Content = (Expression)node.
ChildNodes[1].AstNode;
684 var value = Ast<UnaryExpression>(node);
689 value.Expression = (Expression)node.
ChildNodes[0].AstNode;
690 var operatorText = node.
ChildNodes[1].Token.Text;
691 value.Operator = (operatorText ==
"++") ? UnaryOperator.PostIncrement : UnaryOperator.PostDecrement;
703 var qualifier = node.ChildNodes.Count == 0 ? Qualifier.None : CollectQualifiers(node.
ChildNodes[0]);
706 qualifier.Span = SpanConverter.Convert(node.Span);
709 node.AstNode = qualifier;
714 node.AstNode = CollectQualifiers(node.
ChildNodes[0]);
728 node.AstNode = node.ChildNodes[1].AstNode;
740 var value = Ast<ReturnStatement>(node);
745 value.Value = (Expression)node.
ChildNodes[1].AstNode;
758 var value = Ast<Shader>(node);
760 node.AstNode =
new IronyBrowsableNode(value);
761 value.Declarations = (List<Node>)node.
ChildNodes[0].AstNode;
778 value.Attributes = (List<AttributeBase>)node.
ChildNodes[0].AstNode;
790 var value = Ast<StructType>(node);
795 value.Name = GetOptional<Identifier>(node.ChildNodes[1]);
796 FillListFromNodes(node.
ChildNodes[3].ChildNodes, value.Fields);
808 var group = Ast<SwitchCaseGroup>(node);
811 FillListFromNodes(node.
ChildNodes[0].ChildNodes, group.Cases);
812 FillListFromNodes(node.
ChildNodes[1].ChildNodes, group.Statements);
824 var value = Ast<SwitchStatement>(node);
829 value.Condition = (Expression)node.
ChildNodes[2].AstNode;
830 FillListFromNodes(node.
ChildNodes[5].ChildNodes, value.Groups);
842 var value = Ast<TypeName>(node);
843 value.Name = (Identifier)node.
ChildNodes[0].AstNode;
855 CreateTypeFromTokenAst<TypeName>(parsingcontext, node);
862 node.AstNode = node.ChildNodes[0].AstNode;
866 var value = Ast<T>(node);
868 while (nextNode.Token == null)
870 nextNode = nextNode.ChildNodes[0];
873 value.Name =
new Identifier(nextNode.Token.Text) { Span = SpanConverter.Convert(node.Span) };
886 var value = Ast<UnaryExpression>(node);
891 value.Operator = UnaryOperatorHelper.FromString(node.ChildNodes[0].Token.Text);
892 value.Expression = (Expression)node.
ChildNodes[1].AstNode;
913 var typeBase = (TypeBase)node.
ChildNodes[1].AstNode;
914 var attributes = (List<AttributeBase>)node.ChildNodes[0].AstNode;
915 typeBase.Attributes = attributes;
916 node.AstNode = typeBase;
922 var.Attributes.AddRange((List<AttributeBase>)node.
ChildNodes[0].AstNode);
936 var var = Ast<Variable>(node);
940 var declarationSpecifiers = (Tuple<Qualifier, TypeBase>)node.
ChildNodes[0].AstNode;
941 var.Qualifiers = declarationSpecifiers.Item1;
942 var.Type = declarationSpecifiers.Item2;
944 var declarators = GetOptional<List<Variable>>(node.
ChildNodes[1]);
946 if (declarators != null)
948 var.SubVariables = declarators;
951 foreach(var subVariable
in declarators)
954 ((ArrayType)subVariable.Type).Type = var.Type;
956 subVariable.Type = var.Type;
964 if (var.SubVariables.Count == 1)
966 var subVariable = var.SubVariables[0];
967 subVariable.MergeFrom(var);
968 node.AstNode = subVariable;
974 var.Type.Qualifiers = var.Qualifiers;
977 node.AstNode = var.Type;
981 node.AstNode = var.Type;
985 node.AstNode = var.Type;
989 parsingContext.AddParserError(
"Expecting identifier for variable declaration [{0}]", var.Type);
992 if (var.Type.Name == null)
994 parsingContext.AddParserError(
"Cannot declare anonymous type at the top level");
1008 var value = Ast<WhileStatement>(node);
1013 value.Condition = (Expression)node.
ChildNodes[2].AstNode;
1014 value.Statement = (
Statement)node.ChildNodes[4].AstNode;
1026 var literalFloat = Ast<Literal>(node);
1028 var floatStr = node.Token.Text;
1029 bool isHalf = floatStr.EndsWith(
"h", StringComparison.CurrentCultureIgnoreCase);
1032 if (floatStr.EndsWith(
"d", StringComparison.CurrentCultureIgnoreCase)
1033 || floatStr.EndsWith(
"f", StringComparison.CurrentCultureIgnoreCase)
1036 floatStr = floatStr.Substring(0, floatStr.Length - 1);
1039 if (!
float.TryParse(
1042 CultureInfo.InvariantCulture,
1045 context.AddParserError(
"Unable to parse float [{0}]", node.Token.Text);
1048 literalFloat.Value = value;
1049 literalFloat.Text = node.Token.Text;
1055 literalFloat.Text = floatStr;
1068 var literalInt = Ast<Literal>(node);
1070 bool isOctal =
false;
1071 var intStr = node.Token.Text;
1072 var style = NumberStyles.Integer;
1075 if (intStr.EndsWith(
"l", StringComparison.CurrentCultureIgnoreCase))
1077 intStr = intStr.Substring(0, intStr.Length - 1);
1081 if (intStr.StartsWith(
"0x", StringComparison.CurrentCultureIgnoreCase))
1083 intStr = intStr.Substring(2);
1084 style = NumberStyles.HexNumber;
1086 else if (intStr.StartsWith(
"0") && intStr.Length > 1)
1092 value = Convert.ToInt32(intStr, 8);
1094 catch (FormatException)
1096 context.AddParserError(
"Unable to parse octal number [{0}]", node.Token.Text);
1101 if (!isOctal && !
int.TryParse(
1104 CultureInfo.InvariantCulture,
1107 context.AddParserError(
"Unable to parse integer [{0}]", node.Token.Text);
1110 literalInt.Value = value;
1111 literalInt.Text = node.Token.Text;
1123 var qualifier = Qualifier.None;
1126 qualifier = Shaders.Ast.StorageQualifier.Parse(node.ChildNodes[0].Token.Text);
1127 qualifier.Span = SpanConverter.Convert(node.Span);
1130 node.AstNode = qualifier;
1153 value.InitialValue = (Expression)node.
ChildNodes[2].AstNode;
1166 var value = Ast<Variable>(node);
1171 var identifier = (Identifier)node.
ChildNodes[0].AstNode;
1174 value.Qualifiers = (
Qualifier)node.ChildNodes[1].AstNode;
1176 value.Name = identifier;
1179 if (identifier.HasIndices)
1182 value.Type =
new ArrayType { Dimensions =
new List<Expression>(identifier.Indices), Span = identifier.
Span };
1183 identifier.Indices = null;
1197 var typeBase = (TypeBase)node.
ChildNodes[0].AstNode;
1198 var baseTypeSpan = typeBase.Span;
1199 var location = ((Irony.Parsing.IBrowsableAstNode)typeBase).Location;
1200 location.Position += baseTypeSpan.Length;
1202 context.AddParserMessage(ParserErrorLevel.Error, location,
"Field declaration must contain an identifier");
1210 foreach (var variableDeclarator in var.Instances())
1212 if (variableDeclarator.InitialValue != null)
1214 context.AddParserMessage(
1215 ParserErrorLevel.Error, ((
Irony.Parsing.IBrowsableAstNode)variableDeclarator.InitialValue).Location,
"Field declaration cannot contain an initial value");
1223 var value = Ast<VariableReferenceExpression>(node);
1225 value.Name = (Identifier)node.
ChildNodes[0].AstNode;
1232 var value = Ast<TypeReferenceExpression>(node);
1234 value.Type = (TypeBase)node.
ChildNodes[0].AstNode;
1246 node.AstNode = node.ChildNodes[0].AstNode;
1250 var value = Ast<ExpressionList>(node);
Methods used to create the Abstract Syntax Tree..
static void CreateTypeNameAst(ParsingContext parsingcontext, ParseTreeNode node)
The create type name ast.
static void CreateTypeNameFromTokenAst(ParsingContext parsingcontext, ParseTreeNode node)
The create type name from token ast.
static void CreateParenthesizedExpressionAst(ParsingContext context, ParseTreeNode node)
The create parenthesized expression ast.
static void CreateVariableGroupAst(ParsingContext parsingContext, ParseTreeNode node)
Creates the variable group ast.
static void CreateIdentifierAst(ParsingContext parsingcontext, ParseTreeNode node)
The create identifier ast.
static BinaryOperator FromString(string operatorStr)
Converts from string an operator.
static Qualifier CollectQualifiers(ParseTreeNode node)
The collect qualifiers.
virtual void CreateStorageQualifier(ParsingContext context, ParseTreeNode node)
The create storage qualifier.
static void CreateMethodDeclarationAst(ParsingContext context, ParseTreeNode node)
The create method declaration ast.
SourceSpan Span
Gets or sets the source span.
static void CreateShaderAst(ParsingContext parsingcontext, ParseTreeNode node)
The create shader ast.
static void CreateIfStatementAst(ParsingContext context, ParseTreeNode node)
The create if statement ast.
static void CreateMethodInvokeExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
The create method invoke expression ast.
Keyword expression statement like continue; break; discard;
static void CreateEmptyStatementAst(ParsingContext context, ParseTreeNode node)
static void CreateRankSpecifierAst(ParsingContext parsingcontext, ParseTreeNode node)
The create rank specifier ast.
static void CreateArrayInitializerExpressionAst(ParsingContext context, ParseTreeNode node)
The create array initializer expression ast.
static void CreateMethodDefinitionAst(ParsingContext context, ParseTreeNode node)
The create method definition ast.
SiliconStudio.Shaders.Ast.StorageQualifier StorageQualifier
static void CreateDeclarationSpecifier(ParsingContext context, ParseTreeNode node)
The create declaration specifier.
void CreateFloatLiteral(ParsingContext context, ParseTreeNode node)
The create float literal.
static void CreateUnaryExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
The create unary expression ast.
static SourceLocation Convert(Irony.Parsing.SourceLocation sourceLocation)
static void CreateMethodDeclarationRawAst(ParsingContext context, ParseTreeNode node)
The create method declaration raw ast.
AssignmentOperator
Assignment operator used in assignment expression (a = b) or statements (a = b;)
static void CreateAssignmentOperator(ParsingContext parsingContext, ParseTreeNode node)
The create assignment operator.
static void CreatePostfixUnaryExpressionAst(ParsingContext context, ParseTreeNode node)
The create postfix unary expression ast.
static void CreateMethodDeclaratorAst(ParsingContext context, ParseTreeNode node)
The create method declarator ast.
Helper for BinaryOperator.
void CreateIntegerLiteral(ParsingContext context, ParseTreeNode node)
The create integer literal.
static Expression GetExpression(ParseTreeNode node)
Gets the expression.
static void CreateVariableGroupRawAst(ParsingContext parsingContext, ParseTreeNode node)
The create variable group raw ast.
virtual void CreateParameterAst(ParsingContext context, ParseTreeNode node)
The create parameter ast.
A declaration inside a statement.
static void CreateDoWhileStatementAst(ParsingContext context, ParseTreeNode node)
The create do while statement ast.
static void CreateStatementAst(ParsingContext context, ParseTreeNode node)
The create statement ast.
static void CreateIdentifierListAst(ParsingContext parsingcontext, ParseTreeNode node)
The create identifier list ast.
static void CreateLiteralAst(ParsingContext context, ParseTreeNode node)
The create literal ast.
static void CreateCaseStatementAst(ParsingContext context, ParseTreeNode node)
The create case statement ast.
Base root class for all statements.
A single parameter declaration.
static void CreateIdentifierIndexableAst(ParsingContext parsingcontext, ParseTreeNode node)
The create identifier indexable ast.
ParseTreeNodeList ChildNodes
static void CreateConditionalExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
The create conditional expression ast.
static void CreateSwitchStatementAst(ParsingContext context, ParseTreeNode node)
The create switch statement ast.
static void CreateWhileStatementAst(ParsingContext context, ParseTreeNode node)
The create while statement ast.
static void CreateStructureAst(ParsingContext parsingcontext, ParseTreeNode node)
The create structure ast.
static void CreateDeclarationStatementAst(ParsingContext context, ParseTreeNode node)
The create declaration statement ast.
static void CreateForStatementAst(ParsingContext context, ParseTreeNode node)
The create for statement ast.
A reference to a variable.
static void CreateExpressionStatementAst(ParsingContext context, ParseTreeNode node)
The create expression statement ast.
static void CreateLiteralExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
The create literal expression ast.
static void CreateQualifiersAst(ParsingContext context, ParseTreeNode node)
static void CreateExpressionOrEmptyAst(ParsingContext context, ParseTreeNode node)
The create expression or empty ast.
static void CreateReturnStatementAst(ParsingContext context, ParseTreeNode node)
The create return statement ast.
static void CreateBlockStatementAst(ParsingContext context, ParseTreeNode node)
The create block statement ast.
static void CreateQualifiers(ParsingContext context, ParseTreeNode node)
The create qualifiers.
static void CreateSwitchCastGroupAst(ParsingContext context, ParseTreeNode node)
The create switch cast group ast.
static void CreateMemberReferenceExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
The create member reference expression ast.
virtual void CreateVariableDeclaratorRawAst(ParsingContext parsingcontext, ParseTreeNode node)
The create variable declarator raw ast.
static readonly Qualifier None
None Enum.
virtual void CreateVariableDeclaratorAst(ParsingContext parsingcontext, ParseTreeNode node)
The create variable declarator ast.
static void CreateBinaryExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
The create binary expression ast.
static void CreateIndexerExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
The create indexer expression ast.
static void CreateAssignementExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
The create assignement expression ast.