antlr4语法局部子句不';t在解析器中生成变量声明

antlr4语法局部子句不';t在解析器中生成变量声明,antlr,grammar,antlr4,Antlr,Grammar,Antlr4,基于此,我制定了如下规则: ompParallel locals [java.util.HashSet<String> names = new java.util.HashSet<String>();] : SOME_LEXER_CONSTANT modifiers ; modifiers //Ensure that the full number of modifiers have been provided : {$ompParallel::names.si

基于此,我制定了如下规则:

ompParallel
  locals [java.util.HashSet<String> names = new java.util.HashSet<String>();]
  : SOME_LEXER_CONSTANT modifiers ;

modifiers
//Ensure that the full number of modifiers have been provided
: {$ompParallel::names.size() < 3}? predicateModifier modifiers
| {$ompParallel::names.size() == 3}? //match nothing once we have (any) three modifiers
;

predicateModifier
//Ensure that no duplicates have been provided
: {!$ompParallel::names.contains("a")}? A {$ompParallel::names.add("a");}
| {!$ompParallel::names.contains("b")}? B {$ompParallel::names.add("b");}
| {!$ompParallel::names.contains("c")}? C {$ompParallel::names.add("c");}
;
我真的很困惑,有人能帮我吗?最好固定在第一个备选方案中(使用
局部变量[…]

EDIT1:

多亏了我的理解:

ompParallel    
locals [static java.util.HashSet<String> names]
@init {
    OmpParallelContext.names = new java.util.HashSet<String>();
}
: PARALLEL modifiers ;
并行
局部变量[静态java.util.HashSet名称]
@初始化{
OmpParallelContext.names=new java.util.HashSet();
}
:平行修饰符;

为了从不同的类访问变量,需要定义变量
static
。不幸的是,ANTLR4生成的解析器代码似乎有点笨拙。

]
之前的第一次尝试中尝试删除
。如果这不起作用,作为一种解决方法,您可以尝试将这两种方法结合起来:decla使用
locals[java.util.HashSet name]
重新创建变量,并使用
@init{names=new java.util.HashSet();}
初始化它,但是…meh。前一种解决方案没有帮助,但是字母有帮助(经过一些调整,请参见下面我的答案)谢谢!不管怎样,我认为这是个问题,我会把它报告给某个问题跟踪程序。无论如何,在递归规则中使用<代码>静态< /代码>时要非常小心。
ruleName
  @init {
      java.util.HashSet<String> names = new java.util.HashSet<String>();
  }
  : SOME_LEXER_CONSTANT modifiers ;
 unknown attribute names for rule ompParallel in $ompParallel::names
ompParallel    
locals [static java.util.HashSet<String> names]
@init {
    OmpParallelContext.names = new java.util.HashSet<String>();
}
: PARALLEL modifiers ;