2009-10-16 2 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, где я вызываю сгенерированный класс java от Antlr. Я обращаюсь так, как следует.

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

numberrange returns [String value] : numberrangesub { Номер строкиRange = ($ numberrangesub.text); Строка [] v = numberRange.split (","); if (Integer.parseInt (v [0] .trim()) Ashok

+0

Я использую форматировщик кода, но он появляется неформатированным после того, как я разместил его. Я не знаю, почему это происходит? – Ashok

ответ

0

Почему бы не просто бросить RuntimeException с вашим пользовательским сообщением об ошибке?

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

Как Терренс писал в «Де фи nitive ANTLR Reference» error chapter excerpt:

Чтобы избежать принуждая сообщения только на английском языке об ошибках и вообще делать вещи, как гибок, насколько это возможно, распознаватель не создать исключение объекты со строковыми сообщениями. Вместо этого он отслеживает информацию, необходимую для генерации ошибки.

Таким образом, для конструктора RecognitionError не появляется сообщение об ошибке. Но вы можете определить дополнительное поле вашего распознаватель держать удобно сообщение об ошибке, показанное на 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 метод:

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

Это работающий аналогично парафразный механизм объясняется в том же отрывке.