2009-10-16 9 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(); 
     } 
    ; 

Veuillez respecter le code ANTLR ci-dessus. En cela, je veux lancer un message d'erreur facile à utiliser comme "from value should be less than to value in BETWEEN clause". Je m'attends comme ça RecognitionException("from value should be less than to value in BETWEEN clause"); Mais antlr n'a pas accepté comme ci-dessus.obtenir des messages d'erreur définis par l'utilisateur en utilisant antlr3

En classe java où je fais appel à la classe Java générée par Antlr. Je gère comme suit.

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

Toute aide sera précieuse.

+0

Pouvez-vous utiliser le formatter de code sur le code ANTLR? Cela rendrait la lecture beaucoup plus facile. – Jorn

+0

retourne NumberRange [Valeur de chaîne] : numberrangesub { Chaîne NumberRange = (de numberrangesub.text de $); Chaîne [] v = numéroRange.split (","); if (Integer.parseInt (v [0] .trim()) Ashok

+0

J'utilise le formateur de code, mais il apparaît non formaté après je l'ai posté.Je ne sais pas pourquoi il se passe? – Ashok

Répondre

0

Pourquoi ne pas simplement jeter un RuntimeException avec votre message d'erreur personnalisé?

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

Comme Terrance a écrit dans "dé fi nitive ANTLR Référence" error chapter excerpt:

Pour éviter de forcer en anglais seulement des messages d'erreur et de faire généralement choses comme fl exible que possible, la reconnaissance ne le fait pas créer des exceptions objets avec des messages de chaîne. Au lieu de cela, il suit les informations nécessaires pour générer une erreur.

Aucun message d'erreur n'est donc fourni au constructeur de RecognitionError. Mais vous pouvez définir champ de votre reconnaissance pour contenir un message d'erreur convivial indiqué sur RecognitionError manutention:

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); 
     } 

     } 
    ; 

Et puis remplacer la méthode getErrorMessage:

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

Cela fonctionne semblable à mécanisme de paraphrase expliqué dans le même extrait.

Questions connexes