开发者

How to lex 0 .. 255?

I want to accept a decimal number between 0 and 255. This is the best I can come up with:

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

but I am just a clue开发者_JAVA百科less n00b. Surelry there is a better way?


You'll have much better results if you relax the lexer and defer the checking to a later time. Lex NUMBER, then when you convert it later you can provide a very specific error message if the value is out of range. If you make the lexer strict and someone enters 256, the error message that results is illegible to anyone that hasn't made a grammar before.

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


I up'ed 280Z28's answer - do what was suggested there. But if you want another way to write the pattern you can try:

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

It's more me showing off than anything else. It's hard to verify (the first time I wrote this I made a mistake that wasn't caught until I tested it), and not something you should use in your code.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