문제
이 질문은 ANTLR 규칙을 방문하는 동안 선택적 토큰을 구별하는 방법에 관한 것입니다.
int로 표시되는 태그에 표현식의 결과를 할당하려고 시도하는 antlr4 문법을 int (예 : 215="foo")로 할당하려고 시도하는 파서 규칙을 가지고 있습니다. 또한 예를 들어 215 [2]="foo"와 같은 index 태그에 할당을 허용합니다. 내 질문은 Antlr 할당 규칙의 평가 중에 Antlr에서 제공하는 객체를보고 양식 215 [2] 양식의 ints를 구별 할 수 있습니까?
assign : INT '=' expr ;
INT : '-'? DIGIT+ ('[' DIGIT+ ']')?;
DIGIT : [0-9] ;
.
토큰 스트림에 대한 "할당"규칙에 대한 파서의 평가를 캡처하는 방문 방식을 정의했습니다.
215 [2]="foo"
@Override
public String visitAssign(@NotNull FixRulesParser.AssignContext ctx) {
String left = ctx.getStart().getText();
String right = ctx.getStop().getText();
...
.
이 시점에서 왼쪽="215 [2] 및 오른쪽="foo "
CTX 객체는 할당의 왼쪽이 실제로 int로 정의 된 옵션 '[2]'을 실제로 포함하는지 여부를 결정하는 방법을 제공합니까? 나는 양식 215 [2] 대 215의 ints를 구별하고 싶다. 나는 Java Regex를 파싱하여 '왼쪽 참조'(아래 참조)를 사용하여 Antlr에서 직접 대답을 얻을 수 있는지 궁금합니다. / P>
.Pattern p = Pattern.compile("(-?\\d+)((\\[)(\\d+)(\\]))?");
해결책
"antlr 참조 - 12 장" 색인 "[2]"를 자신의 렉서 토큰으로 정의하고 별도의 채널에 배치하는 것이 었습니다.
assign : INT '=' expr ;
INT : '-'? DIGIT+ ;
IDX : '[' DIGIT+ ']' -> channel(TAG_INDEX);
DIGIT : [0-9] ;
.
그 다음에 나는 reightassign ()에서 결정을 내릴 수 있습니다 :
@Override
public String visitAssign(@NotNull FixRulesParser.AssignContext ctx) {
BufferedTokenStream tokens = tokenStream; // passed in to the constructor as arg
Token t = tokens.get(1);
int type = t.getType();
if (type == FixRulesParser.IDX) {
System.out.println("YES");
} else {
System.out.println("NO");
}
.
여기에 수업은 IDX가 개별적으로 참조 해야하는 경우 다른 토큰과 결합되어서는 안됩니다.
아직도 혼란스러운 한 가지는 tag_index 채널을 제거하는 것입니다 :
IDX : '[' DIGIT+ ']';
.
I GET : 1 : 4 입력 '215 [2]'에서 실행 가능한 대안 없음 '
이유를 알고 싶습니다. 적어도 해결책을 가지고 있습니다.