我想接受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 :(得分: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]?
我的炫耀比什么都重要。这很难验证(我第一次写这篇文章时犯了一个错误,直到我测试它才被捕获),而不是你应该在你的代码中使用的东西。