ANTLR Regex中的范围量化语法

时间:2012-08-30 01:44:36

标签: java regex antlr

这应该相当简单。 我正在使用ANTLR编写词法分析器语法,并希望将变量标识符的最大长度限制为30个字符。我试图用这一行完成这个(遵循正常的正则表达式 - 除了''thing - 语法):

ID  :   ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,29}  {System.out.println("IDENTIFIER FOUND.");}
    ;

代码生成没有错误,但由于生成的代码中的一行只是简单的编译失败:

0.29

显然,antlr将括号内的文本部分与打印行一起放在接受状态区域。我搜索了ANTLR网站,但没有找到相应表达式的示例或引用。 这个表达式的语法应该是什么?

1 个答案:

答案 0 :(得分:8)

ANTLR不支持{m,n}量词语法。 ANTLR会看到量词的{},并且无法区分你行动周围的{}

解决方法:

  1. 在语义上强制执行限制。让它收集一个无限大小的ID,然后将其作为操作代码的一部分或稍后在编译器中进行投诉/截断。
  2. 手动创建量化规则。
  3. 这是将ID限制为8的手动规则示例。

    SUBID : ('a'..'z'|'A'..'Z'|'0'..'9'|'_')
          ;
    ID : ('a'..'z'|'A'..'Z')
         (SUBID (SUBID (SUBID (SUBID (SUBID (SUBID SUBID?)?)?)?)?)?)?
       ;
    

    就个人而言,我会选择语义解决方案(#1)。现在几乎没有理由限制语言中的标识符,甚至更少的理由在违反这样的规则时导致语法错误(编译的早期中止)。