Вопрос

Я хочу принять десятичное число от 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]?

Это скорее мое хвастовство, чем что-либо еще.Это трудно проверить (когда я писал это в первый раз, я допустил ошибку, которая не была обнаружена, пока я ее не протестировал), и это не то, что вы должны использовать в своем коде.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top