Question

Je veux accepter un nombre décimal compris entre 0 et 255. Ceci est le meilleur que je peux venir avec:

fragment my_token :
  ('0'..'9') |                    // 0 -> 9
  ('1'..'9' '0'..'9') |           // 0 -> 99
  ('1' '0'..'9' '0'..'9')  |      // 100 -> 199
  ('2' '0'..'4' '0'..'9') |       // 200 -> 249
  ('25' '0'..'5');                // 250 -> 255

mais je suis juste un n00b désemparés. Surelry il y a une meilleure façon?

Était-ce utile?

La solution

Vous aurez bien meilleurs résultats si vous détendre le lexer et reporter la vérification à plus tard. Lex NUMBER, puis quand vous le convertir plus tard, vous pouvez fournir un message d'erreur très spécifique si la valeur est hors de portée. Si vous faites le lexer strict et quelqu'un entre 256, le message d'erreur qui en résulte est illisible à toute personne qui n'a pas fait une grammaire avant.

NUMBER
    :    '0'..'9'+
    ;

Autres conseils

J'up'ed la réponse de 280Z28 - faire ce qui a été suggéré il. Mais si vous voulez une autre façon d'écrire le modèle que vous pouvez essayer:

0|1([0-9][0-9]?)?|2([0-4][0-9]?|5[0-5]?)?|[3-9][0-9]?

Il est plus me montrer que toute autre chose. Il est difficile de vérifier (la première fois que j'ai écrit cela, je fait une erreur qui n'a pas été pris jusqu'à ce que je l'ai testé), et non quelque chose que vous devez utiliser dans votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top