Based on this answer I made my rule like:
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");}
;
but in generated Parser there is only
public java.util.HashSet<String> names;
without declaration = new java.util.HashSet<String>();
.
According to last snippet of this answer I tried something like
ruleName
@init {
java.util.HashSet<String> names = new java.util.HashSet<String>();
}
: SOME_LEXER_CONSTANT modifiers ;
This led to grammar-compilation error
unknown attribute names for rule ompParallel in $ompParallel::names
I am really confused, could someone help me out? Preferably fixin the first alternative (using locals [...]
.
EDIT1: related source