如何检查ANTLR 3中的数字范围?

时间:2011-05-03 06:19:17

标签: java python parsing antlr antlr3

我知道这最终可能是特定于语言的,所以Java或Python解决方案是可以接受的。

鉴于语法:

MONTH   : DIGIT DIGIT ;
DIGIT   : ('0'..'9') ;

我想在MONTH上设置检查约束,以确保该值介于0112之间。我从哪里开始查看,如何将此约束指定为规则?

2 个答案:

答案 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}