为给定的正则表达式绘制最小 DFA

2024-01-24

绘制最小的直接且简单的方法是什么DFA,接受与给定相同的语言Regular Expression(RE).
我知道可以通过以下方式完成:

Regex ---to----► NFA ---to-----► DFA ---to-----► minimized DFA

但有没有什么捷径呢?像(a+b)*ab


正则表达式到 DFA

虽然没有从正则表达式 (RE) 绘制 DFA 的算法快捷方式,但可以通过分析而不是推导来实现快捷技术,它可以节省您绘制最小化 dfa 的时间。但当然,这项技术只能通过练习来学习。我以你的例子来展示我的方法:

(a + b)*ab   

首先,考虑一下正则表达式的语言。如果第一次尝试很难确定语言描述是什么,那么找到语言中可以生成的最小可能字符串是什么,然后找到第二小的......

记住一些基本正则表达式的解决方案。例如,我有这里写了一些直接从正则表达式编写左线性和右线性语法的基本想法。 https://stackoverflow.com/questions/13816439/left-linear-and-right-linear-grammars/13945932#13945932同样,您可以编写用于解释最小化 dfa 的代码。

In RE (a + b)*ab,最小可能的字符串是ab因为使用(a + b)*一个人可以生成NULL(^)细绳。第二小的字符串可以是aab or bab。现在我们可以很容易注意到关于语言的一件事是,此 RE 语言中的任何字符串始终以ab(后缀),而前缀可以是任何可能的字符串组成a and b包括^

另外,如果当前符号是a;那么一个可能的机会是下一个符号将是b和弦尾。因此,在 dfa 中,我们需要一个转换,以便每当b符号来了after symbol a,那么它应该移动到一些最终状态在 DFA 中。

接下来,如果一个新符号进入最终状态,那么我们应该转向某个非最终的状态因为之后的任何符号b只能在语言中某些字符串的中间,因为所有语言字符串都以后缀结尾'ab'.

因此,有了这个阶段的知识,我们可以画出一个不完整的转换图,如下所示:

--►(Q0)---a---►(Q1)---b----►((Qf))

现在,您需要了解:例如,每个状态都有一定的含义

(Q0) means = Start state
(Q1) means = Last symbol was 'a', and with one more 'b' we can shift to a final state
(Qf) means = Last two symbols was 'ab'

Now think what happens if a symbol a comes on final state. Just more to state Q1 because this state means last symbol was a. (updated transition diagram)

--►(Q0)---a---►(Q1)---b----►((Qf))  
                ▲-----a--------|  

But suppose instead of symbol a a symbol b comes at final state. Then we should move from final state to some non-final state. In present transition graph in this situation we should make a move to initial state from final state Qf.(as again we need ab in string for acceptation)

--►(Q0)---a---►(Q1)---b----►((Qf))  
     ▲          ▲-----a--------|  
     |----------------b--------|  

This graph is still incomplete! because there is no outgoing edge for symbol a from Q1. And for symbol a on state Q1 a self loop is required because Q1 means last symbol was an a.

                a-  
                ||
                ▼|
--►(Q0)---a---►(Q1)---b----►((Qf))  
     ▲          ▲-----a--------|  
     |----------------b--------|     

Now I believe all possible out-going edges are present from Q1 & Qf in above graph. One missing edge is an out-going edge from Q0 for symbol b. And there must be a self loop at state Q0 because again we need a sequence of ab so that string can be accept. (from Q0 to Qf shift is possible with ab)

    b-          a-  
    ||          ||
    ▼|          ▼|
--►(Q0)---a---►(Q1)---b----►((Qf))  
     ▲          ▲-----a--------|  
     |----------------b--------|      

现在 DFA 已完成!

当然,在最初的几次尝试中,该方法可能看起来很困难。但如果你学会用这种方式画画,你会发现你的分析能力有所提高。你会发现这种方法是快速、客观地绘制DFA的方法。

