8

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

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

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

0,29

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

4

1 回答 1

9

ANTLR 不支持{m,n}量词语法。ANTLR 看到{}你的量词,并且无法将它们与{}围绕你的行为的那些区分开来。

解决方法:

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

这是将 ID 限制为 8 的手动规则示例。

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

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

于 2012-08-30T03:08:41.450 回答