2 votes

Comment vérifier les plages de nombres dans ANTLR 3 ?

Je sais que cela peut finir par être spécifique à un langage, donc une solution Java ou Python serait acceptable.

Compte tenu de la grammaire :

MONTH   : DIGIT DIGIT ;
DIGIT   : ('0'..'9') ;

Je veux une contrainte de contrôle sur MONTH pour s'assurer que la valeur est comprise entre 01 y 12 . Où dois-je commencer à chercher et comment puis-je spécifier cette contrainte en tant que règle ?

2voto

Bart Kiers Points 79069

Vous pouvez intégrer un code personnalisé en enveloppant { y } autour d'elle. Vous pourriez donc faire quelque chose comme :

MONTH 
  :  DIGIT DIGIT 
     {
       int month = Integer.parseInt(getText());
       // do your check here
     } 
  ;

Comme vous pouvez le voir, j'ai appelé getText() pour obtenir le texte correspondant au jeton.

Notez que j'ai supposé que vous faisiez référence à ceci MONTH d'une autre règle de lexer. Si vous souhaitez lever une exception si 1 > month > 12 alors chaque fois que votre source contient une valeur de mois illégale, aucune des règles de l'analyseur ne sera jamais respectée. Bien que les règles du lexer et de l'analyseur puissent être mélangées dans un seul et même .g le fichier de grammaire, la source d'entrée est d'abord tokenisée sur la base des règles du lexateur, et ensuite seulement les règles de l'analyseur syntaxique seront prises en compte.

-1voto

Paul McGuire Points 24790

Vous pouvez utiliser cet utilitaire gratuit en ligne Regex_For_Range pour générer une expression régulière pour n'importe quelle plage d'entiers continus. Pour les valeurs 01-12 (avec les 0 en tête autorisés), l'utilitaire donne :

0*([1-9]|1[0-2])

A partir de là, vous pouvez voir que si vous voulez restreindre cette opération aux chaînes de 2 chiffres de '01' à '12', vous devez l'ajuster de la manière suivante :

0[1-9]|1[0-2]

Pour les jours 01-31, nous obtenons :

0*([1-9]|[12][0-9]|3[01])

Et pour les années 2000-2099, l'expression est simplement :

20[0-9]{2}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X