antlr4 - antlr4 中的重复模式匹配
问题描述
我正在尝试编写一个词法分析器规则,该规则将匹配以下字符串 a aa aaa bbbb
这里的要求是所有字符必须相同
我尝试使用此规则:REPEAT_CHARS: ([az])(\1)*
但是 \1 在 antlr4 中无效。有可能为此想出一个模式吗?
解决方案
你不能在 ANTLR 词法分析器中这样做。至少,语法中没有目标特定代码。并且将代码放入语法中是您不应该做的事情(它使阅读变得困难,并且语法与该语言相关联)。最好在侦听器或访问者内部进行此类检查/验证。
诸如反向引用和环视之类的东西是编程语言的正则表达式引擎中的特性。ANTLR(以及我知道的所有解析器生成器)中可用的正则表达式语法不支持这些功能,但它们是真正的正则语言。
几乎所有现代正则表达式库中的许多特性都提供了远远超过正则语言的表达能力。例如,许多实现允许使用括号对子表达式进行分组,并在同一表达式中调用它们匹配的值(反向引用)。这意味着,除其他外,模式可以匹配重复单词的字符串,如“papa”或“WikiWiki”,在形式语言理论中称为正方形。
-- https://en.wikipedia.org/wiki/Regular_expression#Patterns_for_non-regular_languages
推荐阅读
- system-verilog - 一个 IMP_PORT 连接到多个 EXPORTS
- swift - 是否可以快速划分两个数字?
- google-sheets - 从一列到跨多列的限制行长度的唯一列表 Google 表格
- html - 如何使字体大小与其在css中的输入高度成比例?
- javascript - WebRTC 将 AudioContext 中的音频添加到 captureStream
- azure-devops - MagicChunks 不写 web.config 属性
- nginx - Nginx添加模块=如何?
- r - 如何使用具有两个以上参数或分类变量的数据在 R 中迭代 t 检验?
- pandas - 在 URL 上读取的数据框中插入名称
- c++ - 使用从 std::shared_ptr 返回的指针
.get() 函数删除一个对象?