编译原理: 画出识别活动前缀的NFA的详细过程(根据文法画出NFA图的详细步骤)


前言

中国大学MOOC 王挺老师的编译原理课程

在这一节知识点中,出现了这个图:在这里插入图片描述
直接给出了这张图,并没有给出具体的实现步骤(可能实现在视频后面),所以我打算自己写出来这个过程。这也是出这篇文章的原因。帮助我自己理解这个NFA的产生过程。


一、解题前你所需要的知识

构造识别文法的所有活前缀的DFA
具体分为以下两个步骤:
构造识别文法所有活前缀NFA
(1)若状态i为X→α·Aβ,A为非终结符(它是一个待约项目), 则画一个从状态i画一条ε弧,到所有A→·γ的状态。
即:
在这里插入图片描述

(2)若状态 i 为X→X1…Xi-1·Xi…Xn;  状态 j 为X→X1…Xi-1 Xi·Xi+1…Xn
也就是状态 j 比状态 i 多识别了一个Xi,则我们引出一条标记为Xi从状态i指向状态 j 的弧线

对(2)的说明: X中的α已扫描,就等待A的形成,A的形成需要γ,所以从状态i射出一条标志为 ε 弧到 j 状态,从而到状态j上面去A的形成。A形成以后,那么A就被扫描过了·就在A的后面了。
图式如下:
在这里插入图片描述

上面的看不懂没关系,我们先看题,一步步按照上面的思路就可以做出来了。

二、题目

给定文法G(S’)

S'→E
E →aA | bB
A→cA | d
B→cB | d
求该文法的项目,画出其NFA图。

三、 题解

不难得出,该文法的项目如下:

在这里插入图片描述
通过上面的文法项目画出图是这篇文章的关键。


第一步:找到所有形如:A→α· 的状态,也就是所有的点在末尾的产生式。
因为我们知道· 符号前面的式子,表示已经扫描完,所以这种产生式的所在状态都是终结状态。
在上面的项目中有:

8.A→cA·
2.S' →E·
5.E→ aA·
13. E→bB·
16. B→cB·
18. B→d·
10. A→d·

也就是说,这些状态最终在图中都是用双圈在这里插入图片描述来表示的。


第二步:从项目1出发:1:S’→·E ,接下来找所有以非终结符E为开头,
形式为E→·α(α为任意字符)的项目:我们找到的状态如下 :
3:E→·aA
11:E→·bB

所以,从1出发:
运用规则1:从状态1出发,用标记为ε的弧去连接状态11和状态3;

运用规则2:我们找从状态1,能够扫描且仅扫描一个字符’E’就能到达的状态,很显然,是状态2.且由前面我们知道,状态2是终结状态。所以第二步形成的图如下:

在这里插入图片描述


由上图所示,我们分别再从状态3和状态11出发(状态2已经终结)。
第三步:从状态3出发:3:E→·aA

`根据规则1,找到从状态3,再扫描一个‘a’就能到达的状态,很显然是状态4:E→a·A;
状态3到状态4经过以’a’为标志的箭头。

这次继续拓展4节点,4:E→a·A

根据规则1:找所有以非终结符A为开头,形式为A→·α(α为任意字符)的项目:我们找到的状态如下 :
6:A→·cA
9:A→·d
因此,从状态4到状态6和状态9,都经过 ε弧。
再用规则2:从状态4,再扫描一个字符’A’就能到达的状态,结果是状态5.

所以结果如下:
在这里插入图片描述


我们继续找6和9.
首先看6:A→·cA
   根据规则2:先找从状态6,再扫描一个字符‘c’就能到达的状态,结果是7:A→c·A ,所以6和7通过一个’c’的弧连接。

   根据规则2:从7出发,我们看看从7状态,再扫描一个字符‘A’就能到达的状态,结果是8:A→cA· 还有一个就是9:A→·d
而前面我们已经知道,8状态是终结状态,所以不需要再从8出发去探索了。
注意,7:A→c·A 它还符合规则2,即再扫描一个非终结符’A’,能到达的状态,很显然是6还有9.
其中6:A→·cA
所以这里状态7还会通过ε弧,指向6和9

从7出发的路径找完了。

 我们回过来找9:A→·d

先找从状态9出发,再扫描一个字符’d’就能到达的状态,很显然是状态 10。而10又是我们之前获得终结状态,所以10的状态就不需要再看。

所以,图继续拓展成为下图所示:

在这里插入图片描述


…限于个人精力,后面跟前面的操作一样,不一一赘述…


经过若干步骤,我们最终形成了如图所示的NFA图。

在这里插入图片描述

这篇博客写的比较详细,可以看看题解

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Issac-Clarke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值