2009-12-06 2 views
0

Я хочу принять десятичное число в диапазоне от 0 до 255. Это лучшее, что я могу придумать:Как лекс 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 есть лучший способ?

+0

Не могли бы вы более подробно объяснить, что вы пытаетесь сделать? – Marius

+0

Не знаете, насколько яснее вы хотите .... Он пытается сопоставить все возможные байтовые значения в базе-10. – RCIX

ответ

10

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

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

+1. Кроме того, ограничения целых значений, запечатанные в таком месте, делают рефакторинг истинной болью. – gorsky

+0

Плюс, это позволяет вам сопоставить «007» в виде числа. Джеймс Бонд оценил бы это. –

1

Ответ на мой 280Z28 - сделайте то, что было предложено там. Но если вы хотите еще один способ написать рисунок, вы можете попробовать:

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

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

Смежные вопросы