コード例 #1
1
ファイル: ParallelTasksNode.cs プロジェクト: TheByte/sones
 public void GetContent(CompilerContext context, ParseTreeNode parseNode)
 {
     if (parseNode.HasChildNodes())
     {
         ParallelTasks = Convert.ToUInt32(parseNode.ChildNodes[1].Token.Value);
     }
 }
コード例 #2
0
        public override void Init(AstContext context, ParseTreeNode treeNode)
        {
            base.Init(context, treeNode);

            AstNode sn=AddChild("from", treeNode.ChildNodes[0]);
            AstNode en=AddChild("to", treeNode.ChildNodes[2]);

            var dtsn=sn as DateTimeLiteralNode;
            var dten=en as DateTimeLiteralNode;
            if (dtsn!=null)
            {
                _StartDate=dtsn.Value;

                if (dten!=null)
                    _EndDate=dten.Value;
                else
                    _EndDate=_StartDate+((DurationLiteralNode)en).Value;
            } else
            {
                _EndDate=dten.Value;
                _StartDate=_EndDate-((DurationLiteralNode)sn).Value;
            }

            AsString="period";
        }
コード例 #3
0
 private void ParseOptions(ParseTreeNode node, FvSolutionData rawData)
 {
     foreach (ParseTreeNode rootEntryNode in node.FindDictEntries(null))
     {
         var identifier = rootEntryNode.GetEntryIdentifier();
         switch (identifier)
         {
             case "nCorrectors":
                 rawData.Options.nCorrectors = rootEntryNode.GetBasicValInt();
                 break;
             case "nNonOrthogonalCorrectors":
                 rawData.Options.nNonOrthogonalCorrectors = rootEntryNode.GetBasicValInt();
                 break;
             case "pdRefOn":
                 rawData.Options.pdRefOn = rootEntryNode.GetBasicValBool();
                 break;
             case "pdRefCell":
                 rawData.Options.pdRefCell = rootEntryNode.GetBasicValInt();
                 break;
             case "pdRefValue":
                 rawData.Options.pdRefValue = rootEntryNode.GetBasicValInt();
                 break;
             case "tempEqnOn":
                 rawData.Options.tempEqnOn = rootEntryNode.GetBasicValBool();
                 break;
         }
     }
 }
コード例 #4
0
ファイル: AstBuilder.cs プロジェクト: Ventero/Pash
        public ScriptBlockAst BuildScriptBlockAst(ParseTreeNode parseTreeNode)
        {
            VerifyTerm(parseTreeNode, this._grammar.script_block);

            ParamBlockAst paramBlockAst = null;
            StatementBlockAst statementBlockAst = null;

            if (parseTreeNode.ChildNodes.Any())
            {
                // Note that I used First() and Last() to make it deal with the fact that both are optional
                if (parseTreeNode.ChildNodes.First().Term == this._grammar.param_block)
                {
                    paramBlockAst = BuildParamBlockAst(parseTreeNode.ChildNodes.First());
                }

                if (parseTreeNode.ChildNodes.Last().Term == this._grammar.script_block_body)
                {
                    statementBlockAst = BuildScriptBlockBodyAst(parseTreeNode.ChildNodes.Last());
                }
            }

            return new ScriptBlockAst(
                new ScriptExtent(parseTreeNode),
                paramBlockAst,
                statementBlockAst,
                false
                );
        }
コード例 #5
0
        private static MethodInfo PrepareStringInstanceMethodCall(string methodName, ParseTreeNode root, CompilerState state, out Expression value, out Expression pattern)
        {
            root.RequireChildren(2);

            MethodInfo method;
            if (0 == StringComparer.OrdinalIgnoreCase.Compare(methodName, "StartsWith"))
            {
                method = ReflectionHelper.StringStartsWith;
            }
            else if (0 == StringComparer.OrdinalIgnoreCase.Compare(methodName, "EndsWith"))
            {
                method = ReflectionHelper.StringEndsWith;
            }
            else if (0 == StringComparer.OrdinalIgnoreCase.Compare(methodName, "IndexOf"))
            {
                method = ReflectionHelper.StringIndexOf;
            }
            else
            {
                throw new Exception("Could not find method " + methodName);
            }

            var arg1Node = root.RequireChild(null, 1, 0, 0);
            value = state.ParentRuntime.Analyze(arg1Node, state);
            value.RequireString(arg1Node);

            var arg2Node = root.RequireChild(null, 1, 0, 1);
            pattern = state.ParentRuntime.Analyze(arg2Node, state);
            pattern.RequireString(arg2Node);
            return method;
        }
コード例 #6
0
        private void AddParseNodeRec(int depth, ParseTreeNode node)
        {
            if (node == null) return;
            BnfTerm term = node.Term;

            string txt = node.ToString();

            if (term == null) {
                txt = "NullTerm";
            }
            else {
                txt = term.GetParseNodeCaption(node);
            }
            //var t = " "*6;
            for (int i = 0; i < depth; i++) Console.Write("  ");

            if (node.Token != null) {
                Console.WriteLine(node.Token.Value + " " + node.Token.Terminal.ToString());
            }
            else
                Console.WriteLine(node.Term.Name);

               // Console.WriteLine(node.ToString());
            foreach (var child in node.ChildNodes)
                AddParseNodeRec(depth + 1, child);
        }
