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