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?
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.