コード例 #7
0
 public virtual void BuildAst(ParseTreeNode parseNode)
 {
     var term = parseNode.Term;
     if (term.Flags.IsSet(TermFlags.NoAstNode) || parseNode.AstNode != null) return;
     //children first
     var processChildren = !parseNode.Term.Flags.IsSet(TermFlags.AstDelayChildren) &&
                           parseNode.ChildNodes.Count > 0;
     if (processChildren)
     {
         var mappedChildNodes = parseNode.GetMappedChildNodes();
         for (var i = 0; i < mappedChildNodes.Count; i++)
             BuildAst(mappedChildNodes[i]);
     }
     //create the node
     //We know that either NodeCreator or DefaultNodeCreator is set; VerifyAstData create the DefaultNodeCreator
     var config = term.AstConfig;
     if (config.NodeCreator != null)
     {
         config.NodeCreator(Context, parseNode);
         // We assume that Node creator method creates node and initializes it, so parser does not need to call 
         // IAstNodeInit.Init() method on node object. But we do call AstNodeCreated custom event on term.
     }
     else
     {
         //Invoke the default creator compiled when we verified the data
         parseNode.AstNode = config.DefaultNodeCreator();
         //Initialize node
         var iInit = parseNode.AstNode as IAstNodeInit;
         if (iInit != null)
             iInit.Init(Context, parseNode);
     }
     //Invoke the event on term
     term.OnAstNodeCreated(parseNode);
 } //method
コード例 #8
0
        public static new LiteralValue Create(ParseTreeNode node)
        {
            if (node.Term.Name != XamlMarkupExtensionGrammar.StringTerm)
                return null;

            return new LiteralValue(node.Token.Text);
        }
コード例 #9
0
ファイル: EdgeTypeParamNode.cs プロジェクト: loubo/sones
        public void Init(ParsingContext context, ParseTreeNode parseNode)
        {
            ParamType type = ParamType.Value;
            Object param = null;

            if (HasChildNodes(parseNode))
            {

                throw new NotImplementedQLException("TODO");

                ///Das sollte hier jetzt viel einfacher sein, weil die definition einer edge maximal so aussehen kann User(Weighted) oder Set<User (Weighted)>

                //    throw new NotImplementedQLException("TODO");

                //    if (GraphDBTypeMapper.IsBasicType(parseNode.ChildNodes[0].Token.ValueString))
                //    {
                //        param = GraphDBTypeMapper.GetGraphObjectFromTypeName(parseNode.ChildNodes[0].Token.ValueString);
                //        type = ParamType.Type;
                //    }

                //    else
                //    {
                //        param = parseNode.ChildNodes[0].Token.Value;
                //        type = ParamType.Value;
                //    }

                //}

                //EdgeTypeParamDefinition = new EdgeTypeParamDefinition(type, param);

            }
        }
コード例 #10
0
 public void DirectInit(ParsingContext context, ParseTreeNode parseNode)
 {
     var idChain = ((IDNode)parseNode.ChildNodes[2].AstNode).IDChainDefinition;
     var tupleDefinition = ((TupleNode)parseNode.ChildNodes[3].AstNode).TupleDefinition;
     var AttrName = parseNode.ChildNodes[2].FirstChild.FirstChild.Token.ValueString;
     ToBeRemovedList = new AttributeRemoveList(idChain, AttrName, tupleDefinition);
 }
コード例 #11
0
ファイル: PartialSelectStmtNode.cs プロジェクト: loubo/sones
        public void Init(ParsingContext context, ParseTreeNode parseNode)
        {
            var aSelectNode = (SelectNode)parseNode.ChildNodes[0].AstNode;

            SelectDefinition = new SelectDefinition(aSelectNode.TypeList, aSelectNode.SelectedElements, aSelectNode.WhereExpressionDefinition,
                aSelectNode.GroupByIDs, aSelectNode.Having, aSelectNode.Limit, aSelectNode.Offset, aSelectNode.OrderByDefinition, aSelectNode.ResolutionDepth);
        }
コード例 #12
0
 public void Init(ParsingContext context, ParseTreeNode parseNode)
 {
     if (HasChildNodes(parseNode))
     {
         BinExprNode = (BinaryExpressionNode)parseNode.ChildNodes[1].AstNode;
     }
 }
コード例 #13
0
ファイル: Program.cs プロジェクト: androdev4u/XLParser
    public override void Init(AstContext context, ParseTreeNode parseNode)
		{
			base.Init(context, parseNode);

			foreach (var node in parseNode.ChildNodes)
			{
				if (node.AstNode is Function)
				{
					AddFunction(node.AstNode as Function);
				}
				else if (node.AstNode is AuxiliaryNode)
				{
					var ids = (node.AstNode as AuxiliaryNode).ChildNodes.OfType<IdentifierNode>();

					foreach (var id in ids)
					{
						ExternalFunction ef = new ExternalFunction();
						ef.SetSpan(id.Span);
						ef.Name = id.Symbol;
						AddFunction(ef);
					}
				}
			}

			AsString = "Refal-5 program";
		}
コード例 #14
0
		/// <summary>
		/// Converts identifiers to compound symbols (strings in double quotes),
		/// expands character strings (in single quotes) to arrays of characters
		/// </summary>
		public static void InitNode(AstContext context, ParseTreeNode parseNode)
		{
			foreach (var node in parseNode.ChildNodes)
			{
				if (node.AstNode is LiteralValueNode)
				{
					if (node.Term.Name == "Char")
					{
						var literal = node.AstNode as LiteralValueNode;
						literal.Value = literal.Value.ToString().ToCharArray();
					}

					parseNode.AstNode = node.AstNode;
				}
				else
				{
					// identifiers in expressions are treated as strings (True is same as "True")
					parseNode.AstNode = new LiteralValueNode()
					{
						Value = node.FindTokenAndGetText(),
						Span = node.Span
					};
				}
			}
		}
