将属性范围从antlr3迁移到antlr4

时间:2017-04-28 09:46:20

标签: antlr antlr4 antlr3

在ANTLR3中使用规则scope块是possible

formUsage
scope {
    Form form;
}
:   formUsage1
|   formUsage2
|   formUsage3
;

formUsage1
:   someUsage { $formUsage::form = ... ; }   
...

我们有一些语法的大部分可以在一个特定的对象上运行。 scope块是在特定规则和所有子规则中实现某些公共状态的一个很好的功能。或者,我们可以将此公共状态作为参数传递给所有子规则或将其放入全局@parser::members。但scope阻止正是我们所需要的。

将此块迁移到ANTLR4的更好方法是什么?

1 个答案:

答案 0 :(得分:1)

您现在可能想要的是本地人,这是Rule Attribute Definitions的一部分。 ANTLR4中解析器规则的语法是:

rulename[args] returns [retvals] locals [localvars] : ... ;

locals部分保留为给定,而不是由ANTLR4解析。这允许在那里使用任何特定于目标的代码。