这应该相当简单。我正在使用 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 站点,但没有找到示例或对等效表达式的引用。这个表达式的语法应该是什么?
ANTLR4无法处理量词语法{a,b}
,而且,我不知道在词法分析器中设置这个约束是否很好。我自己解释一下。您在词法分析器中添加的约束负责令牌识别。因此,如果您的字符串超过 32 个字符,则该令牌将不会被识别为令牌ID
。这看起来不太好,因为它可能会导致您的字符串被识别为另一个标记,并且可能会导致解析阶段失败。
解决方案是避免这种长度限制并在 Java ANTLR4 中处理它,Listener or Visitor
例如,当长度大于 32 个字符时抛出异常/显示错误...等。
编辑>这个问题已经在这里得到解答:Range quantifier syntax in ANTLR Regex