前言
在这一节知识点中,出现了这个图:
直接给出了这张图,并没有给出具体的实现步骤(可能实现在视频后面),所以我打算自己写出来这个过程。这也是出这篇文章的原因。帮助我自己理解这个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'→EE →aA | bB
A→cA | d
B→cB | d
求该文法的项目,画出其NFA图。
三、 题解
不难得出,该文法的项目如下:
通过上面的文法项目画出图是这篇文章的关键。
第一步:找到所有形如:A→α· 的状态,也就是所有的点在末尾的产生式。
因为我们知道· 符号前面的式子,表示已经扫描完,所以这种产生式的所在状态都是终结状态。
在上面的项目中有:
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图。