導航:首頁 > 研究方法 > 實現移進歸約分析的一種便利方法

實現移進歸約分析的一種便利方法

發布時間:2022-07-10 07:55:11

❶ 分別解釋軟體的設計兩種設計方法:自頂向下和自底向上

首先它們是兩種程序設計的分析方法
自頂向下:這種方法的主旨是,對給定的輸入符號串,從對應文法開始符號的根結點出發,自頂向下地為輸入符號串建立一棵分析樹。
自底向上:是一種「移進-歸約」法。將這種過程看作為:歸約一個輸入符號串到文法開始的過程。換句話說,這樣的分析法是從輸入符號串開始,逐步進行歸約,直至歸約到文法的開始符號。

❷ 使用自頂向下方法與自底向上方法分層有何差異,哪些類型的項目能最佳的匹配每種方法

自頂向下方法與自底向上方法分層是兩種程序設計的分析方法:
自頂向下:這種方法的主旨是,對給定的輸入符號串,從對應文法開始符號的根結點出發,自頂向下地為輸入符號串建立一棵分析樹。
自底向上:是一種「移進-歸約」法。將這種過程看作為:歸約一個輸入符號串到文法開始的過程。換句話說,這樣的分析法是從輸入符號串開始,逐步進行歸約,直至歸約到文法的開始符號。

項目的學習需要持續不斷的自頂向下的學習與自底向上的學習。何謂自頂向下的學習,即先著手系統架構,然後逐層進入業務模塊,最後進入細粒度功能模塊的開發。所謂自底向上的學習,就是先從一行代碼,一個Bug,一個模塊做起,然後在做一個流程,一個業務模塊,最後熟悉整個系統的架構。
自頂向下的學習與自底向上的學習是離不開的,沒有自頂向下的學習,你就不能很好的理解業務,在開發過程中就會很被動。沒有自底向上的學習,你就不能建立起自己的技術優勢,無法去攻堅。在項目初期,通常系統架構師會講解項目的架構,主要是業務架構。通過了解業務架構,熟悉整個系統的業務,便於在後續系統中根據業務進行開發,這就是所謂的自頂向下的學習。
有時候開發的新項目是自己之前未接觸過的類型,在理解項目的業務時,就會有一定的難度,而每一個項目的開發時間又不是那麼充裕,所以項目上不會給你那麼多的時間來理解系統的業務架構(也包含其它的架構,如邏輯架構等),這時候就需要在項目開發中進行自底向上的學習。如果不是時間特別緊的話,通常會給你一定的時間去了解一個模塊,熟悉系統框架之間各層次間的調用。以此為基礎點,逐步深入,在開發過程中逐漸熟悉系統的架構。
當我們在開發中以模塊為單位開發的樂此不疲時,一定要記得時不時的回頭看看我們的系統架構,無論是業務架構,還是邏輯架構,甚至物理架構,這些都是我們深入理解一個項目的基本。如果我們不滿足於當前的工作狀況,更要記得時時學習系統架構,以整體為單位,進行全面的學習。
無論是作為一名現在的或未來的開發人員或者架構師,我們都不應該止步於當前的學習,時時刻刻切記自頂向下的學習與自底向上的學習是分不開的。自頂向下的學習需要自底向上的學習來完善,自底向上的學習需要自頂向下的學習來指導。

❸ LR分析法的LALR(1)分析表的構造