コード例 #15
0
ファイル: PathParser.cs プロジェクト: mcwatt77/vimcontrols
        private static ParseTreeNode ParseString(IDictionary<string, string> dict, string nodeName, string input)
        {
            var node = new ParseTreeNode {Name = nodeName, Text = input};

            if (!dict.ContainsKey(nodeName)) return node;

            var pattern = dict[nodeName];
            var subPattern = @"\(\?<(?<groupName>\w+)>";
            var matches = Regex.Matches(pattern, subPattern);
            var groupNames = matches.Cast<Match>().Select(match => match.Groups["groupName"].Value).Distinct();

            matches = Regex.Matches(input, pattern, RegexOptions.IgnorePatternWhitespace);

            var captures = groupNames
                .Select(
                name => matches
                            .Cast<Match>()
                            .Select(
                            match => match
                                         .Groups[name]
                                         .Captures
                                         .Cast<Capture>()
                                         .Where(cap => cap.Value.Length > 0)
                                         .Select(cap => ParseString(dict, name, cap.Value))
                            ).Flatten())
                .Flatten();
            node.Children = captures.ToList();

            return node;
        }
コード例 #16
0
 public override void Init(ParsingContext context, ParseTreeNode treeNode) {
   base.Init(context, treeNode);
   foreach (var child in treeNode.ChildNodes) {
       AddChild("parameter", child); 
   }
   AsString = "Param list";
 }
コード例 #17
0
ファイル: FunctionCallNode.cs プロジェクト: anukat2015/sones
 public override void Init(ParsingContext context, ParseTreeNode treeNode) {
   base.Init(context, treeNode);
   TargetRef = AddChild("Target", treeNode.ChildNodes[0]);
   _targetName = treeNode.ChildNodes[0].FindTokenAndGetText(); 
   Arguments = AddChild("Args", treeNode.ChildNodes[1]);
   AsString = "Call " + _targetName;
 }
コード例 #18
0
 private static List<Coeffs> GetCoeffs(ref ParseTreeNode dictionary, out string patch)
 {
     var ret = new List<Coeffs>();
     patch = null;
     foreach (ParseTreeNode x in dictionary.ChildNodes)
     {
         var id = x.ChildNodes[0].GetEntryIdentifier();
         if (id == "patch")
         {
             patch = x.ChildNodes[0].GetBasicValString();
         }
         else
         {
             var item = new Coeffs();
             item.dir = x.ChildNodes[0].ChildNodes[0].Token.Text.ToEnum<DirectionType>();
             item.value = new Vertice();
             var a = x.ChildNodes[0].ChildNodes[2].ChildNodes[1].GetArrayOfDecimal();
             item.value.X = a[0];
             item.value.Y = a[1];
             item.value.Z = a[2];
             ret.Add(item);
         }               
     }
     return ret;
 }
コード例 #19
0
ファイル: AuxiliaryNode.cs プロジェクト: dbremner/irony
        public override void Init(AstContext context, ParseTreeNode treeNode)
        {
            base.Init(context, treeNode);

            foreach (var node in treeNode.ChildNodes)
            {
                // linearize AuxiliaryNode children
                if (node.AstNode is AuxiliaryNode)
                {
                    var auxNode = node.AstNode as AuxiliaryNode;

                    foreach (var n in auxNode.ChildNodes)
                        ChildNodes.Add(n);

                    foreach (var n in auxNode.ChildParseNodes)
                        ChildParseNodes.Add(n);

                    continue;
                }

                // copy AstNode nodes
                if (node.AstNode is AstNode)
                {
                    ChildNodes.Add(node.AstNode as AstNode);
                    continue;
                }

                // otherwise, save parse nodes
                ChildParseNodes.Add(node);
            }
        }
コード例 #20
0
ファイル: SetStmt.cs プロジェクト: Myvar/PashOS
 public override Iast Parse(ParseTreeNode src)
 {
     SetStmt ret = new SetStmt();
     ret.VarName = Iterate(src, "identifier");
     ret.VarValue = Iterate(src, "value");
     return ret;
 }
コード例 #21
0
ファイル: ClassBuilder.cs プロジェクト: maleficus1234/Pie
        // Builds a "class" expression: really could be a class, struct, or module.
        public static void BuildClass(IronyParser parser, Root root, Expression parentExpression, ParseTreeNode currentNode)
        {
            Class c = new Class(parentExpression, currentNode.FindToken().Convert());
            parentExpression.ChildExpressions.Add(c);

            int i = 0;

            // Interpret the declaration modifiers (abstract, public, internal, etc).
            InterpretClassModifiers( root, c, currentNode.ChildNodes[i]);

            i++;

            // Determine if it's a class, module, or struct.
            switch(currentNode.ChildNodes[i].Term.ToString())
            {
                case "module":
                    c.IsModule = true;
                    c.IsFinal = true;
                    c.IsPartial = true;
                    break;
                case "struct":
                    c.IsStruct = true;
                    c.IsModule = false;
                    break;
                default:
                    c.IsStruct = false;
                    c.IsModule = false;
                    break;
            }

            i++;

            // Class name
            c.UnqualifiedName = currentNode.ChildNodes[i].FindTokenAndGetText();

            i++;

            // Get the generic type list.
            if (currentNode.ChildNodes[i].ChildNodes.Count > 0)
            {
                var generics = currentNode.ChildNodes[i].ChildNodes[0].ChildNodes[1];
                foreach (string s in IronyParser.InterpretList(generics))
                    c.GenericTypeNames.Add(s);
            }

            i++;

            // Get the base type list.
            if (currentNode.ChildNodes[i].ChildNodes.Count > 0)
            {
                var baseTypes = currentNode.ChildNodes[i].ChildNodes[0].ChildNodes[0];
                foreach (string s in IronyParser.InterpretList(baseTypes))
                    c.BaseTypeNames.Add(s);
            }

            i+=1;

            // Build the child expressions of the class.
            parser.ConsumeParseTree(root, c, currentNode.ChildNodes[i]);
        }
