ANTLR正则表达式中的范围量词语法

9

这应该是相当简单的。 我正在使用ANTLR编写词法分析器语法,并希望将变量标识符的最大长度限制为30个字符。我尝试使用以下行来实现此目标(遵循正常的正则表达式 - 除了''这个东西 - 语法):

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

代码生成没有错误,但由于生成的代码中一行仅为:

0,29

编译失败了。显然antlr会将括号内的文本部分与打印行一起放置在接收状态区域。我搜索了ANTLR网站,但未找到等效表达式的示例或参考资料。这个表达式的语法应该是什么?

1个回答

10

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)。现在很少有理由限制语言中的标识符,甚至更少的理由在违反此规则时导致语法错误(编译的早期中止)。


5
如果仅使用ANTLR生成编程语言编译器,则量词可能没有多大用处。但是,验证任何结构化数据的语法(模式)确实需要它们——信用卡号码是16位数字,而不是13位或25位。ANTLR4书籍中有JSON和XML语法,但如果没有基本标记约束,将难以将ANTLR语法用作JSON Schema和XSD的抽象(编解码器无关)版本。 - Dave
2
现在很少有理由限制语言中的标识符,但这并不意味着不存在具有受限标识符的语言,也不意味着人们可能想要为它们编写解析器。 - Stephen Drew
1
PostgreSQL 将表名限制为 63 个字符,例如。 - TheRealChx101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接