java - 我应该如何限制 ANTLR 中 ID token 的长度?

标签 java regex antlr4

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

ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,31};

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

0,31

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

最佳答案

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

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

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

关于java - 我应该如何限制 ANTLR 中 ID token 的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33669709/

相关文章:

java - 如何在我的 ANTLR4 Java 扩展监听器类中实现减法表达式?

java - If equals doubles 语句检查

java - SQLite 分组并按工作类次排序

Java - List<Object> 类型的方法 DescendingIterator() 未定义

javascript regex .match 在某个字符串处停止

java - ANTLR 不匹配输入错误

java - Jsoup SocketTimeoutException : Read timed out

mysql - 匹配 MySQL 中的正则表达式以排除括号中的重复词

php - 如何在 php 的正则表达式中匹配井号 (#) 符号(用于主题标签)

c++ - 在语法文件上运行 c++ 的 antlr4 解析器显示错误 33 : missing code generation template NonLocalAttrRefHeader