ANTLR 규칙을 방문하는 동안 선택적 토큰을 구별합니다

StackOverflow https://stackoverflow.com//questions/20014741

  •  21-12-2019
  •  | 
  •  

문제

이 질문은 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]'에서 실행 가능한 대안 없음 '

이유를 알고 싶습니다. 적어도 해결책을 가지고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top