Ejemplo n.º 1
0
        private static ConsumeReferenceExpression BuildReferenceExpression(CstNonterminalNode node)
        {
            ConsumeReferenceExpression expression = new ConsumeReferenceExpression();

            if (node.Children.Count == 1)
            {
                //                CstNonterminalNode nonterminal = (CstNonterminalNode)((Token)((ICstTerminalNode)node.Children[0]).Terminal).StructuredLexeme;
                expression.NonTerminal = node.Children[0].Coalesce();
            }
            else
            {
                CstNonterminalNode targetNode = (CstNonterminalNode)node.Children[0];
                ConsumeExpression  target     = BuildExpression(targetNode);
                expression.Target = target;

                //                CstNonterminalNode nonterminal = (CstNonterminalNode)((Token)((ICstTerminalNode)node.Children[2]).Terminal).StructuredLexeme;
                expression.NonTerminal = node.Children[2].Coalesce();//nonterminal.Coalesce();
            }
            return(expression);
        }
Ejemplo n.º 2
0
        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);
        }