* In the link I given, I described some more regular expressions, I would highly encourage you to learn them and try to make DFA for those regular expressions too.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为给定的正则表达式绘制最小 DFA 的相关文章

  • 生成正则表达式

    通常在我们的工作中我们会使用正则表达式capture or match运营 但是 可以使用正则表达式 至少手动 来生成与正则表达式匹配的合法句子 当然 有些正则表达式可以匹配无限长的句子 例如表达式 我有一个问题可以通过使用正则表达式句子生
  • 在 C++ 中实现模拟非确定性有限自动机的代码

    我正在做自动机理论的作业 我必须确定确定性有限自动机的转换函数是否接受一个单词 我有这个输入文件 6 8 0 2 2 5 0 0 a 0 1 a 1 1 b 1 2 c 1 3 c 3 4 d 4 4 d 4 5 d 3 aaabcccc
  • 增强字符串匹配 DFA

    给定一个字符串 我必须测试它是否以一组已知的后缀结尾 现在 由于后缀不是很小 文档中的每个单词都必须根据已知后缀列表进行检查 单词中的每个字符和后缀都是char32 t 由于天真的迭代匹配将是昂贵的 尽管大多数后缀不是子后缀或另一个后缀的前
  • 在JAVA中按特定单词分割字符串

    字符串 S 乘 3 加加 3 3 1 我想得到两个字符串数组 第一个是 乘 加 加 另一个输出是 3 3 3 1 我怎么才能得到它 我尝试使用 String operators s split 0 9 String operands s s
  • 使用正则表达式表示标识符

    C 编程语言中识别标识符的常规定义为 letter gt a b z A B Z digit gt 0 1 9 identifier gt letter letter digit 该定义将生成以下形式的标识符 标识符 a zA Z a zA
  • NFA 与 DFA 的时间复杂度权衡

    我正在寻找关于 nfa 或 dfa 哪个更好使用以及在编译器中什么情况下使用的讨论 模拟 nfa 与 dfa 的时间复杂度权衡是什么 在编译器的什么情况下 哪一个更合适 从 NFA 构造 DFA 的时间为 O 2 m 其中 m 是节点数 D
  • 如何确定上下文无关语法是否描述了常规语言?

    给定任意上下文无关语法 我如何检查它是否描述了常规语言 我不是在寻找考试 技巧 我正在寻找一种可以编写代码的万无一失的机械测试 如果有帮助 这里是我可能会收到的 CFG 作为输入的示例 具体来说 请注意 答案一定比仅仅寻找左递归或右递归复杂
  • 有没有办法否定正则表达式?

    给定一个正则表达式R它描述了一种常规语言 没有花哨的反向引用 有没有一种算法方法来构造正则表达式R 描述除以下描述的单词之外的所有单词的语言R 应该可以作为维基百科 http en wikipedia org wiki Regular la
  • 将 NFA 转换为正则表达式

    我在这个网站上发现了同样的问题 答案是描述如何将 NFA 转换为正则表达式的 PDF http courses engr illinois edu cs373 sp2009 lectures lect 08 pdf 但这是行不通的 因为该方
  • 有没有一种正则语言来表示正则表达式?

    具体来说 我注意到正则表达式的语言本身并不是正则的 因此 我无法使用正则表达式来解析给定的正则表达式 我需要使用解析器 因为正则表达式本身的语言是上下文无关的 有没有什么方法可以用可以使用正则表达式解析结果字符串的方式来表示正则表达式 注意
  • 对于给定的有限代表字符串列表,正则表达式的语法推理?

    我正在分析一个大型公共数据集 其中包含许多详细的人类可读字符串 这些字符串显然是由某些常规 在形式语言理论意义上 语法生成的 逐一查看这些字符串组以了解其中的模式并不太难 不幸的是 大约有 24 000 个独特的字符串被分为 33 个类别和
  • 为什么正则语言的补语仍然是正则语言?

    根据我的教科书 只要L1是正则语言 L1 A L1的补集就是正则语言 A 不是还包括上下文无关语言 上下文相关语言和递归可枚举语言吗 A L1 也将包括所有这些 不是吗 那怎么可能有规律呢 在有限状态机的表示下 我理解为什么补码仍然是常规语
  • 泵送引理(常规语言)

    我需要一些帮助来解决泵引理问题 L a b c a L lt b L lt c L 这是我到目前为止得到的 y uvw is the string from the pumping lemma 我让 y abbc n n 是泵引理的长度 y
  • 是否有可能有匹配所有有效正则表达式的正则表达式?

    是否可以仅使用正则表达式来检测给定字符串是否是有效的正则表达式 假设我有一些字符串 它们可能是也可能不是有效的正则表达式 我想要一个正则表达式与对应于有效正则表达式的那些字符串相匹配 那可能吗 或者我是否使用一些更高级别的语法 即上下文无关
  • a* 与 (a*)* 相同吗?

    快速提问 如果a是一个正则表达式 那么这是真的吗a a Is a 有效的表达 如果是 那么任何人都可以解释为什么它与a 我很抱歉在这里提问 但我无法通过谷歌找到任何东西 Yes a a 是一样的 两者都生成相同的语言 即字符串包含的任何数字
  • 生成随机确定性有限自动机的算法是什么?

    DFA 必须具有以下四个属性 DFA 有 N 个节点 每个节点有 2 个传出转换 每个节点都可以从其他每个节点访问 从所有可能性中以完全一致的随机性选择 DFA 这是我到目前为止所拥有的 从 N 个节点的集合开始 选择一个尚未选择的节点 将
  • 常规语言的抽引理

    我在使用泵引理检查给定语言是否规则时有点困惑 假设我们必须检查是否 L 接受偶数的语言0是否正常 我们知道它是正则的 因为我们可以为 L 构造一个 DFA 但我想用泵引理来证明这一点 现在假设我拿一个字符串w 0000 现在将字符串划分为x
  • a*b* 是正则吗?

    I know anbn for n gt 0 is not regular by the pumping lemma but I would imagine a b to be regular since both a b don t ha
  • 瑞典 SSN 正则表达式拒绝特定年龄以下的用户

    我的正则表达式有问题 我已经可以验证正确的瑞典社会安全号码以符合这些标准 YYMMDDNNNN 年月日 NNNN 年年月日DDNNNN YYYYMMDD NNNN 但如果用户未满 18 岁 我也想拒绝该用户注册 我的常规表达现在是这样的 有
  • 实现词法分析器时,DFA 与正则表达式?

    我刚刚学习如何编写编译器 所以如果我有任何错误的说法 请纠正我 当人们可以简单地使用正则表达式时 为什么还要在代码中实现 DFA goto 语句 表驱动实现 据我了解 词法分析器接收一串字符并生成一个标记列表 这些标记在语言的语法定义中是终

随机推荐