示例#1
0
/*
 *      private void CoalesceAndConvert(object astNode, PropertyInfo property, ICstNode cstNode, Type typeConverter, object converterArgs)
 *      {
 *          string value = cstNode.Coalesce();
 *          ITypeConverter converter = (ITypeConverter)Activator.CreateInstance(typeConverter);
 *          object o = converter.Convert(value, property.PropertyType, converterArgs);
 *          property.SetValue(astNode, o, null);
 *      }
 */

        private IEnumerable <ICstNonterminalNode> GetChildrenByAstExpression(ICstNonterminalNode node, ConsumeExpression[] expressions)
        {
            IEnumerable <ICstNonterminalNode> result = new ICstNonterminalNode[0];

            foreach (var exp in expressions)
            {
                result = result.Concat(exp.Resolve(node).Cast <ICstNonterminalNode>());
            }
            return(result);
        }
示例#2
0
 public override IEnumerable <ICstNode> Resolve(ICstNonterminalNode node)
 {
     if (Predicate == null || Predicate.Resolve(node) != null)
     {
         return(Expression.Resolve(node));
     }
     else
     {
         return(new ICstNode[0]);
     }
 }
示例#3
0
        private IEnumerable <ICstNonterminalNode> GetChildrenByNonterminal(ICstNonterminalNode node, Nonterminal nonterminal)
        {
            IEnumerable <ICstNonterminalNode> result = new ICstNonterminalNode[0];

            foreach (var childNode in node.Children
                     .OfType <ICstNonterminalNode>()
                     .Where(o => o.Nonterminal.Name == nonterminal.Name))
            {
                yield return(childNode);
            }
        }
示例#4
0
        public override IEnumerable <ICstNode> Resolve(ICstNonterminalNode node)
        {
            IEnumerable <ICstNode> result = new ICstNode[0];

            foreach (ConsumeExpression choice in Choices)
            {
                result = result.Concat(choice.Resolve(node));
            }
            bool anyNull = result.Contains(null);

            return(result.Cast <ICstNonterminalNode>().OrderBy(o => o.AbsoluteIndex).Cast <ICstNode>());
        }
示例#5
0
        public string ResolveAsString(ICstNonterminalNode node)
        {
            var result = Resolve(node);

            if (result.Any())
            {
                return(result.First().Coalesce());
            }
            else
            {
                return(null);
            }
        }
示例#6
0
        public override IEnumerable <ICstNode> Resolve(ICstNonterminalNode node)
        {
            Func <ICstNonterminalNode, IEnumerable <ICstNode> > ret = cstNode => cstNode.Children.OfType <ICstNonterminalNode>().Where(o => o.Nonterminal.Name == NonTerminal).Cast <ICstNode>();
            IEnumerable <ICstNode> result = new ICstNode[0];

            if (Target != null)
            {
                foreach (ICstNonterminalNode current in Target.Resolve(node))
                {
                    result = result.Concat(ret(current));
                }
            }
            else
            {
                result = result.Concat(ret(node));
            }
            return(result);
        }
        public override IEnumerable <ICstNode> Resolve(ICstNonterminalNode node)
        {
            if (Index < 1)
            {
                throw new InvalidOperationException("Indices in consume attributes are 1-based: " + this);
            }

            ConsumeReferenceExpression           targetAsReference = (ConsumeReferenceExpression)Target;
            Func <ICstNonterminalNode, ICstNode> ret = cstNode => cstNode.Children.OfType <CstNonterminalNode>().Where(o => o.Nonterminal.Name == targetAsReference.NonTerminal).ElementAtOrDefault(Index - 1);
            IEnumerable <ICstNode> result            = new ICstNode[0];

            if (targetAsReference.Target != null)
            {
                foreach (ICstNonterminalNode child in targetAsReference.Target.Resolve(node))
                {
                    if (child != null)
                    {
                        ICstNode element = ret(child);
                        if (element != null)
                        {
                            result = result.Union(element);
                        }
                    }
                }
            }
            else
            {
                ICstNode element = ret(node);
                if (element != null)
                {
                    result = result.Union(element);
                }
            }

            return(result);
        }
示例#8
0
 public abstract IEnumerable <ICstNode> Resolve(ICstNonterminalNode node);