2014-01-29 2 views
0

github에서 ANTLR v4 Java 문법을 사용할 수 있습니다.ANTLR V4 Java 문법 시프트 연산자

저는 특정 규칙에서 보았던 시프트 연산자에 관한 질문이 있습니다.

('<' '<' | '>' '>' '>' | '>' '>') 

내가

class C<T extends I<T>> 

마지막>에서, 그들은 때문에 제네릭 형식 선언에서 발생할 수있는 어떤

('<<' | '>>>' | '>>') 

처럼 선언되지 않은 추측 다음과 같이 이러한 연산자 선언 >는 시프트 연산자로 사용됩니다. 내가 맞습니까? 이제 내가 궁금해하는 것은 :이 표기법 '<' '<'은 두 개의 "보다 작음"기호 사이에 공백이 오도록 허용합니까?

int a = 1 < < 2; 

이것은 유효한 입력일까요?

미리 감사드립니다.

답변

0

구문 분석기는 표현식으로 1 < < 2을 수락하지만 구문 분석 트리가 생성 된 후에 실행되는 수신기는 구문 분석 트리에서 시프트 연산자의 각 인스턴스를 확인하여 노드가 실제로 사용 된 올바른 연산자의 결과인지 확인합니다. 소스 코드.

@Override 
public void enterShiftOperator(ShiftOperatorContext ctx) { 
    for (int i = 1; i < ctx.getChildCount(); i++) { 
    if (ctx.getChild(i).getTokenIndex() != ctx.getChild(i - 1).getTokenIndex() + 1) { 
     throw new UnsupportedOperationException("TODO: report error about incorrect operator in the source code"); 
    } 
    } 
} 

주 :이 구현은, 이렇게하면 토큰에 할당 된 인덱스에 영향을 미칠 것이기 때문에 문법의 -> skip 렉서 명령을 사용하지에 의존

  • .
  • 이 구현은 메서드에 대해 JavaUnicodeInputStream이 유니 코드 변환을 구현하지 않았기 때문에 텍스트를 직접 확인하지 않습니다.
+0

샘 감사합니다. 내 Java 문법에 대한 제네릭 지원을 추가하고 시프트 토큰 ('>>')에 문제가 발생했습니다. 위에서 설명한대로 토큰을 분할하면 Shift 대입 연산자 ('> =' '=>'가되어야 함)도 나눠야한다는 점을 제외하고는 괜찮습니다. 왜 할당 운영자가 문제를 일으키는 거지? –