コード例 #22
0
ファイル: IndexAttributeNode.cs プロジェクト: TheByte/sones
        public void GetContent(CompilerContext myCompilerContext, ParseTreeNode myParseTreeNode)
        {
            if (myParseTreeNode.ChildNodes[0].HasChildNodes())
            {

                if (myParseTreeNode.ChildNodes[0].ChildNodes[0].ChildNodes.Count > 1)
                {

                    _IndexType = ((ATypeNode)myParseTreeNode.ChildNodes[0].ChildNodes[0].ChildNodes[0].AstNode).ReferenceAndType.TypeName;
                    _IndexAttribute = ((IDNode)myParseTreeNode.ChildNodes[0].ChildNodes[0].ChildNodes[2].AstNode).IDChainDefinition;

                }

                else
                {
                    //_IndexAttribute = myParseTreeNode.ChildNodes[0].ChildNodes[0].Token.ValueString;
                    _IndexAttribute = new IDChainDefinition();
                    _IndexAttribute.AddPart(new ChainPartTypeOrAttributeDefinition(myParseTreeNode.ChildNodes[0].ChildNodes[0].Token.ValueString));
                }

            }

            if (myParseTreeNode.ChildNodes.Count > 1 && myParseTreeNode.ChildNodes[1].HasChildNodes())
            {
                _OrderDirection = myParseTreeNode.ChildNodes[1].FirstChild.Token.ValueString;
            }
            else
            {
                _OrderDirection = String.Empty;
            }

            IndexAttributeDefinition = new IndexAttributeDefinition(_IndexAttribute, _IndexType, _OrderDirection);
        }
コード例 #23
0
        public void Init(ParsingContext context, ParseTreeNode parseNode)
        {
            if (HasChildNodes(parseNode))
            {

                //get type
                if (parseNode.ChildNodes[1] != null && parseNode.ChildNodes[1].AstNode != null)
                {
                    _Type = ((AstNode)(parseNode.ChildNodes[1].AstNode)).AsString;
                }
                else
                {
                    throw new NotImplementedQLException("");
                }


                if (parseNode.ChildNodes[3] != null && HasChildNodes(parseNode.ChildNodes[3]))
                {

                    _AttributeAssignList = new List<AAttributeAssignOrUpdate>((parseNode.ChildNodes[3].AstNode as AttributeUpdateOrAssignListNode).ListOfUpdate.Select(e => e as AAttributeAssignOrUpdate));

                }

                if (parseNode.ChildNodes[4] != null && ((WhereExpressionNode)parseNode.ChildNodes[4].AstNode).BinaryExpressionDefinition != null)
                {
                    _WhereExpression = ((WhereExpressionNode)parseNode.ChildNodes[4].AstNode).BinaryExpressionDefinition;
                }

            }
        }
コード例 #24
0
        // Build an interface method declaration.
        public static void BuildInterfaceMethod(IronyParser parser, Root root, Expression parentExpression, ParseTreeNode currentNode)
        {
            var method = new MethodDeclaration(parentExpression, currentNode.Token.Convert());
            parentExpression.ChildExpressions.Add(method);

            // Build the return type of the interface method.
            method.ReturnTypeName = parser.CheckAlias(currentNode.ChildNodes[0].ChildNodes[0].FindTokenAndGetText());

            // The name of the interface method.
            method.Name = currentNode.ChildNodes[0].ChildNodes[1].FindTokenAndGetText();

            // Build the list of generic type names.
            if (currentNode.ChildNodes[1].ChildNodes.Count > 0)
            {
                var generics = currentNode.ChildNodes[1].ChildNodes[0].ChildNodes[1];
                foreach (string s in IronyParser.InterpretList(generics))
                    method.GenericTypeNames.Add(parser.CheckAlias(s));
            }

            // Build the arguments of the method
            if (currentNode.ChildNodes[2].ChildNodes.Count > 0)
            {
                foreach (var n in currentNode.ChildNodes[2].ChildNodes)
                {
                    MethodDeclarationBuilder.BuildArgument(parser, method, n.ChildNodes[0]);
                }
            }
        }
コード例 #25
0
        public void GetContent(CompilerContext context, ParseTreeNode parseNode)
        {
            TypesSettingScope? settingType;
            if (parseNode.HasChildNodes() && (parseNode.ChildNodes.Count >= 2))
            {

                switch (parseNode.ChildNodes[1].Token.Text.ToUpper())
                {
                    case "TYPE":
                        settingType = TypesSettingScope.TYPE;
                        _DescribeSettingDefinition = new DescribeSettingDefinition(settingType, myTypeName: (parseNode.ChildNodes[2].ChildNodes[0].AstNode as ATypeNode).ReferenceAndType.TypeName);
                        break;
                    case "ATTRIBUTE":
                        settingType = TypesSettingScope.ATTRIBUTE;
                        _DescribeSettingDefinition = new DescribeSettingDefinition(settingType, myIDChain: (parseNode.ChildNodes[2].ChildNodes[2].AstNode as IDNode).IDChainDefinition);
                        break;
                    case "DB":
                        settingType = TypesSettingScope.DB;
                        _DescribeSettingDefinition = new DescribeSettingDefinition(settingType);
                        break;
                    case "SESSION":
                        settingType = TypesSettingScope.SESSION;
                        _DescribeSettingDefinition = new DescribeSettingDefinition(settingType);
                        break;
                    default:
                        settingType = null;
                        _DescribeSettingDefinition = new DescribeSettingDefinition(settingType);
                        break;
                }

            }
        }
