将属性范围从 antlr3 迁移到 antlr4

Migrating attribute scope from antlr3 to antlr4

在 ANTLR3 中 possible 使用规则 scope 块:

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

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

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

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

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

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

locals 部分保持原样,未被 ANTLR4 解析。这允许那里有任何目标特定代码。