基于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
答案 0 :(得分:0)
感谢@Lucas我明白了:
ompParallel
locals [static java.util.HashSet<String> names]
@init {
OmpParallelContext.names = new java.util.HashSet<String>();
}
: PARALLEL modifiers ;
需要定义变量static
,以便从不同的类访问它。不幸的是,ANTLR4生成的Parser代码似乎有些笨拙。