2015-07-28 58 views
0

我想通过AST树并获取ChildNode等于“IfStatement”,但可能会有很多Childnodes,如下面的代码所示。有没有办法以递归的方式添加childNodes并检查值?穿过AST树并获取childnode值Irony

MyGrammar grammar = new MyGrammar(); 
Parser parser = new Parser(grammar); 
var result = parser.Parse(textBox.Text); 

var IfNode=result.Root.ChildNodes[0].ChildNodes[0].ChildNodes[1].ChildNodes[0].ToString() == "IfStatement"; 

我想这样的事情,但它不工作

var IfCheck = result.Root.ChildNodes.FindAll(x => x.ChildNodes.ToString() == "IfStatement"); 

回答

0

可以遍历您的树:通过

/// <summary> 
/// Parser extension methods 
/// </summary> 
public static class ParserExt 
{ 
    /// <summary> 
    /// Converts parser nodes tree to flat collection 
    /// </summary> 
    /// <param name="item"></param> 
    /// <param name="childSelector"></param> 
    /// <returns></returns> 
    public static IEnumerable<ParseTreeNode> Traverse(this ParseTreeNode item, Func<ParseTreeNode, IEnumerable<ParseTreeNode>> childSelector) 
    { 
     var stack = new Stack<ParseTreeNode>(); 
     stack.Push(item); 
     while (stack.Any()) 
     { 
      var next = stack.Pop(); 
      yield return next; 

      var childs = childSelector(next).ToList(); 
      for (var childId = childs.Count - 1; childId >= 0; childId--) 
      { 
       stack.Push(childs[childId]); 
      } 
     } 
    } 
} 

然后,就循环:

var nodes = result.Root.Traverse(node => node.ChildNodes); 

var ifStatements = nodes.Where(node => node.Term.Name.Equals("IfStatement"));