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); }
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); }