上述每個LR(1)項目均由兩部分組成: 第一部分是一個LR(0)項目,稱為LR(1)項目的核;第二部分則是一個向前搜索符號集。對於移進項目而言,搜索符號對分析表的構造無影響;但對歸約項目而言,則僅在當前輸入符號屬於該搜索符號集時,才能用相應的產生式進行歸約。LR(1)分析表的這種機理,較圓滿地解決了SLR(1)分析所難以解決的某些「移進歸約」或「歸約歸約」沖突,從而使LR(1)的分析能力比SLR(1)分析有明顯的提高。然而,LR(1)分析的主要缺點在於,對同一個文法而言,LR(1)分析表的規模將遠遠大於相應的SLR(1)或LR(0)分析表。例如,為一個C語言構造LR(0)分析表,一般大約設置300個狀態即可,而構造LR(1)分析表則需上千個狀態,即後者將導致時間和內存空間開銷的急劇上升。因此,就有必要尋求一種其分析表的規模與SLR(1)相當,但其分析能力又不比LR(1)相差太大的LR分析方法,這就是下面我們要介紹的LALR(1)分析技術。
下面,我們首先對造成LR(1)項目集族規模大幅度上升的原因進行分析,然後再設法從中找出構造高效LR分析表 (即LALR(1)分析表)的方法。為此,試看下面的例子。
再考察文法G[E]:
0?S→E4?T→F
1?E→E+T5?F→(E)
2?E→T6?F→ID
3?T→T*F
利用上面所給演算法,為G[E]構造的LR(1)項目集族和識別活前綴的DFA如圖420(a),(b)所示 (請注意,由於圖幅較大,這里將其劃分為(a),(b)兩部分)。對比這兩幅圖我們立即就會發現,除其中的狀態0和狀態3之外,對於(a)中的每一狀態 (LR(1)項目集),在(b)中都有一個狀態 (LR(1)項目集)與其相似。例如,比較狀態7和16:在這兩個項目集中,除搜索符號集不同外,各個LR(1)項目的核都彼此相同 (即產生式相同,且產生式中圓點的位置也相同),我們把具有這種特點的兩個LR(1)項目集稱為同心集。所以,在圖420(a)和(b)中,7/16,5/12,10/17,4/13,8/18,2/14,11/19,6/20,1/15和9/21都是同心集。顯然,在LR(0)分析器中,每個「心」僅對應一個LR(0)項目集;但在LR(1)分析器中,由於向前搜索符號的不同,同一個「心」將會派生出多個同心集。這就是對同一文法而言,LR(1)項目集族遠大於LR(0)項目集規范族的原因。
7E→E+·T[]#+T→·T*F
T→·F
F→·(E)
F→·ID〖〗#+*
#+*
#+*
#+*[][]16E→E+·T[]+)T→·T*F
T→·F
F→·(E)
F→·ID〖〗+)*
+)*
+)*
+)*
為解決上述問題,F?DeRemer提出了LALR(1)分析法。這種方法的基本思想是將LR(1)項目集族中的同心項目集加以合並,以削減項目集的個數。所謂合並同心集,實際上也就是將其中的每個LR(1)項目的向前搜索符集對應地合並在一起。例如,對於文法G[E]的同心項目集4和13,設合並後的新項目集為4/13,則有
4E→T·
T→T·*F〖〗#+
#+*[][]13E→T·
T→T·*F〖〗+)
+)*[][]4/13E→T·
T→T·*F〖〗#+)
#+)*
由於同心集的合並,對原來識別活前綴的DFA也須作相應的修改。
對於LALR(1)項目集族,我們須著重指出如下幾點:
(1) 合並同心集也就是將同心集中每個LR(1)項目的兩個組成部分 (核及向前搜索符號集)分別、對應地合並在一起。設I1,I2,…,Im為同心項目集,J是合並之後的新的項目集,顯然J與Ii同心;再設X∈V∪{#},則GO(I1,X),GO(I2,X),…,GO(Im,X)也必然同心,若把這m個同心項目集合並後的新項目集記為K,則有GOTO(J,X)=K。可見前面定義的GOTO函數在這里仍然適用。
(2) 盡管原來各LR(1)項目集均不存在沖突,但合並同心集後就有可能出現沖突。換言之,即LR(1)文法未必總是LALR(1)文法。不過,由此引入的沖突只能是「歸約歸約」沖突,而決不會是「移進歸約」沖突。事實上,設原LR(1)項目集族中有如下兩個項目集
Ik:
[A→α·,W1]
[B→β·aγ,b]Ij:
[A→α·,W2]
[B→β·aγ,c]
並設Ik與Ij均無沖突,故有
W1∩{a}=?W2∩{a}=?
從而
(W1∪W2)∩{a}=?
現將Ik與Ij合並,有
Ik/j:
[A→α·,W1∪W2]
[B→β·aγ,{b}∪{c}]
若此時Ik/j有「移進歸約」沖突,則必有
(W1∪W2)∩{a}≠?
這就與Ik與Ij無沖突的假設相矛盾。因此,合並同心集不會引入新的「移進歸約」沖突。
(3) 對同一個語法上正確的輸入符號串而言,不論用LALR(1)分析表還是用LR(1)分析表進行分析,所經歷的移進、歸約序列總是相同的 (僅狀態名可能不同)。然而,當輸入符號串有錯時,LALR分析器可能會比LR(1)分析器多進行幾步歸約才能報錯,但決不會比LR分析器多移進輸入符號。也就是說,LALR分析器雖然可能延遲了發現出錯的時間,但對錯誤的准確定位不產生影響。
(4) LALR(1)項目集族總是與同一文法的SLR(1)項目集族有同樣個數的項目集。但是構造LALR項目集族的開銷比SLR大。實現LALR分析對文法的要求比LR(1)嚴、比SLR(1)寬,但開銷遠小於LR(1)。權衡利弊的結果,LALR堪稱為當前實現自底向上語法分析,特別是構造分析器自動生成工具的最為適用的技術。
綜上所述,可給出構造LALR(1)分析表的演算法如下。
1? 對已給的拓廣文法G′,構造相應的LR(1)項目集族C={I0,I1,…,In}。
2? 對於C,將各LR(1)項目集按同心關系進行分組,並將同組的同心集加以合並,設所得的新項目集族為C′={J0,J1,…,Jm},其中含有項目[S′→·S,#]的項目集對應於初態。
3? 若C′中的項目集含有沖突項目,則G′不是LALR(1)文法。否則,可按如下法則構造LALR(1)分析表:
(1) 用構造LR(1)分析表類似的方法構造ACTION表;
(2) 對於某個X∈VN,若有GO(Jk,X)=Jt,則置GOTO(k,X)=t。
上述通過構造LR(1)項目集族和合並同心集來構造LALR分析表的方式僅有理論意義而無實用價值。因為構造完整的LR(1)項目集族的時間和空間開銷都很大,故應首先設法予以解決。
迄今已有多種高效構造LALR分析表的演算法,其共同的特點都是不從直接構造完整的LR(1)項目集入手,而是通過構造LR(0)項目集並添加相應的向前搜索符號來形成LALR(1)項目集 (請注意,對同一個文法而言,LALR(1)項目集與同心的LR(0)項目集一一對應)。例如,OCCS/YACC構造LALR(1)項目集所採用的策略是,每當創建一新的項目集時,就檢查目前是否已存在與之同心的項目集,若有這樣的項目集,則只需將向前搜索符號加入其中,而不再建立新的項目集。一種更為有效的方法甚至無需構造完整的LALR(1)項目集,而僅通過各個項目集中的「核心項目」便能構造相應的LALR(1)分析表。這里所說的核心項目是指形如[S′→·S,#]的項目 (其中,S′→S是拓廣文法的第1個產生式),或者是形如[A→α·Xβ,a]的項目 (其中,α≠ε,即圓點不出現在產生式右部的最左位置),亦即那些用於構造本項目集閉包的「基本項目」。例如,對於文法G[E],各項目集的核心項目如圖422所示。
下面,我們對利用項目集的核心項目構造LALR分析表的原理進行說明。 構造ACTION表的關鍵在於確定「歸約」和「移進」兩種動作。
(1) 歸約動作的確定
由核心項目的定義可知,任何歸約項目都必然會出現在某個項目集的核心項目之中,現設項目集I的核心為K,若[A→α·,a]∈K (其中α≠ε,搜索符號如何配置下面再介紹),我們立即可以確定: 在當前狀態下所面臨的輸入符號為a時,應按產生式A→α進行歸約,即有
ACTION[I,a]=rj
若α=ε,則當且僅當
[B→γ·Cδ, b]∈KC?*[]rAη
且a∈FIRST(ηδb)時,才能確定面臨輸入符號a時用產生式A→ε進行歸約。由於對任何C∈VN,滿足C?*[]rAη的所有非終結符號A預先能完全確定,故項目集I所引發的歸約動作,僅由其核心K即能完全確定。
(2) 移進動作的確定

[A→α·Xβ,b]∈KX?*[]raη(a∈VT)
且上述推導的最後一步未使用ε產生式,則可確定: 狀態I面臨輸入符號a時的動作為「移進」。其中,終結符號a可通過預先計算FIRST(X)加以確定。 對於任何項目[B→γ·Xδ,b]∈K,相應的項目[B→γX·δ,b]顯然必屬於某個項目集J=GO(I,X)的核心L。另外,若
[B→γ·Cδ,b]∈KC?*[]rAη
且A→Xβ是文法中的一個產生式,則對於任何
a∈FIRST(ηδb)[A→X·β,a]∈L
由於對每一對非終結符號(C,A),是否存在關系C?*[]rAη,可採用類似於計算FIRST集的方法預先求出,故僅從I的核心同樣可構造出GOTO表。 上面的討論,是在假定每個核心項目都已配置了搜索符號的情況下進行的。現在,再回頭討論: 如何為每個LR(0)項目集的核心項目配置搜索符號,使之成為LALR項目集的核心項目。為此,我們首先考察搜索符號從項目集I傳播到項目集GO(I,X)的規律。
再設項目集I的核心為K,若有
[B→γ·Cδ,b]∈KC?*[]rAη
且A→Xβ是文法中的一個產生式,則根據上面的討論有
[A→X·β,a]∈La∈FIRST(ηδb)
其中L是項目集J的核心,且J=GO(I,X)。現分如下兩種情況討論搜索符號a和b間的關系。
(1) 當ηδ?*ε時,顯然也有[A→X·β,b]∈L。此時,我們就說項目[A→X·β,b]中的搜索符號b是從項目[B→γ·Cδ,b]中傳遞過來的 (propagate)。
(2) 當ηδ不能推導出ε時,a僅取決於η或δ,而與b無關,此時我們就說搜索符號a是自生的 (spotaneous)。
無論a是傳遞的還是自生的,它總能根據項目[B→γ·Cδ,b]中的有關信息,通過上述計算獲得,這便是搜索符號從項目集I傳播到項目集J的規律。
其次,在同一項目集中,核心項目中的搜索符號向非核心項目傳播的規律與上述規律極為相似。事實上,設[B→γ·Cδ,b]∈K,而C→α是文法中的一個產生式,則[C→·α,c]是I的一個非核心項目。其中,搜索符c∈FIRST(δb),且按如下方法確定: 若δ不能推出ε,則c是自生的;否則,c=b,即c是從上面的項目傳遞下來的。
類似地,也可討論搜索符號在非核心項目間的傳播規律。例如,對於文法G[E],從核心項目[S→·E,#]開始,向前搜索符號在I0中的傳遞和自生的情況如圖423所示。
設K是LR(0)項目集I的核心,X是某個文法符號,則對GO(I,X)的核心中的每一項目A→αX·β,通過程序47描述的操作 (請注意,這里使用了一個虛擬搜索符號lookahead),可由I中的項目確定其全部自生的搜索符號,並能確定K中的哪些項目將其搜索符號傳遞給GO(I,X)中的項目A→αX·β。
程序47確定自生搜索符號和傳遞搜索符號的項目
for (K中的每個項目B→γ·δ)
{
J′=CLOSURE ([B→γ·δ,lookahead]);
/*計算GO函數之值 */
for (J′中的每一項目[A→α·Xβ,a])
{
if(a!=lookahead)
確定GO(I,X)核心項目[A→αX·β,a]
之搜索符號a是自生的
if(a==lookahead)
確定GO(I,X)核心項目[A→αX·β,a]之搜索符號a是從K中項目
B→γ·δ傳遞過來的;
}
}
最後,我們再考慮如何給每個LR(0)項目集的核心中的各個項目都配置一個搜索符號集,以獲得各個LALR(1)項目集的核心。完成此項任務的大致過程如下。
(1) 為拓廣文法G′構造全部LR(0)項目集的核心。
(2) 首先從初始項目集I0惟一的核心項目S′→·S (其搜索符號顯然為#)開始,對每個LR(0)項目集的核心和每個文法符號X,利用上面的演算法,確定GO(I,X)各核心項目的自生搜索符號集,並確定從I的哪些項目將搜索符號傳遞到GO(I,X)的核心項目。
(3) 按某種便於操作的結構,建立一張核心項目表,此項目表記錄了每個項目集的各個核心項目及其相應的搜索符號集。開始時,這些搜索符號集僅是由第(2)步所確定的自生搜索符號集 (若該核心項目無自生向前搜索符號則為空)。
(4) 傳遞每個核心項目中的自生搜索符號,直到無法再進行傳遞為止。即反復掃視各項目集的每個核心項目,每當訪問一個核心項目i時,便根據第(2)步所獲的信息,將i當前要傳遞的搜索符號添加到承接它的那個核心項目之中,直至沒有新的搜索符號要傳遞為止。
對一個給定的文法G而言,當它的各個LALR(1)項目集的核心構造出來之後,就能根據上面所描述的原理,為G構造相應的LALR(1)分析表。不過,盡管上述構造LALR分析表的方法效率較高,但對於常見的程序設計語言,企圖用手工的方式來建立LALR分析表仍幾乎是不可能的。所幸的是,目前已有一些自動生成LALR分析表的工具可資使用(如YACC)。
還應當指出,在構造LR語法分析器時,尚有若干技術問題需予以考慮,如二義性文法的處理,避免按單產生式的歸約,等等。前者我們將在第5章介紹語法分析器自動生成工具時再進行討論;至於後者,由於需涉及一些語義處理及其信息傳遞的細節,故就不再討論了。
在結束本章時,我們還要給出如下的結論,這些結論的證明讀者可參閱有關的文獻(1,2,8,15)。
(1) 任何LR(K),LL(K)及簡單優先文法類都是無二義性的;對於算符優先文法,如果不考慮歸約所得非終結符號的名字,也可認為是無二義性的。
(2) 任何二義性的文法都不可能是LR(1)(或LL(1))文法,但可藉助於其它因素,如算符的優先順序和結合規則以及某些語義解釋等等,來構造無沖突的分析表。
(3) 每個SLR(K)文法都是LR(K)文法,但卻存在這樣的LR(1)文法,它對任何K而言均不是SLR(K)文法。

❹ 提示Target not created.

提示Target not created代表編譯沒有成功;

編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。編譯程序的語法規則可用上下文無關文法來刻畫。

語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧里,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。

(4)實現移進歸約分析的一種便利方法擴展閱讀:

如果編譯過程中發現源程序有錯誤,編譯程序應報告錯誤的性質和錯誤的發生的地點,並且將錯誤所造成的影響限制在盡可能小的范圍內,使得源程序的其餘部分能繼續被編譯下去,有些編譯程序還能自動糾正錯誤,這些工作由錯誤處理程序完成。

需要注意的是,一般上編譯器只做語法檢查和最簡單的語義檢查,而不檢查程序的邏輯。

❺ 編譯原理 - 移進歸約分析中如何確定句柄的開始處與結束處

當然是根據文法來寫的呀 沒有文法無法確定 句柄的開始處和結束處 的 當然 還要看看匹配不匹配呀 ,要最後 這個句型和文法都匹配起來都行呀 總之 句柄肯定都是在產生式右端的 你可以一個個匹配過來

❻ LR分析法的LR(1)分析表的構造

前面所介紹的SLR(1)分析法是一種較實用的方法。其優點是狀態數目少,造表演算法簡單,大多數程序設計語言基本上都可用SLR(1)文法來描述。然而,也的確存在這樣的文法,其項目集的「移進歸約」沖突不可能通過SLR(1)規則得到解決。試看下面的例子。
例4?8考察文法G[S′]=({S′,S,A,B,C,D}, {a,b},,P,S′)其中,P由如下的產生式組成:
0? S′→S4?B→C
1?S→CbBA5?B→Db
2?A→Aab6?C→a
3?A→ab7?D→a
識別此文法的全部活前綴的DFA見圖418。其中項目集I10={S→CbBA·,A→A·ab}存在「移進歸約」沖突,但因FOLLOW(S)={#},故上述沖突可通過SLR(1)規則得到解決。然而,在項目集I8={C→a·,D→a·}中,由於FOLLOW(C)={a,b},FOLLOW(D)={b},即FOLLOW(C)∩FOLLOW(D)≠?,故用SLR(1)規則解決上述「歸約歸約」沖突無效。而且還可驗證,對於任何K>0,上述文法也是非SLR(k)的,故不能通過任何SLR(k)規則使項目集I8中的「歸約歸約」沖突得到解決 [2]。因此,我們需要更強的LR分析法,即LR(1)分析方法來解決這一問題。
對SLR(1)規則稍作分析即可發現,它對某些文法失效的原因,在於當所給的文法出現沖突的分析動作時,SLR(1)規則僅孤立地考察輸入符號是否屬於與歸約項目A→α·相關聯的集合FOLLOW(A),以確定是否應按產生式A→α進行歸約,而沒有考察符號串α所在規范句型的「環境」,即沒有考察α在規范句型中的「上下文」,這就具有一定的片面性。因為一旦α出現在分析棧的頂部 (設分析棧當前所存放的符號串為#δα),且當前的輸入符號a也屬於FOLLOW(A),就貿然將α歸約為A,此時分析棧中的符號串將變成#δA,但若文法中並不存在以δAa為前綴的規范句型,那麼,這種歸約無效。例如,對於上述文法中的規范句型Cbabab,當分析達到格局
I0I2I4I8[]#Cbabab(4?50)
時,如果僅根據當前輸入符號b∈FOLLOW(C),就將棧頂符號a按產生式C→a歸約為C,則有如下的格局:
I0I2I4I6[]#CbCbab
但在該文法中,根本不存在以CbCb為前綴的規范句型,因此在執行下一動作將b移進之前,分析器將報告「出錯」。由此可見,在分析過程中,當試圖用某一產生式A→α歸約棧頂符號串α時,不僅應查看棧中符號串δα,還應向前掃視一輸入符號a (我們將a稱為向前搜索符號),只有當δAa的確構成文法某一規范句型的前綴時,才能用此產生式進行歸約。為了指明上述事實,應當在原來的每一LR(0)項目[A→α·β]中放置一個向前搜索符號a,使之成為[A→α·β,a]的形式,我們將此種項目稱為一個LR(1)項目。同時,為了使分析的每一步都能在棧中得到一個規范句型的活前綴,還應要求每一個LR(1)項目對相應的活前綴都是有效的 (其定義在下面給出)。此外,為了克服分析動作的沖突,在必要時,我們還可將某些項目集進行分解,以便使每一個狀態都能確切地指明: 當α已出現在棧頂,且面臨哪些輸入符號時,才能按產生式A→α將α歸約為A。
所謂一個LR(1)項目[A→α·β,a]對活前綴γ=δα有效,是指存在規范推導
S?*δAy?δαβyy∈V*T
且滿足下列條件:
(1) 當y≠ε時,a是y的首符號;
(2) 當y=ε時,a=#。
例如,對於例4?8所給文法,因有
S?CbBA?CbBab?CbDbab
其中,δ=Cb,α=D,β=b,y=ab,A=B,故LR(1)項目[B→D·b,a]對活前綴γ=CbD有效。又因
S?*CbDbab?Cbabab
其中,δ=Cb,A=D,α=a,β=ε,y=bab,故LR(1)項目[D→a·,b]對活前綴γ=Cba有效。由此也可看出,當分析器所處的格局為式(4?50)時,應當將棧頂符號a歸為D,而不應將它歸約為C。
與LR(0)文法的情況相類似,識別文法全部活前綴的DFA的每一個狀態也是用一個LR(1)項目集來表示,而每一個項目集又是由若干個對相應活前綴有效的LR(1)項目組成。為了構造LR(1)項目集族,我們同樣需要用到兩個函數,即CLOSURE(I)及GO(I,X)。
對每一LR(1)項目集I,相應的CLOSURE(I)的定義如下:
(1) I中的任何LR(1)項目都屬於CLOSURE(I)。
(2) 設項目[A→α·Bβ,a]∈CLOSURE(I),並假設它對活前綴γ=δα有效,則對文法中所有形如B→η的產生式和每一個b∈FIRST(βa),形如[B→·η,b]的全部項目也都對γ有效,故若[B→·η,b]原不在CLOSURE(I)中,則應將其放入。事實上,因為[A→α·Bβ,a]對γ=δα有效,則由定義我們有:
s?*δAy?δαBβyy∈V*T
且a∈FIRST(y)∪{#},故可將上面的推導寫成
S?*δAy?δαBβaωω∈V*T∪{#}
現設文法已經過化簡,故不論β是否為ε,從βaω總能推出終結符號串,於是可假定
βaω?*bω′
又因a≠ε,有FIRST(βaω)=FIRST(βa),從而就得到推導
S?*δαBbω′
由此可見,一切形如[B→·η,b]的項目也對活前綴γ=δα有效。
(3) 重復步驟(2)直到沒有新的項目加入為止。
至於函數GO(I,X),其中I為一LR(1)項目集,X為某一文法符號,與LR(0)文法類似,我們也將它定義為:
GO(I,X)=CLOSURE(J)
其中J是由這樣的一些LR(1)項目組成: 對I中所有圓點在X左邊形如[A→α·Xβ,a]的項目,其後繼項目[A→αX·β,a]∈J。注意,每一LR(1)項目與其後繼項目有相同的向前搜索符號。
有了上述CLOSURE(I)和GO(I,X)的定義之後,採用與LR(0)類似的方法,可構造出所給文法G的LR(1)項目集族C及狀態轉換圖。例如,對於上述文法,其LR(1)項目集及狀態轉換圖如圖419所示。
對於給定的文法G,當相應的LR(1)項目集族C及GO函數構造出來之後,便可按如下的演算法構造它的LR(1)分析表:
(1) 對於每個項目集Ii中形如[A→α·Xβ,b]的項目,若GO(Ii,X)=Ij,且當X為一終結符號a時,置ACTION[i,a]=sj。但若X為一非終結符號時,則置GOTO[i,X]=j。
(2) 若歸約項目[A→α·,a]∈Ii,A→α為文法的第j個產生式,則置ACTION[i,a]=rj。
(3) 若項目[S′→S·,#]∈Ii,則置ACTION[i,#]=acc。
(4) 在分析表中,凡不能照上述規則填入信息的元素,均置為「出錯」。
對於一個文法G來說,若按上述演算法所構造的分析表不含有多重定義的元素,則稱此分析表為G的LR(1)分析表。凡具有LR(1)分析表的文法稱為LR(1)文法。例如,上述文法的LR(1)分析表見表416,所以它是一個LR(1)文法。

❼ LR分析法的SLR(1)分析表的構造

在前面討論LR(0)分析表的構造演算法時,我們曾經指出,僅當一個文法G是LR(0)文法時,才能對它構造出無沖突動作的LR(0)分析表。然而,對於通常的程序設計語言來說,它們一般都不能用LR(0)文法來描述。例如,考慮如下「簡單分程序」的文法G[B′]:
0? B′→B3? D→d
1? B→bD;Se4? S→s;S
2? D→D;d5? S→s
相應識別其全部活前綴的DFA及LR(0)分析表如圖417及表414所示。由於在項目集I8中,既含有移進項目[S→s·;S],又含有歸約項目[S→s·],因而反映到分析表中就出現了具有多重定義的元素ACTION[8,′;′]={s10,r5},前者指明當輸入符號為「;」時應將它移進棧中,而後者則要求按第5個產生式S→s進行歸約。於是就出現了有「移進歸約」沖突的分析動作。又如,對於通常用來描述簡單表達式的文法G[E],當構造它的項目集規范族時,也會出現類似的情況。這就表明,這兩個文法都不是LR(0)文法。然而,盡管如此,對大多數程序設計語言來說,這種具有沖突項目的項目集,在整個項目集規范族中所佔的比例畢竟是很小的。因此,如果我們能設法解決出現在一個項目集中的「移進歸約」或「歸約歸約」沖突,那麼,只要對前述構造LR(0)分析表的演算法稍加修改,它仍能適用於我們現在討論的情況。
表414G[B′]的LR(0)分析表
b[]d[];[]s[]e[]#[]B[]D[]S0[]s2[8]11[7]acc2[3]s4[9]33[4]s54[]r3[]r3[]r3[]r3[]r3[]r35[][]s7[][]s8[10]66[6]s97[]r2[]r2[]r2[]r2[]r2[]r28[]r5[]r5[]r5,s10[]r5[]r5[]r59[]r1[]r1[]r1[]r1[]r1[]r110[5]s8[10]1111[]r4[]r4[]r4[]r4[]r4[]r4
仔細分析上述構造LR(0)分析表的演算法容易看出,使分析表中出現多重定義分析動作的原因在於其中的規則(2),即對於每一項目集Ii中的歸約項目A→α·,不管當前的輸入符號是什麼,都把ACTION子表相應於Ii那一行 (即第i行)的各個元素指定為rj,其中j是產生式A→α的編號。因此,如果該項目集Ii中同時還含有形如B→α·bβ或C→α·的項目,則在分析表的第i行中,必然會出現多重定義的元素。
由此可見,對於含有沖突的項目集
Ii={B→α·bβ,A→α·,C→α·}
在構造分析表時,如果能根據不同的向前符號a,將Ii中各項目所對應的分析動作加以區分,那麼就有可能使沖突得到解決。為此,對於文法中的非終結符號U,我們定義集合
FOLLOW(U)={a|S′#?*…Ua…, a∈VT∪{#}}
即FOLLOW(U)是由所有含U的句型中,直接跟在U後的終結符號或#組成的集合。現對上述項目集Ii,考察FOLLOW(A),FOLLOW(C)及{b},若它們兩兩不相交,則可採用下面的方法,對Ii中各個項目所對應的分析動作加以區分。
對任何輸入符號a:
(1) 當a=b時,置ACTION[i,b]=「移進」;
(2) 當a∈FOLLOW(A)時,置ACTION[i,a]={按產生式A→α歸約};
(3) 當a∈FOLLOW(C)時,置ACTION[i,a]={按產生式C→α歸約};
(4) 當a不屬於上述三種情況之一時,置ACTION[i,a]=「ERROR」。
一般地,若一個項目集I含有多個移進項目和歸約項目,例如
I={A1→α·a1β1, A2→α·a2β2,…,Am→α·amβm, B1→α·, B2→α·, …, Bn→α·}
則當集合{a1,a2,…,am},FOLLOW(B1),FOLLOW(B2),…,FOLLOW(Bn)兩兩不相交時,可類似地根據不同的向前符號,對狀態為i時的沖突動作進行區分。
上述用來解決分析動作沖突的方法稱為SLR(1)規則。此規則是由F?DeRemer於1971年提出的。
有了SLR(1)規則之後,只須對前述構造LR(0)分析表的演算法中的規則(2)作如下的修改:「(2)′若歸約項目A→α·屬於Ii,設A→α為文法的第j個產生式,則對於任何屬於FOLLOW(A)的輸入符號a,置ACTION[i,a]=rj」,且其餘的規則仍保持不變,就得到了構造SLR(1)分析表的演算法。
對於給定的文法G,若按上述演算法構造的分析表不含多重定義的元素,則稱文法G為SLR(1)文法。例如,對於上面的文法G[B′],它的項目集
I8={S→s·; S,S→s·}
含有沖突的項目,但由於FOLLOW(S)={e}≠{;},故沖突可用SLR(1)規則解決,與上述項目相應的分析動作分別是:
ACTION[8,;]=s10ACTION[8,e]=r5
此外,再注意到FOLLOW(B′)=FOLLOW(B)={#}和FOLLOW(D)={;},則按上述演算法為G[B′]所構造的SLR(1)分析表b[]d[];[]s[]e[]#[]B[]D[]S0[]s2[8]11[7]acc2[3]s4[9]33[4]s54[4]r35[3]s7[][]s8[10]66[6]s97[4]r28[4]s10[][]r59[7]r110[5]s8[10]1111[6]r4

❽ lr是什麼

lr是一款專業調色的軟體。

LR是lightroom的簡稱,是Adobe旗下一款後期處理工具。最被我們所熟悉的是另一款軟體是photoshop,相比於PS,LR在調色方面更加的方便,好用。使我們的工作效率大大的提高,這是一款專業的調色工具。

ir的基礎使用方法

一般我們在用Lightroom調修照片時,最先或最常用到的工具就是基本面板,它內建了一張照片所有的基調調整,包括白平衡(色溫/色調)、曝光度、對比、亮部、陰影、白色/黑色剪載、清晰度、鮮艷度和飽和度。運用「基本面板」,我們就可以對照片進行初步的調整了。

❾ 編譯原理,算符優先文法採用"移進-規約"技術,其規約過程是規范的. 這句話錯在哪了謝謝

算符優先文法確實使用了移入歸約技術,但其歸約過程不滿足規范歸約(最左歸約),算符優先文法每次歸約的是最左素短語,而規范歸約每次歸約的是最左直接短語(句柄)

❿ 編譯原理試題

習題一、單項選擇題
1、將編譯程序分成若干個「遍」是為了 。
a.提高程序的執行效率
b.使程序的結構更加清晰
c.利用有限的機器內存並提高機器的執行效率
d.利用有限的機器內存但降低了機器的執行效率
2、構造編譯程序應掌握 。
a.源程序 b.目標語言
c.編譯方法 d.以上三項都是
3、變數應當 。
a.持有左值 b.持有右值
c.既持有左值又持有右值 d.既不持有左值也不持有右值
4、編譯程序絕大多數時間花在 上。
a.出錯處理 b.詞法分析
c.目標代碼生成 d.管理表格
5、 不可能是目標代碼。
a.匯編指令代碼 b.可重定位指令代碼
c.絕對指令代碼 d.中間代碼
6、使用 可以定義一個程序的意義。
a.語義規則 b.詞法規則
c.產生規則 d.詞法規則
7、詞法分析器的輸入是 。
a.單詞符號串 b.源程序
c.語法單位 d.目標程序
8、中間代碼生成時所遵循的是- 。
a.語法規則 b.詞法規則
c.語義規則 d.等價變換規則
9、編譯程序是對 。
a.匯編程序的翻譯 b.高級語言程序的解釋執行
c.機器語言的執行 d.高級語言的翻譯
10、語法分析應遵循 。
a.語義規則 b.語法規則
c.構詞規則 d.等價變換規則
解答
1、將編譯程序分成若干個「遍」是為了使編譯程序的結構更加清晰,故選b。
2、構造編譯程序應掌握源程序、目標語言及編譯方法等三方面的知識,故選d。
3、對編譯而言,變數既持有左值又持有右值,故選c。
4、編譯程序打交道最多的就是各種表格,因此選d。
5、目標代碼包括匯編指令代碼、可重定位指令代碼和絕對指令代碼3種,因此不是目標代碼的只能選d。
6、詞法分析遵循的是構詞規則,語法分析遵循的是語法規則,中間代碼生成遵循的是語義規則,並且語義規則可以定義一個程序的意義。因此選a。
7、b 8、c 9、d 10、c
二、多項選擇題
1、編譯程序各階段的工作都涉及到 。
a.語法分析 b.表格管理 c.出錯處理
d.語義分析 e.詞法分析
2、編譯程序工作時,通常有 階段。
a.詞法分析 b.語法分析 c.中間代碼生成
d.語義檢查 e.目標代碼生成
解答
1.b、c 2. a、b、c、e
三、填空題
1、解釋程序和編譯程序的區別在於 。
2、編譯過程通常可分為5個階段,分別是 、語法分析 、代碼優化和目標代碼生成。 3、編譯程序工作過程中,第一段輸入是 ,最後階段的輸出為 程序。
4、編譯程序是指將 程序翻譯成 程序的程序。 解答
是否生成目標程序 2、詞法分析 中間代碼生成 3、源程序 目標代碼生成 4、源程序 目標語言
一、單項選擇題
1、文法G:S→xSx|y所識別的語言是 。
a. xyx b. (xyx)* c. xnyxn(n≥0) d. x*yx*
2、文法G描述的語言L(G)是指 。
a. L(G)={α|S+ ⇒α , α∈VT*} b. L(G)={α|S*⇒α, α∈VT*}
c. L(G)={α|S*⇒α,α∈(VT∪VN*)} d. L(G)={α|S+ ⇒α, α∈(VT∪VN*)}
3、有限狀態自動機能識別 。
a. 上下文無關文法 b. 上下文有關文法
c.正規文法 d. 短語文法
4、設G為算符優先文法,G的任意終結符對a、b有以下關系成立 。
a. 若f(a)>g(b),則a>b b.若f(a)<g(b),則a<b
c. a~b都不一定成立 d. a~b一定成立
5、如果文法G是無二義的,則它的任何句子α 。
a. 最左推導和最右推導對應的語法樹必定相同
b. 最左推導和最右推導對應的語法樹可能不同
c. 最左推導和最右推導必定相同
d. 可能存在兩個不同的最左推導,但它們對應的語法樹相同
6、由文法的開始符經0步或多步推導產生的文法符號序列是 。
a. 短語 b.句柄 c. 句型 d. 句子
7、文法G:E→E+T|T
T→T*P|P
P→(E)|I
則句型P+T+i的句柄和最左素短語為 。
a.P+T和i b. P和P+T c. i和P+T+i d.P和T
8、設文法為:S→SA|A
A→a|b
則對句子aba,下面 是規范推導。
a. SÞSAÞSAAÞAAAÞaAAÞabAÞaba
b. SÞSAÞSAAÞAAAÞAAaÞAbaÞaba
c. SÞSAÞSAAÞSAaÞSbaÞAbaÞaba
d. SÞSAÞSaÞSAaÞSbaÞAbaÞaba
9、文法G:S→b|∧(T)
T→T,S|S
則FIRSTVT(T) 。
a. {b,∧,(} b. {b,∧,)} c.{b,∧,(,,} d.{b,∧,),,}
10、產生正規語言的文法為 。
a. 0型 b. 1型 c. 2型 d. 3型
11、採用自上而下分析,必須 。
a. 消除左遞歸 b. 消除右遞歸 c. 消除回溯 d. 提取公共左因子
12、在規范歸約中,用 來刻畫可歸約串。
a. 直接短語 b. 句柄 c. 最左素短語 d. 素短語
13、有文法G:E→E*T|T
T→T+i|i
句子1+2*8+6按該文法G歸約,其值為 。
a. 23 B. 42 c. 30 d. 17
14、規范歸約指 。
a. 最左推導的逆過程 b. 最右推導的逆過程
c. 規范推導 d. 最左歸約的逆過程
[解答]
1、選c。
2、選a。
3、選c。
4、雖然a與b沒有優先關系,但構造優先函數後,a與b就一定存在優先關系了。所以,由f(a)>g)(b)或f(a)<g(b)並不能判定原來的a與b之間是否存在優先關系:故選c。
5、如果文法G無二義性,則最左推導是先生長右邊的枝葉:對於d,如果有兩個不同的是了左推導,則必然有二義性。故選a。
6、選c。
7、由圖2-8-1的語法樹和優先關系可以看出應選b。

8、規范推導是最左推導,故選d。
9、由T→T,…和T→(… 得FIRSTVT(T))={(,,)};
由T→S得FIRSTVT(S)⊂FIRSTVT(T),而FIRSTVT(S)={b,∧,(};即
FIRSTVT(T)={b,∧,(,,}; 因此選c。
10、d 11、c 12、b 13、b 14、b
二、多項選擇題
1、下面哪些說法是錯誤的 。
a. 有向圖是一個狀態轉換圖 b. 狀態轉換圖是一個有向圖
c.有向圖是一個DFA d.DFA可以用狀態轉換圖表示
2、對無二義性文法來說,一棵語法樹往往代表了 。
a. 多種推導過程 b. 多種最左推導過程 c.一種最左推導過程
d.僅一種推導過程 e.一種最左推導過程
3、如果文法G存在一個句子,滿足下列條件 之一時,則稱該文法是二義文法。
a. 該句子的最左推導與最右推導相同
b. 該句子有兩個不同的最左推導
c. 該句子有兩棵不同的最右推導
d. 該句子有兩棵不同的語法樹
e.該句子的語法樹只有一個
4、有一文法G:S→AB
A→aAb|ε
B→cBd|ε
它不產生下面 集合。
a. {anbmcndm|n,m≥0} b. {anbncmdm|n,m>0}
c. {anbmcmdn|n,m≥0} d. {anbncmdm|n,m≥0}
e. {anbncndn|n≥0}
5、自下而上的語法分析中,應從 開始分析。
a. 句型 b. 句子 c. 以單詞為單位的程序
d. 文法的開始符 e. 句柄
6、對正規文法描述的語言,以下 有能力描述它。
a.0型文法 b.1型文法 c.上下文無關文法 d.右線性文法 e.左線性文法
解答 1、e、a、c 2、a、c、e 3、b、c、d 4、a、c 5、b、c 6、a、b、c、d、e
三、填空題
1、文法中的終結符和非終結符的交集是 。詞法分析器交給語法分析器的文法符號一定是 ,它一定只出現在產生式的 部。
2、最左推導是指每次都對句型中的 非終結符進行擴展。
3、在語法分析中,最常見的兩種方法一定是 分析法,另一是 分析法。
4、採用 語法分析時,必須消除文法的左遞歸。
5、 樹代表推導過程, 樹代表歸約過程。
6、自下而上分析法採用 、歸約、錯誤處理、 等四種操作。
7、Chomsky把文法分為 種類型,編譯器構造中採用 和 文法,它們分別產生 和 語言,並分別用 和 自動機識別所產生的語言。
解答 1、空集 終結符 右
2、最左
3、自上而上 自下而上
4、自上而上
5、語法 分析
6、移進 接受
7、4 2 型 3型 上下文無關語言 正規語言 下推自動機 有限
四、判斷題
1、文法 S→aS|bR|ε描述的語言是(a|bc)* ( )
R→cS
2、在自下而上的語法分析中,語法樹與分析樹一定相同。 ( )
3、二義文法不是上下文無關文法。 ( )
4、語法分析時必須先消除文法中的左遞歸。 ( )
5、規范歸約和規范推導是互逆的兩個過程。 ( )
6、一個文法所有句型的集合形成該文法所能接受的語言。 ( )
解答 1、對 2、錯 3、錯 4、錯 5、錯 6、錯
五、簡答題
1、句柄 2、素短語 3、語法樹 4、歸約 5、推導
[解答]
1、句柄:一個句型的最左直接短語稱為該句型的句柄。
2、素短語:至少含有一個終結符的素短語,並且除它自身之外不再含任何更小的素短語。
3、語法樹:滿足下面4個條件的樹稱之為文法G[S]的一棵語法樹。
①每一終結均有一標記,此標記為VN∪VT中的一個符號;
②樹的根結點以文法G[S]的開始符S標記;
③若一結點至少有一個直接後繼,則此結點上的標記為VN中的一個符號;
④若一個以A為標記的結點有K個直接後繼,且按從左至右的順序,這些結點的標記分別為X1,X2,…,XK,則A→X1,X2,…,XK,必然是G的一個產生式。
4、歸約:我們稱αγβ直接歸約出αAβ,僅當A→γ 是一個產生式,且α、β∈(VN∪VT)*。歸約過程就是從輸入串開始,反復用產生式右部的符號替換成產生式左部符號,直至文法開始符。
5、推導:我們稱αAβ直接推出αγβ,即αAβÞαγβ,僅當A→ γ 是一個產生式,且α、β∈(VN∪VT)*。如果α1Þα2Þ…Þαn,則我們稱這個序列是從α1至α2的一個推導。若存在一個從α1αn的推導,則稱α1可推導出αn。推導是歸約的逆過程。
六、問答題
1、給出上下文無關文法的定義。
[解答]
一個上下文無關文法G是一個四元式(VT,VN,S, P),其中:
●VT是一個非空有限集,它的每個元素稱為終結符號;
●VN是一個非空有限集,它的每個元素稱為非終結符號,VT∩VN=Φ;
●S是一個非終結符號,稱為開始符號;
●P是一個產生式集合(有限),每個產生式的形式是P→α,其中,P∈VN,
α∈(VT∪VN)*。開始符號S至少必須在某個產生式的左部出現一次。
2、文法G[S]:
S→aSPQ|abQ
QP→PQ
bP→bb
bQ→bc
cQ→cc
(1)它是Chomsky哪一型文法?
(2)它生成的語言是什麼?
[解答]
(1)由於產生式左部存在終結符號,且所有產生式左部符號的長度均小於等於產生式右部的符號長度,所以文法G[S]是Chomsky1型文法,即上下文有關文法。
(2)按產生式出現的順序規定優先順序由高到低(否則無法推出句子),我們可以得到:
SÞabQÞabc
SÞaSPQÞaabQPQÞaabPQQÞaabbQQÞaabbcQÞaabbcc
SÞaSPQÞaaSPQPQÞaaabQPQPQÞaaabPQQPQÞaaabPQPQQÞaaaPPQQQÞ
aaabbPqqqÞaaabbQQQÞaaabbbcQQÞaaabbbccQÞaaabbbccc
……
於是得到文法G[S]生成的語言L={anbncn|n≥1}
3、按指定類型,給出語言的文法。
L={aibj|j>i≥1}的上下文無關文法。
【解答】
(1)由L={aibj|j>i≥1}知,所求該語言對應的上下文無關文法首先應有S→aSb型產生式,以保證b的個數不少於a的個數;其次,還需有S→Sb或S→bS型的產生式,用以保證b的個數多於a的個數;也即所求上下文無關文法G[S]為:
G[S]:S→aSb|Sb|b
4、有文法G:S→aAcB|Bd
A→AaB|c
B→bScA|b
(1)試求句型aAaBcbbdcc和aAcbBdcc的句柄;
(2)寫出句子acabcbbdcc的最左推導過程。
【解答】(1)分別畫出對應兩句型的語法樹,如圖2-8-2所示
句柄:AaB Bd

圖2-8-2 語法樹
(2)句子acabcbbdcc的最左推導如下:
SÞaAcBÞaAaBcBÞacaBcBÞacabcBÞacabcbScAÞacabcbBdcA
ÞacabcbbdcAÞacabcbbdcc
5、對於文法G[S]:
S→(L)|aS|a L→L, S|S
(1)畫出句型(S,(a))的語法樹。(2)寫出上述句型的所有短語、直接短語、句柄和素短語。
【解答】
(1)句型(S,(a))的語法樹如圖2-8-3所示

(2)由圖2-8-3可知:
①短語:S、a、(a)、S,(a)、(S,(a));
②直接短語:a、S;
③句柄:S;
④素短語:素短語可由圖2-8-3中相鄰終結符之間的優先關系求得,即;

因此素短語為a。
6、考慮文法G[T]:
T→T*F|F
F→F↑P|P
P→(T)|i
證明T*P↑(T*F)是該文法的一個句型,並指出直接短語和句柄。
【解答】
首先構造T*P↑(T*F)的語法樹如圖2-8-4所示。

由圖2-8-4可知,T*P↑(T*F)是文法G[T]的一個句型。
直接短語有兩個,即P和T*F;句柄為P。

一、單項選擇題
1、詞法分析所依據的是 。
a. 語義規則 b. 構詞規則 c. 語法規則 d. 等價變換規則
2、詞法分析器的輸出結果是 。
a. 單詞的種別編碼 b. 單詞在符號表中的位置
c. 單詞的種別編碼和自身值 d. 單詞自身值
3、正規式M1和M2等價是指 。
a. M1和M2的狀態數相等 b. M1和M2的有向弧條數相等
c. M1和M2所識別的語言集相等 d. M1和M2狀態數和有向弧條數相等
4、狀態轉換圖(見圖3-6-1)接受的字集為 。

a. 以 0開頭的二進制數組成的集合 b. 以0結尾的二進制數組成的集合
c. 含奇數個0的二進制數組成的集合 d. 含偶數個0的二進制數組成的集合
5、詞法分析器作為獨立的階段使整個編譯程序結構更加簡潔、明確,因此, 。
a. 詞法分析器應作為獨立的一遍 b. 詞法分析器作為子程序較好
c. 詞法分析器分解為多個過程,由語法分析器選擇使用 d. 詞法分析器並不作為一個獨立的階段
解答 1、b 2、c 3、c 4、d 5、b
二、多項選擇題
1、在詞法分析中,能識別出 。
a. 基本字 b. 四元式 c. 運算符
d. 逆波蘭式 e. 常數
2、令∑={a,b},則∑上所有以b開頭,後跟若干個ab的字的全體對應的正規式為 。
a. b(ab)* b. b(ab)+ c.(ba)*b
d. (ba)+b e. b(a|b)
解答 1、a、c、e 2、a、b、d
三、填空題
1、確定有限自動機DFA是 的一個特例。
2、若二個正規式所表示的 相同,則認為二者是等價的。
3、一個字集是正規的,當且僅當它可由 所 。
解答 1、NFA 2、正規集 3、DFA(NFA)所識別
四、判斷題
1、一個有限狀態自動機中,有且僅有一個唯一終態。 ( )
2、設r和s分別是正規式,則有L(r|s)=L(r)|L(s)。 ( )
3、自動機M和M′的狀態數不同,則二者必不等價。 ( )
4、確定的自動機以及不確定的自動機都能正確地識別正規集。 ( )
5、對任意一個右線性文法G,都存在一個NFA M,滿足L(G)=L(M)。 ( )
6、對任意一個右線性文法G,都存在一個DFA M,滿足L(G)=L(M)。 ( )
7、對任何正規表達式e,都存在一個NFA M,滿足L(G)=L(e)。 ( )
8、對任何正規表達式e,都存在一個DFA M,滿足L(G)=L(e)。 ( )
解答 1 、2、3、錯 4、5、6、7、8、正確
五、基本題
1、設M=({x,y}, {a,b}, f,x,{y})為一非確定的有限自動機,其中f定義如下:
f(x,a)={x,y} f(x,b)={y}
f(y,a)=φ f(y,b)={x,y}
試構造相應的確定有限自動機M′。
解答:對照自動機的定義M=(S,Σ,f,S0,Z),由f的定義可知f(x,a)、f(y,b)均為多值函數,所以是一非確定有限自動機,先畫出NFA M相應的狀態圖,如圖3-6-2所示。

用子集法構造狀態轉換矩陣表3-6-3所示。
I Ia Ib
{x} {x,y} {y}
{y} — {x,y}
{x,y} {x,y} {x,y}
將轉換矩陣中的所有子集重新命名而形成表3-6-4所示的狀態轉換矩陣。
表3-6-4 狀態轉換矩陣
a b
0 2 1
1 — 2
2 2 2
即得到M′=({0,1,2}, {a,b}, f,0, {1,2}),其狀態轉換圖如圖3-6-5所示。

將圖3-6-5的DFA M′最小化。首先,將M′的狀態分成終態組{1,2}與非終態組{0};其次,考察{1,2}。由於{1,2}a={1,2}b={2}⊂{1,2},所以不再將其劃分了,也即整個劃分只有兩組{0},{1,2}:令狀態1代表{1,2},即把原來到達2的弧都導向1,並刪除狀態2。最後,得到如圖3-6-6所示化簡DFA M′。

2、對給定正規式b*(d|ad)(b|ab)+,構造其NFA M;
解答:首先用A+=AA*改造正規式得:b*(d|ad)(b|ab)(b|ab)*;其次,構造該正規式的NFA M,如圖3-6-7所示。

閱讀全文

與實現移進歸約分析的一種便利方法相關的資料

熱點內容
腦血管堵塞手腳無力用什麼方法治 瀏覽:532
貴州學習方法哪裡學 瀏覽:406
變壓器串連接方法 瀏覽:398
愛衛唾液試紙使用方法 瀏覽:621
魚鉤魚線魚竿的連接方法 瀏覽:242
一建各科內各種計算方法編制方法 瀏覽:574
葛藤蔓的種植方法 瀏覽:502
小米平板的照片在哪裡設置方法 瀏覽:689
毛囊增生怎麼治療方法 瀏覽:564
99999999用簡便方法計算 瀏覽:328
蔚來汽車倒車剎車異響解決方法 瀏覽:175
蝗蟲飛機的製作方法簡單 瀏覽:948
預防治療近視的方法 瀏覽:59
瓷磚下面潮濕用什麼方法快速干 瀏覽:85
腦部淋巴瘤治療方法 瀏覽:840
增加現金流凈額的方法有哪些 瀏覽:629
釣魚主線和竿的連接方法 瀏覽:365
蘭花茶的功效與作用及食用方法 瀏覽:589
綠蘿快速長瀑布方法 瀏覽:134
基金盯盤的方法和技巧 瀏覽:540