我知道这最终可能是特定于语言的,所以Java或Python解决方案是可以接受的。
鉴于语法:
MONTH : DIGIT DIGIT ;
DIGIT : ('0'..'9') ;
我想在MONTH
上设置检查约束,以确保该值介于01
和12
之间。我从哪里开始查看,如何将此约束指定为规则?
答案 0 :(得分:1)
您可以通过在其周围包裹{
和}
来嵌入自定义代码。所以你可以这样做:
MONTH
: DIGIT DIGIT
{
int month = Integer.parseInt(getText());
// do your check here
}
;
如您所见,我致电getText()
以获取令牌的匹配文本。
请注意,我假设您从另一个词法分析器规则引用此MONTH
规则。如果您要在1 > month > 12
时抛出异常,那么只要您的源包含非法月份值,就不会匹配任何解析器规则。虽然词法分析器和解析器规则可以混合在一个.g
语法文件中,但输入源首先根据词法分析器规则进行标记,一旦发生这种情况,只有匹配的解析器规则才会匹配。
答案 1 :(得分:-1)
您可以使用此免费在线实用程序Regex_For_Range为任何连续的整数范围生成正则表达式。对于值01-12(允许前导0),实用程序给出:
0*([1-9]|1[0-2])
从这里您可以看到,如果您想将此约束为2位数字符串'01'到'12',请将其调整为:
0[1-9]|1[0-2]
在01-31天,我们得到:
0*([1-9]|[12][0-9]|3[01])
在2000 - 2099年间,表达方式很简单:
20[0-9]{2}