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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top