Domanda
Voglio accettare un numero decimale compreso tra 0 e 255. Questo è il meglio che posso venire con:
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
, ma io sono solo un n00b all'oscuro. Surelry c'è un modo migliore?
Soluzione
Avrete risultati molto migliori se ti rilassi il lexer e rinviare la verifica ad un momento successivo. Lex NUMBER
, poi quando si converte in un secondo momento è possibile fornire un messaggio di errore molto specifico se il valore è fuori portata. Se si effettua il lexer rigorosa e qualcuno entra 256, il messaggio di errore che ne deriva è illeggibile a chiunque che non ha fatto una grammatica prima.
NUMBER
: '0'..'9'+
;
Altri suggerimenti
I up'ed risposta di 280Z28 - fare ciò che è stato suggerito lì. Ma se volete un altro modo per scrivere il modello si può provare:
0|1([0-9][0-9]?)?|2([0-4][0-9]?|5[0-5]?)?|[3-9][0-9]?
E 'più mi mostra di ogni altra cosa. E 'difficile per verificare (la prima volta che ho scritto questo ho fatto un errore che non è stato catturato fino a quando ho provato), e non qualcosa che si dovrebbe utilizzare nel codice.