我应该如何限制 ANTLR 中 ID 令牌的长度?

Mah*_*eri 5 java regex antlr4

这应该相当简单。我正在使用 ANTLR 开发词法分析器语法,并且希望将变量标识符的最大长度限制为 32 个字符。我尝试用这一行来完成此操作(遵循正常的正则表达式 - 语法):

ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,31};
Run Code Online (Sandbox Code Playgroud)

代码生成中没有错误,但编译失败,因为生成的代码中的一行很简单:

0,31

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

Vin*_*ega 4

ANTLR4无法处理量词语法{a,b},而且,我不知道在词法分析器中设置这个约束是否很好。我自己解释一下。您在词法分析器中添加的约束负责令牌识别。因此,如果您的字符串超过 32 个字符,则该令牌将不会被识别为令牌ID。这看起来不太好,因为它可能会导致您的字符串被识别为另一个标记,并且可能会导致解析阶段失败。

解决方案是避免这种长度限制并在 Java ANTLR4 中处理它,Listener or Visitor例如,当长度大于 32 个字符时抛出异常/显示错误...等。

编辑>这个问题已经在这里得到解答:Range quantifier syntax in ANTLR Regex