2009-10-16 5 views
0
numberrange returns [String value] 
    : numberrangesub 
     { 
     String numberRange = ($numberrangesub.text); 
     String [] v = numberRange.split(","); 
     if (Integer.parseInt(v[0].trim()) < Integer.parseInt(v[1].trim())) $value =numberRange; 
     else throw new RecognitionException(); 
     } 
    ; 

위의 ANTLR 코드를 준수하십시오. 이 부분에서 "from value should be less than to value in BETWEEN clause"과 같은 사용자에게 친숙한 오류 메시지를 표시하고 싶습니다. 나는 이처럼 기대하고있다 RecognitionException("from value should be less than to value in BETWEEN clause"); 그러나 antlr은 위와 같이 받아들이지 않았다.antlr3을 사용하여 사용자 정의 오류 메시지 받기

Java 클래스에서 Antlr에 의해 생성 된 Java 클래스를 호출합니다. 나는 다음과 같이 취급하고 있습니다.

try 
{ 
    parser.numberRangeCheck(); 
} 
catch (RecognitionException e) 
{ 
    throw createException("Invalid Business logic syntax at " + parser.getErrorHeader(e) + ", " + parser.getErrorMessage(e, null), Level.INFO, logger); 
} 

도움이 될 것입니다.

+0

ANTLR 코드에서 코드 포맷터를 사용할 수 있습니까? 그렇게하면 읽는 것이 훨씬 쉬워집니다. – Jorn

+0

숫자 범위는 [문자열 값] 을 반환합니다. numberrangesub { String numberRange = ($ numberrangesub.text); String [] v = numberRange.split (","); if (Integer.parseInt (v [0] .trim()) Ashok

+0

코드 포맷터를 사용하고 있지만 게시 후 포맷되지 않은 것으로 나타납니다. 왜 그런지 알지 못합니다. – Ashok

답변

0

RuntimeException을 사용자 정의 오류 메시지와 함께 보내지 않는 이유는 무엇입니까? 테 런스는 "드 Fi를이 최후의 ANTLR 참조"에 error chapter excerpt을 썼던 것처럼

// ... 
else throw new RuntimeException("from value should be less than to value in BETWEEN clause"); 
// ... 
0

:

영어 전용 오류 메시지를 강요 방지하기 위해 일반적으로 가능한 FL 융통성이 같은 일을하기 위해, 인식기하지 않습니다 문자열 메시지가있는 개체를 만듭니다. 대신 오류를 생성하는 데 필요한 정보를 추적합니다.

따라서 RecognitionError의 생성자에 오류 메시지가 제공되지 않습니다.

numberrange returns [String value] 
    : numberrangesub 
     { 

     String numberRange = ($numberrangesub.text); 
     String [] v = numberRange.split(","); 
     if (Integer.parseInt(v[0].trim()) < Integer.parseInt(v[1].trim())) 
      $value = numberRange; 
     else { 
      this.errorMessage = "from value should be less than to value in BETWEEN clause"; 
      throw new RecognitionException(this.input); 
     } 

     } 
    ; 

그리고 다음 getErrorMessage 방법 오버라이드 (override) :

public String getErrorMessage(RecognitionException e, String[] tokenNames) { 
    String msg = this.errorMessage; 
    // ... 
} 

이 유사한 작동을하지만 당신은 사용자 친화적 인 오류 메시지가 RecognitionError 처리에 표시 유지하기 위해 인식기의 추가 필드를 정의 할 수 있습니다 바꿔 치기 메커니즘은 같은 발췌 부분에서 설명했다.

관련 문제