ANTLR Regex中的范围量化语法

use*_*761 7 java regex antlr

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

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

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

0,29

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

wal*_*rii 8

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?)?)?)?)?)?)?
   ;
Run Code Online (Sandbox Code Playgroud)

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

  • 如果ANTLR仅用于生成编程语言的编译器,那么量词的使用可能很少.但验证任何类型的结构化数据的语法(模式)当然需要他们 - 信用卡号码是16个位数,而不是13或25.ANTLR4本书有JSON和XML语法,但没有基本的令牌限制,将很难使用ANTLR语法作为JSON Schema和XSD的抽象(独立于编解码器)版本. (3认同)
  • “现在几乎没有理由限制语言中的标识符”——这并不意味着不存在标识符有限的语言,也不是人们可能想为它们编写解析器。 (2认同)