如何复制RuleContext

时间:2014-02-06 09:12:47

标签: antlr4

有没有办法复制ParserRule?我需要一个真正的深层副本,因此copyFrom()不能解决问题。或者我必须重新解析代码吗?

如何解决以下问题的另一个想法也将非常感激:

我正在研究编译器,将旧的遗留代码翻译成现代编程语言,在本例中为EGL - > Java的。 EGL有一个名为Standalone Function的概念,它类似于C-macros。这意味着函数内部的代码可以引用调用范围中的符号。因此,符号和类型提升的定义和解析都与上下文有关。

在ANTLR3中,我们通过dupTree()解决了这个问题,并简单地在每个调用范围内制作了一个副本。

动态类型不是一种选择。

示例(伪代码)来说明:

Program A
    int var = 4;
    saf();    # Prints 5 
end A;

Program B
    String var = "abc";
    saf();    # Prints abc1 
end B;

function saf()
    int j = 1;
    print(var + j);
end saf;

1 个答案:

答案 0 :(得分:2)

从版本4.2开始,ANTLR 4在解析完成后不包含任何用于操作解析树结构的API。这是我们目前正在探索的领域,特别是考虑到新模式匹配语法创建的可能性。

对于复制树,我建议您实现生成解析器时创建的访问者界面。这将允许您在解析树中的任何节点上调用visit来创建该节点的深层副本。