在ANTLR解析器/词法语法,您可以访问一个$ruleName.tree
。此规则属性是对解析期间生成的AST子树的引用。使用@after
字段和@members
字段,可以存储子树。我来给你展示。
@members{
private List<CommonTree> defs = new ArrayList<CommonTree>();
public List<CommonTree> getDefs(){
return defs;
}
}
低于你的语法
ruleName
@after{
defs.add($ruleName.tree);
}
: IDENT ;
这将创造一切RULENAME AST子树的列表。这些树可以转换为CommonTreeNodeStream并与您的树语法代码一起使用。
CommonTree defTree = Parser.getDefs().get(0); // just getting the first tree for example
CommonTreeNodeStream defStream = new CommonTreeNodeStream(defTree);
TreeWalker walker = new TreeWalker(defStream);
//assuming that I have a tree grammar that has been defined to return a list of nodes
见this question for more info on returning data from an ANTLR grammar rule.
List<Node> nodes = walker.topRule()
这将允许您通过后处理保存AST子图创建节点实例。您可以创建TreeNodeStream并在需要创建实例时调用Walker。