コード例 #26
0
 public override void Init(ParsingContext context, ParseTreeNode treeNode) {
   base.Init(context, treeNode); 
   Value = treeNode.Token.Value;
   AsString = Value == null ? "null" : Value.ToString();
   if (Value is string)
     AsString = "\"" + AsString + "\""; 
 }
コード例 #27
0
ファイル: DescrAggrNode.cs プロジェクト: TheByte/sones
 public void GetContent(CompilerContext context, ParseTreeNode parseNode)
 {
     if (parseNode.HasChildNodes())
     {
         _DescrAggrDefinition = new DescribeAggregateDefinition(parseNode.ChildNodes[1].Token.ValueString.ToUpper());
     }
 }
コード例 #28
0
ファイル: LambdaNode.cs プロジェクト: androdev4u/XLParser
 private void InitImpl(AstContext context, ParseTreeNode parseNode, ParseTreeNode parametersNode, ParseTreeNode bodyNode) {
   base.Init(context, parseNode);
   Parameters = AddChild("Parameters", parametersNode);
   Body = AddChild("Body", bodyNode);
   AsString = "Lambda[" + Parameters.ChildNodes.Count + "]";
   Body.SetIsTail(); //this will be propagated to the last statement
 }
コード例 #29
0
 public override void Init(ParsingContext context, ParseTreeNode treeNode) {
   base.Init(context, treeNode);
   Test = AddChild("Test", treeNode.ChildNodes[0]);
   IfTrue = AddChild("IfTrue", treeNode.ChildNodes[1]);
   if (treeNode.ChildNodes.Count > 2)
     IfFalse = AddChild("IfFalse", treeNode.ChildNodes[2]);
 } 
コード例 #30
0
ファイル: DumpNode.cs プロジェクト: TheByte/sones
        public override void GetContent(CompilerContext context, ParseTreeNode parseNode)
        {
            #region Get the optional type list

            if (parseNode.ChildNodes[1].HasChildNodes())
            {
                _TypesToDump = ((parseNode.ChildNodes[1].ChildNodes[1].AstNode as TypeListNode).Types).Select(tlnode => tlnode.TypeName).ToList();
            }

            #endregion

            _DumpType           = (parseNode.ChildNodes[2].AstNode as DumpTypeNode).DumpType;
            _DumpFormat         = (parseNode.ChildNodes[3].AstNode as DumpFormatNode).DumpFormat;
            _DumpableGrammar    = context.Compiler.Language.Grammar as IDumpable;

            if (_DumpableGrammar == null)
            {
                throw new GraphDBException(new Error_NotADumpableGrammar(context.Compiler.Language.Grammar.GetType().ToString()));
            }

            if (parseNode.ChildNodes[4].HasChildNodes())
            {
                _DumpDestination = parseNode.ChildNodes[4].ChildNodes[1].Token.ValueString;
            }
        }
コード例 #31
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create indexer expression ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateIndexerExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            var value = Ast <IndexerExpression>(node);

            // [0]                 [1]
            // postfix_expression + array_indexer
            value.Target = (Expression)node.ChildNodes[0].AstNode;
            value.Index  = (Expression)node.ChildNodes[1].AstNode;
        }
コード例 #32
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create variable group raw ast.
        /// </summary>
        /// <param name="parsingContext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateVariableGroupRawAst(ParsingContext parsingContext, ParseTreeNode node)
        {
            var var = Ast <Variable>(node);

            //// [0]                             [1]
            // declaration_specifiers + variable_declarator_list.Q()  + ";";
            var declarationSpecifiers = (Tuple <Qualifier, TypeBase>)node.ChildNodes[0].AstNode;

            var.Qualifiers = declarationSpecifiers.Item1;
            var.Type       = declarationSpecifiers.Item2;

            var declarators = GetOptional <List <Variable> >(node.ChildNodes[1]);

            if (declarators != null)
            {
                var.SubVariables = declarators;

                // Update array type for sub variables
                foreach (var subVariable in declarators)
                {
                    if (subVariable.Type is ArrayType)
                    {
                        ((ArrayType)subVariable.Type).Type = var.Type;
                    }
                    else
                    {
                        subVariable.Type = var.Type;
                    }
                }
            }

            // If this is a variable group, check if we can transform it to a single variable declaration.
            if (var.IsGroup)
            {
                // If the variable is a single variable declaration, replace the group
                if (var.SubVariables.Count == 1)
                {
                    var subVariable = var.SubVariables[0];
                    subVariable.MergeFrom(var);
                    node.AstNode = subVariable;
                }
            }
            else
            {
                // If variable declarators is 0, check if this is a named struct
                var.Type.Qualifiers = var.Qualifiers;
                if (var.Type is StructType)
                {
                    node.AstNode = var.Type;
                }
                else if (var.Type is InterfaceType)
                {
                    node.AstNode = var.Type;
                }
                else if (var.Type is ClassType)
                {
                    node.AstNode = var.Type;
                }
                else
                {
                    parsingContext.AddParserError("Expecting identifier for variable declaration [{0}]", var.Type);
                }

                if (var.Type.Name == null)
                {
                    parsingContext.AddParserError("Cannot declare anonymous type at the top level");
                }
            }
        }
コード例 #33
0
 private int FindUniforms(ParseTreeNode node, int level)
 {
     return(0);
 }
コード例 #34
0
 public static void generate_error_report(ParseTreeNode root)
 {
 }
