Pergunta

Eu quero aceitar um número decimal entre 0 e 255. Este é o melhor que pode vir acima com:

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

mas eu sou apenas um n00b à nora. Surelry há uma maneira melhor?

Foi útil?

Solução

Você vai ter resultados muito melhores se você relaxar o lexer e adiar a verificação para um momento posterior. NUMBER Lex, então quando você convertê-lo mais tarde, você pode fornecer uma mensagem de erro muito específico se o valor está fora do intervalo. Se você fizer o lexer rigorosa e alguém entra 256, a mensagem de erro que resulta é ilegível para qualquer um que não tenha feito uma gramática antes.

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

Outras dicas

Eu up'ed resposta 280Z28 de - fazer o que foi sugerido lá. Mas se você quiser uma outra maneira de escrever o padrão que você pode tentar:

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

É mais me mostrando que qualquer outra coisa. É difícil verificar (a primeira vez que eu escrevi isso eu cometi um erro que não foi capturado até que eu testei), e não algo que você deve usar em seu código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top