这应该相当简单。我正在使用ANTLR编写lexer语法,并希望将变量标识符的最大长度限制为32个字符。我试图用这一行(遵循正常的正则表达式语法)来实现这一点:
ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,31};
代码生成中没有错误,但由于生成的代码中有一行代码,导致编译失败:
0,31
很明显,antlr将括号之间的文本部分与打印行一起放在接受状态区域。我搜索了ANTLR网站,没有发现任何等价表达式的例子或引用。这个表达式的语法应该是什么?
ANTLR4无法处理量词语法{a,b}
,此外,我不知道在lexer中设置这个约束是否很棒。我解释自己。在lexer中添加的约束负责令牌识别。因此,如果字符串超过32个字符,则该令牌将不会被识别为ID
令牌。这似乎不太好,因为它可能会导致您的字符串被识别为另一个令牌,并可能导致解析阶段的失败。
解决方案是避免这种长度约束,并在Java ANTLR4 Listener or Visitor
中处理它,例如,抛出异常/显示错误。。。当长度大于32个字符时。
EDIT>这个问题已经在这里得到了回答:ANTLR Regex 中的范围量词语法