2011-04-07 11 views
1

사용자 입력이 정의 된 규칙과 일치하지 않을 때 사용자 정의 오류를보고해야합니다. 여기 antlr 3.0에서 오류가 발생했습니다.

내 코드입니다 :

grammar second1; 

@lexer::members { 
@Override 
public void reportError(RecognitionException e) { 
    System.out.println("Throwing Exception: "+ e.getMessage()); 
    throw new IllegalArgumentException(e); 
} 
} 

@parser::members { 
private boolean inbounds(Token t, int min, int max, String methodName) { 
    int n = Integer.parseInt(t.getText());  
    if(n >= min && n <= max) { 
    return true; 
    } 
    else { 
    System.out.println("The range for value accepted by " + methodName+" is "+min +"-" + max); 
    return false; 
    } 
} 
} 

expr  : SET attribute EOF; 

attribute : Value1 int1:integer1["Value1"] { System.out.println("Accepted"); } 
     | Value2 integer2 ["Value2"] { System.out.println("Accepted"); } 
     ; 
exception[int1]: 
     catch[Exception e] {System.out.println("Error Reported for int1");} 
exception: 
     catch[Exception e] {System.out.println("General error Reported");} 

integer1 [String methodName] : Int { inbounds($Int,0,1000,methodName) }? ; 
integer2 [String methodName] : Int { inbounds($Int,0,10000,methodName) }? ; 
Int  : '0'..'9'+; 

SET  : 'set'; 
Value1  : 'value'; 
Value2  : 'value2'; 

fragment WS 
    : (' ' | '\t') 
; 

하지만이 코드를 컴파일하는 동안 다음과 같은 오류가 점점 오전 :

error(100): second1.g:26:22: syntax error: antlr: second1.g:26:22: unexpected token: int1 
error(100): second1.g:29:17: syntax error: antlr: second1.g:29:17: unexpected token: : 
error(100): second1.g:32:10: syntax error: antlr: second1.g:32:10: unexpected token: catch 
error(100): second1.g:0:0: syntax error: assign.types: <AST>:0:0: unexpected AST node: <end-of-block> 
error(100): second1.g:0:0: syntax error: assign.types: <AST>:0:0: unexpected end of subtree 
error(100): second1.g:0:0: syntax error: define: <AST>:0:0: unexpected AST node: <end-of-block> 
error(100): second1.g:0:0: syntax error: define: <AST>:0:0: unexpected AST node: <end-of-block> 
error(100): second1.g:0:0: syntax error: define: <AST>:0:0: unexpected end of subtree 
error(106): second1.g:26:27: reference to undefined rule: integer1 
error(106): second1.g:27:22: reference to undefined rule: integer2 
warning(105): second1.g:27:15: no lexer rule corresponding to token: Value2 
warning(105): second1.g:26:15: no lexer rule corresponding to token: Value1 
warning(105): second1.g:24:15: no lexer rule corresponding to token: SET 

어떻게해야합니까를? :(내가 인터넷에서 확인
, 이것은 우리가
이 저를 도와주세요 :(
왜 그때 내 경우에는 작동하지 않습니다 ANTLR 3.x의에서 예외를 처리하는 방법입니다.

답변

2

"catch 블록이 더 이상 없다 '예외'키워드 '로 시작하므로 속성 규칙은 다음과 같습니다.

attribute : 
     Value1 integer1["Value1"] { System.out.println("Accepted"); } 
    | Value2 integer2["Value2"] { System.out.println("Accepted"); } 
    ; 
catch[Exception e] {System.out.println("General error Reported");} 

다음, 당신이 렉서의 reportError 방법,하지 (인바운드 검사가 호출) 파서의 하나 오버라이드 (override) 한

으로 파서 만들기 복구 대신 오류를 던져서 reportError를 @parser :: members 섹션에 복사 한 다음 "일반 오류보고 됨"을 얻을 수 있습니다.

하지만 당신은 ANTLR의 복구 메커니즘을 중지하지만 오류 메시지가 더 많은 정보를, 당신은 The Definitive ANTLR Reference에서이 무료 excerpt을 읽고 따라 GetErrorMessage 방법을 정의 할 수 있도록하지하려면 :

public String getErrorMessage(RecognitionException e, String[] tokenNames) 
{ 
    List stack = getRuleInvocationStack(e, this.getClass().getName()); 
    String msg = null; 
    if (e instanceof NoViableAltException) { 
     NoViableAltException nvae = (NoViableAltException)e; 
     msg = " no viable alt; token="+e.token+ 
      " (decision="+nvae.decisionNumber+ 
      " state "+nvae.stateNumber+")"+ 
      " decision=<<"+nvae.grammarDecisionDescription+">>"; 
    } 
    else if( e instanceof FailedPredicateException ) { 
     FailedPredicateException fpe = (FailedPredicateException)e; 
     msg = "failed predicate; token="+fpe.token+ 
       " (rule="+fpe.ruleName+" predicate="+fpe.predicateText+")"; 
    } 
    else { 
     msg = super.getErrorMessage(e, tokenNames); 
    } 
    return stack+" "+msg; 
} 
public String getTokenErrorDisplay(Token t) { 
    return t.toString(); 
} 
관련 문제