【问题标题】:Is it a right way to find the regular grammar by construct an DFA?通过构造DFA来找到正则语法是正确的方法吗?
【发布时间】:2016-02-05 04:31:52
【问题描述】:

这是我的作业。

练习 3:找出语言 L = { | 的正则语法n + m 是奇数 数字}。展示你获得它的方式。

问题要求显示我获得答案的方式。所以这是我的解释。

我们构造 DFA

从 DFA,我们得到
S -> AA | bA
A -> aS | BS | null

因此,正则文法为
G = {V , T , S, P}
where
V = {S, A}
T = {a, b}
P = {S -> aA | bA, A -> aS | BS |空}

不过,下一个问题是:

构造一个接受由语法生成的语言的 DFA 练习 3. 尽可能简化构造的 DFA。

所以我认为绘制DFA并不是练习3的预期解释。也许还有另一种方法可以在不绘制DFA的情况下获得正则语言。请告诉我。

谢谢。

【问题讨论】:

  • 您的 DFA 匹配所有仅包含 a 和 b 的奇数长度字符串。但是你应该解决的语言是奇数长度的字符串,由一系列 as 和一系列 bs 组成。所以你的 DFA 匹配 aba 和 baa,但是语言中唯一带有 2 as 和 a b 的字符串是 aab

标签: context-free-grammar context-free-language


【解决方案1】:

首先构造一个(正确的)DFA 是获得正则语法的完美方法。关键是常规语法和 DFA 之间的转换很容易,因为它们在字面上编码几乎完全相同的信息。

正如评论中指出的,您的 DFA 不正确。你真的应该有这样的东西:

state    s    state'
------   -    ------
even_a   a    odd_a
even_a   b    odd_b
odd_a    a    even_a
odd_a    b    even_b
even_b   a    dead
even_b   b    odd_b
odd_b    a    dead
odd_b    b    even_b
dead     a    dead
dead     b    dead

使用你的方法从那个语法开始会得到正确的结果。请注意,“odd_a”和“odd_b”是接受状态。

【讨论】:

    【解决方案2】:

    通常推导DFA 比推导grammar 更难。另一件事是,通过首先构建语法,您可以生成与该语法匹配的最小 DFA。如果从构建 DFA 开始,则必须推导出相应的文法,然后从该文法推导出最小 DFA。

    举例说明为什么 DFA 更难派生:您的 DFA 与语言 a^n b^m, n+m odd 不匹配。它匹配所有奇数长度的字符串,即使是 ab 混合的字符串,例如:ababa

    我尝试产生相应的语法:

      S  -> 'a' L2
         -> 'b' B2
    
      L1 -> 'a' L2
         -> 'b' B2
    
      L2 -> 'a' L1
         -> 'b' B1
    
      B1 -> 'b' B2
    
      B2 -> \empty
         -> 'b' B1
    
    • S 是开始符号。
    • L1 表示 a 的奇数序列 然后 b
    • L2 表示a 的偶数序列然后 b
    • B1 表示 b 的奇数序列。
    • B2 表示b 的偶数序列。

    这个语法是正则的,适合构建 DFA。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 2021-08-07
      • 2015-05-06
      • 1970-01-01
      相关资源
      最近更新 更多