コード例 #35
0
        private Expression ParseExpression <T>(ParseTreeNode node, ParameterExpression parameterExpression)
        {
            switch (node.Term.Name)
            {
            case "logical-operation":
                var leftLogicalOperandNode = node.ChildNodes[0];
                var logicalOperatorNode    = node.ChildNodes[1];
                var rightLogicalOprandNode = node.ChildNodes[2];
                switch (logicalOperatorNode.ChildNodes[0].Term.Name)
                {
                case "AND":
                    return(Expression.AndAlso(ParseExpression <T>(leftLogicalOperandNode, parameterExpression), ParseExpression <T>(rightLogicalOprandNode, parameterExpression)));

                case "OR":
                    return(Expression.OrElse(ParseExpression <T>(leftLogicalOperandNode, parameterExpression), ParseExpression <T>(rightLogicalOprandNode, parameterExpression)));
                }
                break;

            case "relational-operation":
                var leftRelationalOperandNode  = node.ChildNodes[0];
                var relationalOperatorNode     = node.ChildNodes[1];
                var rightRelationalOperandNode = node.ChildNodes[2];

                var leftExpression  = ParseExpression <T>(leftRelationalOperandNode, parameterExpression);
                var rightExpression = ParseExpression <T>(rightRelationalOperandNode, parameterExpression);

                if (leftExpression.NodeType == ExpressionType.Constant || rightExpression.NodeType == ExpressionType.Constant)
                {
                    FixExpressionType(ref leftExpression, ref rightExpression);
                }

                switch (relationalOperatorNode.ChildNodes[0].Term.Name)
                {
                case "EQ":
                    return(Expression.Equal(leftExpression, rightExpression));

                case "NE":
                    return(Expression.NotEqual(leftExpression, rightExpression));

                case "GE":
                    return(Expression.GreaterThanOrEqual(leftExpression, rightExpression));

                case "GT":
                    return(Expression.GreaterThan(leftExpression, rightExpression));

                case "LE":
                    return(Expression.LessThanOrEqual(leftExpression, rightExpression));

                case "LT":
                    return(Expression.LessThan(leftExpression, rightExpression));
                }
                break;

            case "not-operation":
                return(Expression.Not(ParseExpression <T>(node.ChildNodes[1], parameterExpression)));

            case "string-operation":
                var leftStringFunctionOperandNode  = node.ChildNodes[0];
                var stringFunctionNode             = node.ChildNodes[1];
                var rightStringFunctionOperandNode = node.ChildNodes[2];

                var leftStringFunctionExpression  = ParseExpression <T>(leftStringFunctionOperandNode, parameterExpression);
                var rightStringFunctionExpression = ParseExpression <T>(rightStringFunctionOperandNode, parameterExpression);
                switch (stringFunctionNode.ChildNodes[0].Term.Name)
                {
                case "SW":
                    return(Expression.Call(leftStringFunctionExpression, typeof(string).GetMethod("StartsWith", new[] { typeof(string) }), rightStringFunctionExpression));

                case "EW":
                    return(Expression.Call(leftStringFunctionExpression, typeof(string).GetMethod("EndsWith", new[] { typeof(string) }), rightStringFunctionExpression));

                case "CT":
                    return(Expression.Call(leftStringFunctionExpression, typeof(string).GetMethod("Contains", new[] { typeof(string) }), rightStringFunctionExpression));
                }
                break;

            case "property":
                var inferredProperty = ParsingUtils.InferProperty <T>(node.ChildNodes[0].Token.ValueString);
                if (inferredProperty == null)
                {
                    throw new ParsingException("Expression parsed failed.", new[] { $"The property that has the name similar to {node.ChildNodes[0].Token.ValueString} does not exist." });
                }

                var propertyName = ParsingUtils.InferProperty <T>(node.ChildNodes[0].Token.ValueString).Name;
                return(Expression.Property(parameterExpression, node.ChildNodes[0].Token.ValueString));

            case "string":
                return(Expression.Constant(node.Token.Value));

            case "number":
                var expr = Expression.Constant(node.Token.Value);
                return(expr);
            }
            return(null);
        }
コード例 #36
0
 public Statement Parse(ParseTreeNode node, ParserContext context)
 {
     return(new HelperStatement(new ArgumentsExpression(BuildArguments(node)), node.Term.Name));
 }
コード例 #37
0
        public Resultado ejecutar(ParseTreeNode raiz)
        {
            Resultado resultado = null;

            ParseTreeNode nodoDeclaracion = raiz.ChildNodes[0];

            if (!nodoDeclaracion.ChildNodes[1].ChildNodes[0].Token.Text.ToLower().Equals("integer"))
            {
                //reportar error
                return(null);
            }

            //cambiar ambito
            TablaSimbolo aux = Interprete.tabla;

            Interprete.tabla          = new TablaSimbolo();
            Interprete.tabla.anterior = aux;
            ParseTreeNode SENTSPROC = new ParseTreeNode(new NonTerminal("SENTSPROC"), raiz.Span);

            SENTSPROC.ChildNodes.Add(nodoDeclaracion);
            interprete.ejecutar(SENTSPROC);

            opL = new Logica();
            Resultado     condicion      = opL.operar(raiz.ChildNodes[1]);
            String        operacion      = raiz.ChildNodes[2].ChildNodes[0].Token.Text;
            ParseTreeNode nodoSentencias = raiz.ChildNodes[3];

            if (condicion.valor != null && (condicion.tipo.Equals("integer") || (condicion.tipo.Equals("bool"))))
            {
                while (condicion.valor.ToString().Equals("1"))
                {
                    TablaSimbolo aux2 = Interprete.tabla;
                    Interprete.tabla          = new TablaSimbolo();
                    Interprete.tabla.anterior = aux2;
                    resultado        = interprete.ejecutar(nodoSentencias);
                    Interprete.tabla = aux2;
                    if (condicion.valor.ToString().Equals("1"))
                    {
                        if (resultado != null)
                        {
                            if (resultado.detener)
                            {
                                resultado = null;
                                break;
                            }
                        }

                        Simbolo simbolo = Interprete.tabla.getSimbolo2(nodoDeclaracion.ChildNodes[0].ChildNodes[0].Token.Text.Replace("@", "").ToLower());
                        if (operacion.Equals("++"))
                        {
                            simbolo.valor = Convert.ToInt64(simbolo.valor) + 1;
                        }
                        else
                        {
                            simbolo.valor = Convert.ToInt64(simbolo.valor) - 1;
                        }

                        opL       = new Logica();
                        condicion = opL.operar(raiz.ChildNodes[1]);
                    }
                }
            }
            else
            {
                agregarError("Semantico", "La condicion de una sentencia de control solo puede ser tipo Bool o Integer(0|1)", raiz.Span.Location.Line, raiz.Span.Location.Column);
                return(null);
            }

            Interprete.tabla = aux;

            return(resultado);
        }
