在 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
有关从 ANTLR 语法规则返回数据的更多信息,请参阅此问题。
List<Node> nodes = walker.topRule()
这将允许您通过重新处理保存的 AST 子图来创建节点实例。您可以创建 TreeNodeStream 并在需要创建实例时调用 walker。