Вопрос
Я хочу принять десятичное число от 0 до 255.Это лучшее, что я могу придумать:
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
но я всего лишь невежественный n00b.Уверен, что есть лучший способ?
Решение
Вы получите гораздо лучшие результаты, если расслабите лексер и отложите проверку на более позднее время.Лекс NUMBER
, затем, когда вы преобразуете его позже, вы можете выдать очень конкретное сообщение об ошибке, если значение выходит за пределы диапазона.Если вы сделаете лексер строгим, а кто-то введет 256, то полученное сообщение об ошибке будет неразборчивым для всех, кто раньше не создавал грамматику.
NUMBER
: '0'..'9'+
;
Другие советы
Я улучшил ответ 280Z28 - сделайте то, что было предложено там.Но если вам нужен другой способ написания шаблона, вы можете попробовать:
0|1([0-9][0-9]?)?|2([0-4][0-9]?|5[0-5]?)?|[3-9][0-9]?
Это скорее мое хвастовство, чем что-либо еще.Это трудно проверить (когда я писал это в первый раз, я допустил ошибку, которая не была обнаружена, пока я ее не протестировал), и это не то, что вы должны использовать в своем коде.