コード例 #38
0
 public override void Init(AstContext context, ParseTreeNode treeNode)
 {
     base.Init(context, treeNode);
     InnerExpression = AddChild("Inner", treeNode.ChildNodes[0]);
 }
コード例 #39
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create unary expression ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateUnaryExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            var value = Ast <UnaryExpression>(node);

            //// unary_expression_raw.Rule =
            ////        [0]              [1]         [0]              [1]
            //// incr_or_decr + unary_expression | unary_operator + cast_expression;
            value.Operator   = UnaryOperatorHelper.FromString(node.ChildNodes[0].Token.Text);
            value.Expression = (Expression)node.ChildNodes[1].AstNode;
        }
コード例 #40
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create array initializer expression ast.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateArrayInitializerExpressionAst(ParsingContext context, ParseTreeNode node)
        {
            // [0]        [1]           [3]
            // "{" + initializer_list + "}";
            var value = Ast <ArrayInitializerExpression>(node);

            value.Items = (List <Expression>)node.ChildNodes[1].AstNode;
        }
コード例 #41
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
 /// <summary>
 /// The create type name from token ast.
 /// </summary>
 /// <param name="parsingcontext">
 /// </param>
 /// <param name="node">
 /// </param>
 protected static void CreateTypeNameFromTokenAst(ParsingContext parsingcontext, ParseTreeNode node)
 {
     CreateTypeFromTokenAst <TypeName>(parsingcontext, node);
 }
コード例 #42
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        protected static void CreateTypeFromTokenAst <T>(ParsingContext parsingcontext, ParseTreeNode node) where T : TypeBase, new()
        {
            if (node.ChildNodes.Count == 1 && node.ChildNodes[0].AstNode is T)
            {
                node.AstNode = node.ChildNodes[0].AstNode;
            }
            else
            {
                var value    = Ast <T>(node);
                var nextNode = node;
                while (nextNode.Token == null)
                {
                    nextNode = nextNode.ChildNodes[0];
                }

                value.Name = new Identifier(nextNode.Token.Text)
                {
                    Span = SpanConverter.Convert(node.Span)
                };
            }
        }
コード例 #43
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
 /// <summary>
 /// The create rank specifier ast.
 /// </summary>
 /// <param name="parsingcontext">
 /// </param>
 /// <param name="node">
 /// </param>
 protected static void CreateRankSpecifierAst(ParsingContext parsingcontext, ParseTreeNode node)
 {
     // [0]      [1]       [2]
     // "[" + expression + "]";
     node.AstNode = node.ChildNodes[1].AstNode;
 }
コード例 #44
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create type name ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateTypeNameAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            var value = Ast <TypeName>(node);

            value.Name = (Identifier)node.ChildNodes[0].AstNode;
        }
コード例 #45
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create postfix unary expression ast.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreatePostfixUnaryExpressionAst(ParsingContext context, ParseTreeNode node)
        {
            var value = Ast <UnaryExpression>(node);

            //// post_incr_decr_expression.Rule =
            ////        [0]              [1]
            //// postfix_expression + incr_or_decr;
            value.Expression = (Expression)node.ChildNodes[0].AstNode;
            var operatorText = node.ChildNodes[1].Token.Text;

            value.Operator = (operatorText == "++") ? UnaryOperator.PostIncrement : UnaryOperator.PostDecrement;
        }
コード例 #46
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
 protected static void CreateQualifiersAst(ParsingContext context, ParseTreeNode node)
 {
     node.AstNode = CollectQualifiers(node.ChildNodes[0]);
 }
コード例 #47
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create method invoke expression ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateMethodInvokeExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            var value = Ast <MethodInvocationExpression>(node);

            //// method_invoke_expression.Rule
            // [0]       [1]                [2]
            // = identifier + "(" + argument_expression_list.Q() + ")";
            value.Target = GetExpression(node.ChildNodes[0]);

            var arguments = GetOptional <List <Expression> >(node.ChildNodes[2]);

            if (arguments != null)
            {
                value.Arguments = arguments;
            }
        }
コード例 #48
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create parenthesized expression ast.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateParenthesizedExpressionAst(ParsingContext context, ParseTreeNode node)
        {
            var value = Ast <ParenthesizedExpression>(node);

            // [0]        [1]                      [2]
            // "(" +   argument_expression_list  + ")"
            value.Content = (Expression)node.ChildNodes[1].AstNode;
        }
コード例 #49
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create member reference expression ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateMemberReferenceExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            var value = Ast <MemberReferenceExpression>(node);

            // [0]             [1]      [2]
            // postfix_expression + "." + identifier
            value.Target = (Expression)node.ChildNodes[0].AstNode;
            value.Member = (Identifier)node.ChildNodes[2].AstNode;
        }
コード例 #50
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
 /// <summary>
 /// The create method declaration ast.
 /// </summary>
 /// <param name="context">
 /// </param>
 /// <param name="node">
 /// </param>
 protected static void CreateMethodDeclarationAst(ParsingContext context, ParseTreeNode node)
 {
     //// method_declaration_raw + ";";
     node.AstNode = node.ChildNodes[0].AstNode;
 }
