这应该相当简单。我正在使用 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/