antlr4中的重复模式匹配
我正在尝试编写一个lexer规则,它将匹配以下字符串 A. aa aaa bbbb 这里的要求是所有字符必须相同 我尝试使用这个规则: 重复字符:([a-z])(\1)*antlr4中的重复模式匹配,antlr4,Antlr4,我正在尝试编写一个lexer规则,它将匹配以下字符串 A. aa aaa bbbb 这里的要求是所有字符必须相同 我尝试使用这个规则: 重复字符:([a-z])(\1)* 但是\1在antlr4中无效。有可能想出一个模式来解决这个问题吗?在ANTLR lexer中你不能这样做。至少,语法中没有特定于目标的代码。在语法中放置代码是不应该做的事情(这会使阅读变得困难,而且语法与该语言有关)。最好在用户或访问者内部进行此类检查/验证 诸如回溯引用和环视是krept在编程语言的正则表达式引擎中使用的特性
但是\1在antlr4中无效。有可能想出一个模式来解决这个问题吗?在ANTLR lexer中你不能这样做。至少,语法中没有特定于目标的代码。在语法中放置代码是不应该做的事情(这会使阅读变得困难,而且语法与该语言有关)。最好在用户或访问者内部进行此类检查/验证 诸如回溯引用和环视是krept在编程语言的正则表达式引擎中使用的特性。ANTLR中可用的正则表达式语法(以及我所知道的所有解析器生成器)不支持这些特性,但它们是正确的 几乎所有现代正则表达式库中的许多特性都提供了远远超过正则语言的表达能力。例如,许多实现允许使用括号对子表达式进行分组,并调用它们在同一表达式中匹配的值(反向引用)。这意味着,除其他外,一个模式可以匹配“papa”或“WikiWiki”等重复单词的字符串,在形式语言理论中称为方块 -- 在这种特殊情况下,您可以在ANTLR中实现这一点—这只是一个难题:
'a'+|'b'+|……|'z'+
。填写…
部分留给读者作为练习。