コード例 #51
0
        private int FindStructsAndAttributes(ParseTreeNode parent, int level)
        {
            if (parent == null)
            {
                return(0);
            }

            if (parent.Term == mLanguage.SingleDeclaration)
            {
                var node = parent.ChildNodes[0];
                if (node.Term == mLanguage.FullySpecifiedType)
                {
                    var specifier     = node.ChildNodes.Find(p => p.Term == mLanguage.StructSpecifier);
                    var typeQualifier = node.ChildNodes.Find(p => p.Term == mLanguage.TypeQualifier);
                    if (specifier != null)
                    {
                        var temp = new StructInfo();
                        temp.Layout = new LayoutInformation();
                        ExtractLayout(temp.Layout, typeQualifier);
                        return(ExtractStructMembers(temp, specifier));
                    }

                    var inDirection = typeQualifier.ChildNodes.Find(p => p.Term == mLanguage.InTerm);

                    var outDirection = typeQualifier.ChildNodes.Find(p => p.Term == mLanguage.OutTerm);

                    if (inDirection == null && outDirection == null)
                    {
                        return(0);
                    }

                    var attribute = new InputAttribute();
                    attribute.Direction = (inDirection != null) ? "in" : ((outDirection != null) ? "out" : null);
                    attribute.Layout    = new LayoutInformation();
                    ExtractLayout(attribute.Layout, typeQualifier);
                    var secondNode = node.ChildNodes [1];
                    if (!mLanguage.TypesTerms.Contains(secondNode.Token.KeyTerm))
                    {
                        return(0);
                    }

                    attribute.TypeString  = secondNode.Token.ValueString;
                    attribute.ClosestType = mTypeLookup.FindClosestType(attribute.TypeString);

                    var nameSibiling = parent.ChildNodes [1];
                    attribute.Name = nameSibiling.Token.ValueString;

                    // IGNORE
                    if (!mAttributes.ContainsKey(attribute.Name))
                    {
                        mAttributes.Add(attribute.Name, attribute);
                        return(1);
                    }
                    else
                    {
                        return(0);
                    }
                }
                else
                {
                    return(0);
                }
            }
            else
            {
                int total = 0;
                foreach (ParseTreeNode child in parent.ChildNodes)
                {
                    total += FindStructsAndAttributes(child, level + 1);
                }
                return(total);
            }
        }
コード例 #52
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create literal expression ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateLiteralExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            var value = Ast <LiteralExpression>(node);

            value.Literal = (Literal)node.ChildNodes[0].AstNode;
        }
コード例 #53
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create binary expression ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateBinaryExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            // [0]          [1]         [2]
            // expression + operator + expression
            var value = Ast <BinaryExpression>(node);

            value.Left     = (Expression)node.ChildNodes[0].AstNode;
            value.Operator = BinaryOperatorHelper.FromString(node.ChildNodes[1].Token.Text);
            value.Right    = (Expression)node.ChildNodes[2].AstNode;
        }
コード例 #54
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create identifier indexable ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateIdentifierIndexableAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            // identifier + rankSpecifier.Star();
            var value      = Ast <Identifier>(node);
            var identifier = (Identifier)node.ChildNodes[0].AstNode;

            value.Text    = identifier.Text;
            value.Indices = new List <Expression>();
            FillListFromNodes(node.ChildNodes[1].ChildNodes, value.Indices);
        }
コード例 #55
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create declaration statement ast.
        /// </summary>
        /// <param name="context">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateDeclarationStatementAst(ParsingContext context, ParseTreeNode node)
        {
            var declarationStatement = Ast <DeclarationStatement>(node);

            declarationStatement.Content = (Node)node.ChildNodes[0].AstNode;
        }
コード例 #56
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create identifier list ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateIdentifierListAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            var identifiers = Ast <List <Identifier> >(node);

            FillListFromNodes(node.ChildNodes, identifiers);
        }
コード例 #57
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
 /// <summary>
 /// The create assignment operator.
 /// </summary>
 /// <param name="parsingContext">
 /// </param>
 /// <param name="node">
 /// </param>
 protected static void CreateAssignmentOperator(ParsingContext parsingContext, ParseTreeNode node)
 {
     node.AstNode = AssignmentOperatorHelper.FromString(node.ChildNodes[0].Token.Text);
 }
コード例 #58
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
 protected static void CreateEmptyStatementAst(ParsingContext context, ParseTreeNode node)
 {
     Ast <EmptyStatement>(node);
 }
コード例 #59
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        private static void CreateVariableReferenceExpressionAst(ParsingContext context, ParseTreeNode node)
        {
            //// variable_identifier.Rule = identifier;
            var value = Ast <VariableReferenceExpression>(node);

            value.Name = (Identifier)node.ChildNodes[0].AstNode;
        }
コード例 #60
0
ファイル: ShaderGrammar.Ast.cs プロジェクト: Aggror/Stride
        /// <summary>
        /// The create conditional expression ast.
        /// </summary>
        /// <param name="parsingcontext">
        /// </param>
        /// <param name="node">
        /// </param>
        protected static void CreateConditionalExpressionAst(ParsingContext parsingcontext, ParseTreeNode node)
        {
            var value = Ast <ConditionalExpression>(node);

            // [0]                     [1]      [2]                      [3]
            // logical_or_expression + "?" + expression + ":" + conditional_expression;
            value.Condition = (Expression)node.ChildNodes[0].AstNode;
            value.Left      = (Expression)node.ChildNodes[2].AstNode;
            value.Right     = (Expression)node.ChildNodes[3].AstNode;
        }