antlr4 grammar-locals子句不在Parser中生成变量声明

时间:2014-11-13 19:31:22

标签: antlr grammar antlr4

基于this answer我的规则如下:

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");}
;

但在生成的Parser中只有

public java.util.HashSet<String> names;

没有声明= new java.util.HashSet<String>();

根据this answer的最后一段,我尝试了类似

的内容
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

我真的很困惑,有人可以帮帮我吗?最好固定第一个替代方案(使用locals [...]

EDIT1: related source

1 个答案:

答案 0 :(得分:0)

感谢@Lucas我明白了:

ompParallel    
locals [static java.util.HashSet<String> names]
@init {
    OmpParallelContext.names = new java.util.HashSet<String>();
}
: PARALLEL modifiers ;

需要定义变量static,以便从不同的类访问它。不幸的是,ANTLR4生成的Parser代码似乎有些笨拙。