Pregunta

Quiero aceptar un número decimal entre 0 y 255. Esto es lo mejor que puedo llegar a:

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

pero yo soy sólo un n00b idea. Surelry hay una manera mejor?

¿Fue útil?

Solución

Vas a tener resultados mucho mejores si se relaja el léxico y diferir la verificación a un momento posterior. Lex NUMBER, a continuación, cuando se convierte más tarde le puede proporcionar un mensaje de error muy específica si el valor está fuera de rango. Si realiza el analizador léxico estricto y alguien entra en 256, el mensaje de error que resulta ilegible a cualquier persona que no haya hecho una gramática antes.

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

Otros consejos

Me up'ed respuesta de 280Z28 - hacer lo que se sugiere allí. Pero si quieres otra forma de escribir el patrón puede probar:

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

Es más me mostrando que cualquier otra cosa. Es difícil de verificar (el primer momento de escribir este he cometido un error que no fue capturado hasta que lo probé), y no es algo que puedes usar en su código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top