在ANTLR正则表达式范围量词语法(Range quantifier syntax in ANTLR

2019-09-21 22:16发布

这应该是相当简单的。 我正在使用ANTLR词法分析器语法,并希望变量标识符的最大长度限制在30个字符。 我试图用这条线来完成这个(以下正常的正则表达式 - 除了“”的事情 - 语法):

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

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

0,29

显然ANTLR走的是括号内文字的部分,将其放置在接受国家区域与打印线一起。 我搜索ANTLR站点,我发现没有例如或参考为等效的表达式。 我应该这个表达式的语法是什么?

Answer 1:

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)去。 有当这样的规则被违反很少的原因,这些天来限制语言的标识,甚至没有理由引起语法错误(早期中止编译的)。



文章来源: Range quantifier syntax in ANTLR Regex
标签: java regex antlr