包含有序交替的正则表达式是否可以重写为仅使用无序交替?

时间:2011-07-20 18:25:49

标签: regex theory pcre alternation

假设我有一个正则表达式语言支持文字,正面和负面字符类,有序交替,贪婪量词?*+,以及非正式量词{{1 },??*?。 (这本质上是PCRE的一个子集,没有反向引用,环顾四周的断言,或者其他一些更高级的比特。)用无序交替替换有序交替是否会降低这种形式主义的表达能力?

(无序交替---有时也称为“无序选择”---是L(S | T)= L(S)+ L(T),而有序交替是L(S | T) )= L(S)+(L(T) - {a in L(T):a在L(S)中延伸一些b}}。具体地说,模式+?将匹配字符串{{1} }和a|aa如果交替是无序的,但只有a如果交替是有序的。)

换句话说,给定一个包含有序交替的模式S,该模式是否可以重写为不包含有序替换的等效模式T(但可能是无序替换)?

如果在文献中考虑过这个问题,我会感谢任何人都可以提供的任何参考资料。对于扩展的正则表达式形式主义的表达能力,我几乎没有理论上的工作(除了关于后向引用如何将你从常规语言转移到无上下文语法之外)。

2 个答案:

答案 0 :(得分:1)

in http://swtch.com/~rsc/regexp/regexp3.html [section“正则表达式是否与字符串的子字符串匹配?如果是,在哪里?”]有必要在“DFA”中引入优先级的概念(您需要阅读整个系列我怀疑,要理解,但有问题的“DFA”是从“飞行中”NFA图扩展到处理有序的替换。虽然这只是对权威的诉求,而不是证据,但我认为如果russ cox不能这样做(将有序的替换表示为纯粹的DFA),那么没有人知道如何。

答案 1 :(得分:-1)

我没有检查任何文献,但我认为你可以为有序的交替构建DFA,从而证明它不会以下列方式增加任何表达能力:

  1. 假设我们有正则表达式 x || y ,其中 x y 是regexen和 || 意味着无序的交替。如果是这样,我们可以构建DFA接受 x y 。我们会标记 DFA_x DFA_y
  2. 我们将通过连接 DFA_x DFA_y
  3. 分阶段构建 x || y 的DFA
  4. 对于 DFA_x 中的每个路径,对应一些字符串 a (按路径我的意思是图表中的路径没有遍历和边缘两次,因此 a DFA_“a *”中的路径,但 aa 不是...)
    • 对于字母表中的每个符号
      • 如果 DFA_y 消耗(即如果在上运行 DFA_y 不会提前停止,但可能会不一定接受)和 DFA_x 不会和 DFA_x 不接受的任何前缀从状态 DFA_x <创建转换/ strong>在消费一个 DFA_y 之后以消费
      • 后结束
  5. 最终DFA的接受状态是输入DFA的所有接受状态。起始状态是 DFA_x 的起始状态。
  6. 直观地说,它在输出DFA中创建了两个区域。其中一个对应于交替的第一个参数,另一个对应于第二个参数。只要交替的第一个参数可能匹配,我们就会留在第一部分。当遇到符号使得确定第一个参数不匹配时,如果可能的话,我们切换到第二个部分。如果这种方法错误,请评论。