NFA-->DFA-->最小化DFA


心得:按照步骤来走,不会走就别跑,搞得纠结半天为什么简化不了,原来是自己拿着NFA在简化。

题目:

考虑正则表达式who|what|where。使用Thompson构造法,从这个正则表达式构建一个NFA。使用子集构造法,从生成的NFA构建一个DFA。并最小化这个DFA。
首先构造出NFA,然后用Graphviz画出图形。
重点:正则表达式转NFA(Thompson算法)
dot代码如下:

digraph G {

S0->S1 [label = "w"];
S1->S2 [label = "h"];
S2->S3 [label = "o"];

S4->S5 [label = "w"];
S5->S6 [label = "h"];
S6->S7 [label = "a"];
S7->S8 [label = "t"];

S9->S10 [label = "w"];
S10->S11 [label = "h"];
S11->S12 [label = "e"];
S12->S13 [label = "r"];
S13->S14 [label = "e"];

S15->S0 [label = "NULL"];
S15->S4 [label = "NULL"];

S3->S16 [label = "NULL"];
S8->S16 [label = "NULL"];

S17->S9 [label = "NULL"];
S17->S15 [label = "NULL"];

S14->S18 [label = "NULL"];
S16->S18 [label = "NULL"];
}

生成的图片为:

Paste_Image.png

然后是确定化NFA,也就是NFA转DFA。
重点:NFA转DFA(子集构造法)
dot代码为:

digraph G {

I0->I1 [label = " w"];
I1->I2 [label = " h"];
I2->I3 [label = " e"];
I3->I6 [label = " r"];
{
    node [style = filled];
    I6->I8 [label = " e"];
}

{
    node [style = filled];
    I2->I4 [label = " o"];
}
I2->I5 [label = " a"];
{
    node [style = filled];
    I5->I7 [label = " t"];
}
}

图片为:

Paste_Image.png

无需进行DFA简化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面 从源代码到可执行文件要经历几个过程: 词法分析 语法分析 语义分析 中间代码生成 代码优化 词法分析有点...
    wsztrush阅读 2,049评论 0 5
  • 转自: JS正则表达式一条龙讲解,从原理和语法到JS正则、ES6正则扩展,最后再到正则实践思路 温馨提示:文章很长...
    前端渣渣阅读 1,844评论 1 32
  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 4,074评论 0 20
  • 标题: Rakudo and NQP Internals子标题: The guts tormented imple...
    焉知非鱼阅读 1,445评论 1 3
  • 说到“好老师讲课”的例子,我分享下我的经历。 换位思考,是以前我经常用到的思考问题的方法,这也许是调整关注焦点的诸...
    戒得草堂阅读 112评论 0 2