antlr 3.0中的错误处理

antlr 3.0中的错误处理,antlr,Antlr,当用户输入与我们定义的规则不匹配时,我需要报告自定义错误 这是我的密码: grammar second1; @lexer::members { @Override public void reportError(RecognitionException e) { System.out.println("Throwing Exception: "+ e.getMessage()); throw new IllegalArgumentException(e); } } @par

当用户输入与我们定义的规则不匹配时,我需要报告自定义错误

这是我的密码:

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')
 ;
语法第二;
@lexer::成员{
@凌驾
公共作废报告错误(识别异常e){
System.out.println(“抛出异常:+e.getMessage());
抛出新的IllegalArgumentException(e);
}
}
@解析器::成员{
私有布尔内边界(标记t、最小整数、最大整数、字符串方法名){
int n=Integer.parseInt(t.getText());
如果(n>=min&&n“Catch块不再以'exception'关键字作为前缀”,那么您的属性规则将是:

attribute  :
      Value1 integer1["Value1"] { System.out.println("Accepted"); }
   |  Value2 integer2["Value2"] { System.out.println("Accepted"); }
   ;
catch[Exception e] {System.out.println("General error Reported");}
接下来,您重写了lexer的reportError方法,而不是解析器的方法(调用入站检查)

要使解析器抛出错误而不是恢复,您可以将reportError复制到@parser::members部分,然后您可以得到“常规错误报告”

但是,如果您不想停止antlr的恢复机制,而是想让错误消息更具信息性,您可以免费阅读并定义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();
}   
公共字符串getErrorMessage(识别异常e,字符串[]标记名)
{
列表堆栈=getRuleInvocationStack(即this.getClass().getName());
字符串msg=null;
if(NoViableAltException的实例){
NoviableException nvae=(NoviableException)e;
msg=“没有可行的alt;token=“+e.token+
“(decision=“+nvae.decisionNumber+
“州“+nvae.stateNumber+”)+
“决定”;
}
else if(例如FailedPredicateException的实例){
FailedPredicateException fpe=(FailedPredicateException)e;
msg=“失败的谓词;令牌=“+fpe.token+
“(规则=“+fpe.ruleName+”谓词=“+fpe.predicateText+”);
}
否则{
msg=super.getErrorMessage(e,标记名);
}
返回堆栈+“”+msg;
}
公共字符串getTokenErrorDisplay(令牌t){
返回t.toString();
}   
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();
}