【问题标题】:Can regex be used to recognize any Context Free Language?正则表达式可以用于识别任何上下文无关语言吗?
【发布时间】:2020-03-03 05:23:04
【问题描述】:

我知道正则表达式包可以识别比常规语言更广泛的语言,但是在Python regex to find arithmetic expressions in text strings 中使用递归正则表达式让我想知道是否可以识别任何上下文无关语言使用正则表达式,如果没有,有人可以提供一个反例吗?

【问题讨论】:

  • 我不太确定这是您要求的,但它可能会有所帮助:nikic.github.io/2012/06/15/… 基本上,该帖子显示了如何使用递归将 CFG 转换为正则表达式。不同之处在于,那里使用的递归更高级。
  • @Jannik:看起来像是对我的回答 :)
  • 请注意,“正则表达式”可以表示不同的含义;并非所有正则表达式引擎都实现相同的功能集。如果您对 Python 正则表达式特别感兴趣,最好指定它(即使相同的答案适用于各种其他正则表达式引擎)。

标签: regex regular-language context-free-language


【解决方案1】:

基本上,这个答案取自 this 很棒的博文。

所以简短的回答是带有递归扩展的正则表达式可以识别任何上下文无关语法。

为了说明这一点,这个想法是展示一种从上下文无关语法构造正则表达式的方法。

(?<name> ...) 定义了一个正则表达式模式,以后可以与(?&name) 一起重用。

任何上下文无关语法都可以写成以下形式的一组规则:

  • A -> BC
  • A -> a

如果我们可以将这些规则编写为正则表达式,则正则表达式可以识别任何上下文无关语言。这里唯一有趣的规则是第一个。

首先,如果规则是左递归的,我们需要将其重写为右递归规则,因为正则表达式只支持右递归。这种重写总是可能的。现在我们可以将所有这些规则编写如下:

A -> BC
A -> DE
(?<A>(?&B)(?&C)|(?&D)(?&E))

这样就可以定义任意的CFG规则了,所以我们只需要全部定义,然后匹配初始规则即可。

(?(DEFINE)define rules here)^(?&initial)$

这里(?(DEFINE)...)声明了不匹配的规则,initial指的是语法的初始规则。

很久没听CS理论课了,如有错误请指正:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2017-02-11
    相关资源
    最近更新 更多