??xml version="1.0" encoding="utf-8" standalone="yes"?> NFA构造DFA的子集算?/font> n 输入Q一个NFA N n 输出Q一个DFA D n ҎQؓD构造一个{换表Dtran。D的每一个状态是一lNFA状态的集合。以下是一些构造需要用到的函数?/span> 操作 描述 ε-closure(s) 能够从NFA的状态s开始只通过ε转换到达的NFA状态集?/span> ε-closure(T) UsєTε-closure(s) move(T,a) 能够从T中某个状态S出发通过标号为a的{换到辄NFA状态的集合 Ø 构造D的状态集合DStates和D的{换函数Dtran 一开?ε-closure(s)是DStates中的唯一状态,且没有被标记; while (DStates中存在未被标识的状态T) { 标识T; for(每个输入W号a) { U = ε-closure(move(T,a)); if(U不再DStats? U加入DStatesQ且没有标识; Dtran[T,a] = U; } } Ø 计算ε-closure(T)的算?/span> T的所有状态压入堆栈中; ?/font>ε-closure(T)的内容初始化为T; while (堆栈非空) { 栈元素t弹出; for(每个满如下条g的uQ从t出发有一个标号ؓε的{换到辄态u) if(u不再ε-closure(T)?{ u加入?/font>ε-closure(T)? u压入栈中; } } Ø 附模拟一个NFA S = ε-closure(s0); c = nextChar(); while(c != eof) { S = ε-closure(move(S,c)); c = nextChar(); } if(S ∩ F != ø) return true; else return false;
1、无用符号及无用产生式的删除
无用W号Q设有一文法G[S]= QVN QVT QPQSQ,说G中的一个符号X∈V是有用的是指X臛_出现在一个句子的推导q程中,xI
存在αQ?#946;∈V*Q有S=*>αXβ
存在ω∈VT* Q?#945;Xβ=*>ω
否则X为无用符?/span>
设有文法G[S]= QVN QVT QPQSQ,首先用算?.1攚w该文法的到G1[S]= QVN1 QVT QP1QSQ,使得对于每一个X∈VN1Q都?#969;∈VT*QX=*>ω
法1Q?nbsp;
(1) 分别|VN1QP1?#934;?/span>
(2) 对P中每一个生式A→δQ若δ∈VT*Q则A攑օVN1中?/span>
(3) 对P中每一个生式A→X1 X2……XKQ若每一个Xi 都属于VT或VN1Q则A攑օVN1中?/span>
(4) 重复③直至VN1不增大?/span>
(5) 对于P中的每一个生式B→Y1 Y2……Yn Q若B及每一个Yi Q都属于VN1∪VT Q则B→Y1 Y2……YnQ放入P1中?nbsp;
其次Q对以给文法G[S]Q若执行法2.2可得C{h文法G’=QVN’Q?nbsp;VT’ QP’QSQ得对MX∈VN’∪ VT’都存?#945;Q?#946;∈QVN’∪ VT’Q有S=*>αXβ.
法2:
1.分别|VN’?nbsp;VT’、P’?#966;
2.S 攑օVN’中?/span>
3.对于G中Q何型如A→α1|……|αm的生式Q若A∈VN’则将α1……αm 中的全部非终l符攑օVN’中,l结W放入VT’中?/span>
4.重复③直至VN’?nbsp;VT’不增大ؓ止?/span>
5.P中左右部仅含VN’∪ VT’中符L所有生式攑օP’ 中?nbsp;
2?#949;—生式的消?/span>
有的分析Ҏ要求文法中不能含?#949;—生式Q因此需要改造文法之不?#949;—生式?/span>
如果语言不含?#949;句子Q则可有办法消除文法中的全部ε—生式Q否则不可能全部消除Q但我们希望只有在空句子的推g用到ε—生式Q其他语句的推导q程中不会?#949;—生式。故对含有空句子的文法,我们希望只有文法开始符S→εq样一个生式q且S不出现在其它M产生式的右部?/span>
法3Q?/span>
扑և所有能导出ε的非l结W?/span>
1.构造W1={A|产生式A→ε∈P}
2.构造集合序列WK+1= WK∪{B|B→β∈PQ且β∈WKQK≥1}
WK+1是一个有限集Q设最后的WK+1为W?/span>
当S∈WӞε∈LQG[S]Q?/span>
设有一文法G[S]= QVN QVT QPQSQ,?#949;不属于该文法所描述的语aӞ可构造文法:
G’=QVNQVTQP’QSQ,使得LQG’Q?LQGQ,G’不含?#949;产生式:
法4:
1.利用WVN 分ؓ两个子集W及VN -W?/span>
2.设A→X1 X2……XK∈PQ按下面规则所有型如A→Y1 Y2……YK 的生式攑օP’中,对于一?≤i≤kQ?/span>
aQ若Xi 不属于WQ则取Yi = Xi
bQ若Xi ∈WQ则分别取Yi 为Xi?#949;Q但是若所有Xi均属于WQ却不能把所有Yi 取ؓε?nbsp;
设有一文法G[S]= QVN QVT QPQSQ,?#949;属于该文法所描述的语aӞ可构造文法:
G1=QVN1 QVT QP1QS’Q,使得LQG1Q?LQGQ,P1中除S’→ε外不再含有其?#949;产生式,q且S’不出现在M产生式的双?/span>
法5Q?/span>
若S不出现在M产生式的右部Q则可直接用法2.4消除ε产生式,再加入S→εQ否则:
1Q引入新的非l结WS’Q?nbsp;VN1= VN ∪{ S’}
2Q构造P’ =P∪{ S’→α| S→α∈P}
3Q对文法G1=QVN1 QVT QP1QS’Q,执行法4Q再加入S’→ε?nbsp;
3、单产生式的消除
A→BQA,B∈VN 此类产生式被UCؓ单生式?/span>
假定文法中不含有ε产生式?/span>
法6Q?/span>
设VN ={ A1 ...... AN } Ҏ一个Ai Q?≤i≤nQ构造集合序?/span>
W1( AiQ?{Ai}Q?nbsp;
WK+1QAi Q? WKQAi Q?#8746;{D|C→D∈PQC∈WKQAi Q,D∈VN }
K≥1Q该集合序列存在一个jQ有
WjQAi Q? Wj+1QAi Q?.....
令WQiQ? WjQAi Q?/span>
WQiQ?{B| Ai =>BQB∈VN }
构造P’={ Ai →α|B→α∈PQB∈WQiQ,α不是单个非终l符}(对于A1到An的U操作),此时P′中已不含M单生式?/span>