首页 > 解决方案 > antlr4 中的重复模式匹配

问题描述

我正在尝试编写一个词法分析器规则,该规则将匹配以下字符串 a aa aaa bbbb

这里的要求是所有字符必须相同

我尝试使用此规则:REPEAT_CHARS: ([az])(\1)*

但是 \1 在 antlr4 中无效。有可能为此想出一个模式吗?

标签: antlr4

解决方案


你不能在 ANTLR 词法分析器中这样做。至少,语法中没有目标特定代码。并且将代码放入语法中是您不应该做的事情(它使阅读变得困难,并且语法与该语言相关联)。最好在侦听器或访问者内部进行此类检查/验证。

诸如反向引用和环视之类的东西是编程语言的正则表达式引擎中的特性。ANTLR(以及我知道的所有解析器生成器)中可用的正则表达式语法不支持这些功能,但它们是真正的正则语言

几乎所有现代正则表达式库中的许多特性都提供了远远超过正则语言的表达能力。例如,许多实现允许使用括号对子表达式进行分组,并在同一表达式中调用它们匹配的值(反向引用)。这意味着,除其他外,模式可以匹配重复单词的字符串,如“papa”或“WikiWiki”,在形式语言理论中称为正方形。

-- https://en.wikipedia.org/wiki/Regular_expression#Patterns_for_non-regular_languages


推荐阅读