我想接受 0 到 255 之间的十进制数。这是我能想到的最好的:
片段 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。当然有更好的方法吗?
如果您放松词法分析器并将检查推迟到以后,您将获得更好的结果。Lex NUMBER
,然后当您稍后转换它时,如果值超出范围,您可以提供非常具体的错误消息。如果您使词法分析器严格并且有人输入 256,则结果错误消息对于以前没有编写过语法的任何人来说都是难以辨认的。
NUMBER
: '0'..'9'+
;
我升级了 280Z28 的答案——按照那里的建议去做。但是,如果您想要另一种方式来编写模式,您可以尝试:
0|1([0-9][0-9]?)?|2([0-4][0-9]?|5[0-5]?)?|[3-9][0-9]?
炫耀我比什么都重要。很难验证(我第一次写这个我犯了一个错误,直到我测试它才被发现),而不是你应该在代码中使用的东西。