Antlr 这是存储和重新处理AST子图的一种方法吗?

Antlr 这是存储和重新处理AST子图的一种方法吗?,antlr,Antlr,我正在设计一种声明性语言。在我的语言中是“节点”的定义,以后可以重用。把它们想象成原型或模板。您可以根据需要创建它们的副本。我有一个版本的解释器,它在定义阶段生成适当的Java对象。直到最近,我一直在使用深度复制库来创建节点的Java表示的副本,以创建节点的实例。由于我发现的大多数深度复制库的局限性,以及我不想为系统中的每个对象编写复制构造函数,我想采取不同的方法。我的语言的一部分指定了GUI Java Swing对象,这会导致深度复制库出现问题 是否有一种方法可以保存AST子图以用于对象声明,

我正在设计一种声明性语言。在我的语言中是“节点”的定义,以后可以重用。把它们想象成原型或模板。您可以根据需要创建它们的副本。我有一个版本的解释器,它在定义阶段生成适当的Java对象。直到最近,我一直在使用深度复制库来创建节点的Java表示的副本,以创建节点的实例。由于我发现的大多数深度复制库的局限性,以及我不想为系统中的每个对象编写复制构造函数,我想采取不同的方法。我的语言的一部分指定了GUI Java Swing对象,这会导致深度复制库出现问题


是否有一种方法可以保存AST子图以用于对象声明,并在需要创建节点实例时重新处理它?我是从ANTLR AST的角度提出这个问题的,但如果您有语言实现建议,我也欢迎您提出这个问题。

在ANTLR解析器/词法分析器语法中,您可以访问
$ruleName.tree
。此规则属性是对解析期间生成的AST子树的引用。使用
@after
字段和
@members
字段,可以存储子树。让我给你看看

@members{
private List<CommonTree> defs = new ArrayList<CommonTree>();

public List<CommonTree> getDefs(){
    return defs;
}

}
这将创建所有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

List nodes=walker.topRule()

这将允许您通过重新处理保存的AST子图来创建节点实例。您可以创建TreeNodeStream,并在需要创建实例时调用walker。

在ANTLR解析器/lexer语法中,您可以访问
$ruleName.tree
。此规则属性是对解析期间生成的AST子树的引用。使用
@after
字段和
@members
字段,可以存储子树。让我给你看看

@members{
private List<CommonTree> defs = new ArrayList<CommonTree>();

public List<CommonTree> getDefs(){
    return defs;
}

}
这将创建所有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

List nodes=walker.topRule()
这将允许您通过重新处理保存的AST子图来创建节点实例。您可以创建TreeNodeStream,并在需要创建实例时调用walker