如何lex 0 .. 255?

时间:2009-12-06 23:45:15

标签: antlr antlr3

我想接受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 个答案:

答案 0 :(得分:10)

如果您放松词法分析器并将检查推迟到以后,您将获得更好的结果。 Lex NUMBER,当您稍后转换它时,如果值超出范围,您可以提供非常具体的错误消息。如果你使词法分析器严格并且有人输入256,则结果的错误信息对于之前没有语法的人来说是难以理解的。

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

答案 1 :(得分:1)

我提出了280Z28的答案 - 做那里的建议。但如果您想要另一种方式来编写模式,您可以尝试:

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

我的炫耀比什么都重要。这很难验证(我第一次写这篇文章时犯了一个错误,直到我测试它才被捕获),而不是你应该在你的代码中使用的东西。