Как лекс 0 .. 255? - PullRequest
       40

Как лекс 0 .. 255?

0 голосов
/ 07 декабря 2009

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

Ответы [ 2 ]

10 голосов
/ 07 декабря 2009

Вы получите намного лучшие результаты, если расслабите лексер и отложите проверку на более позднее время. Lex NUMBER, затем при последующем преобразовании вы можете предоставить очень конкретное сообщение об ошибке, если значение выходит за пределы диапазона. Если вы сделаете лексер строгим, а кто-то введет 256, полученное сообщение об ошибке будет неразборчиво для всех, кто не делал грамматику раньше.

NUMBER
    :    '0'..'9'+
    ;
1 голос
/ 07 декабря 2009

Я ответил на вопрос 280Z28 - делай то, что там было предложено. Но если вам нужен другой способ написания шаблона, вы можете попробовать:

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

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

...