【问题标题】:Compiler- DFA (a+b)* vs (a|b)* any difference between both?编译器- DFA (a+b)* vs (a|b)* 两者之间有什么区别吗?
【发布时间】:2016-02-11 15:18:33
【问题描述】:

(a+b)* 和 (a|B)* 是否产生相同的 DFA 和相同的输出? 在数学中,只要涉及到“或”这个词,我们就使用加法运算符。 那么这是否意味着两个表达式是等价的?

【问题讨论】:

  • 好吧,如果你说第一个是数学符号,第二个是正则表达式,那么第一个中的 + 与后者中的 | 相同,那么是的,它们是等价的。
  • 我说的是正则表达式。请帮助我解决 cfg 以及 (a+b)* 的 CFG 将是 s->aSbS|^ (a|b)* 的 CFG 将是 s-> aS|bS|^ 我的工作方向是否正确?
  • 不,(a+b)*Repeat(Concat(Repeat("a", >=1), "b")), >=0)
  • @user3001571 有不止一种正则表达式。不同的引擎和不同的教科书使用不同的符号。在大多数现实生活中的正则表达式引擎中,+ 表示“一个或多个”。在一些教科书(可能还有一些较少使用的正则表达式引擎)中,+ 表示“或”。

标签: regex compiler-construction dfa


【解决方案1】:

这取决于您从中获取 2 个正则表达式的上下文。

如果您在现实生活中的正则表达式引擎的语法中解释这两个正则表达式,它们具有不同的含义,如Ed Cottrell explained in his answer+ 表示重复一次或多次。 | 表示交替。

但是,如果您将+ 中的(a+b)* 解释为alternation,它们的含义可能完全相同,遵循大多数自动机理论书籍中的符号,以及@987654327 中的| @ as alternation,遵循大多数现实生活中的正则表达式引擎中的符号。

【讨论】:

    【解决方案2】:

    没有。

    (a+b)* 至少匹配一个a,后跟一个b,零次或多次。因此,为了匹配一个非空字符串,该字符串在某些时候必须包含ab

    (a|B)* 需要 ab,零次或多次。可以匹配空字符串、所有as的字符串、所有bs的字符串等

    第二个表达式匹配以下示例中的整个字符串:aaaaaabbbbbb 等。第一个表达式在技术上匹配(因为零-length 字符串将匹配),但不匹配整个字符串。捕获的组不同。

    所以,不,它们不等价。

    【讨论】:

    • (a+b)* 的 CFG 将是 s->aSbS|^ (a|b)* 的 CFG 将是 s-> aS|bS|^ 我的工作方向是否正确?
    • @user3001571:不,在正则表达式中,+ 表示“一个或多个”,所以a+ = aa*
    • @user3001571 Bergi 刚刚说了什么。
    【解决方案3】:

    (a|b)* 表示 {ε, "a", "b", "aa", "ab", "ba", "bb", "aaa", aab, abb, aba, baa ...}

    (a+b)* 表示 {ε, ab, aab, aaab, abab, aabab,...}

    ε 表示为空

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      相关资源
      最近更新 更多