2017-05-30 122 views
0

我似乎無法找到等價的LR語法:找到相同數量的「a」和「b」語法的等價LR語法?

S→aSbS | bSaS | ε

其中我認爲識別字符串與'b'相同的數字比'b'。

這將是一個解決方法?是否有可能找到和LR語法呢?

在此先感謝!

編輯:

我發現什麼,我認爲是等效的語法,但我一直沒能證明這一點。

我想我需要證明原語法生成上面的語言,然後證明語言是爲以下等價語法生成的。但我不知道該怎麼做。我應該怎麼做?

S→aBS | bAS | ε

B→b | aBB

A→a | BAA

在此先感謝...

PS:我已經證明,這種新的語法是LL(1),SLR(1),LR(1)和LALR(1)。

+0

也許你可以改進你的語法? 有一點上下文會有所幫助。 –

+0

@CalvinTaylor,我編輯了我的問題!加入我認爲是相同的語法,但是我想到了一個問題。我如何證明它們都是等價的? –

回答

1

除非語法,直接關係到另一個語法 - 通過標準的轉換,如標準化,零生產消除,等等 - 例如證實兩個文法derivee同樣的語言是非常困難不知道什麼語言是。通常更容易證明(獨立地)每個語法都來自語言。

第一語法您提供:

S → aSbS | bSaS | ε 

確實在事實上獲得的所有字符串的語言在字母表{a, b}*其中一個的個數爲相同的b S上的號碼。我們可以分兩部分來證明:首先,語法所識別的每個句子都具有該屬性,其次,具有該屬性的每個句子都可以由該語法派生。兩種證明都是通過歸納進行的。

對於前向證明,我們通過對派生數進行歸納。假設我們有一些推導S → α → β → … → ω,其中所有的希臘字母代表非終端和終端的序列。

如果微分的長度正好是零,使得它開始與S結尾,則有在任何派生句子沒有端子,以便其清楚,每一個導出的句子具有相同數量的一個 S和b s。 (基礎步驟)

現在爲感應步驟。假設每個長度爲i的派生已知以衍生句子結束,該衍生句子具有相同數量的a s和b s。我們想從這個前提證明,每個長度爲i+1的派生結尾的句子的句號與a s和b s相同。但是,這也很清楚:三種可能的生產步驟中的每一種都保持了平價。

現在,讓我們來看看相反的方向:與相同數量的一個 S和b S能夠從該語法派生的每一句話。我們將通過字符串長度的歸納來完成此操作。我們歸納前提將是,如果它是一個爲每個j ≤ i,與正好j一個 S和jb小號的每一句話都有從S推導,然後用準確i+1一個 S和i+1每一句話的情況下b s。 (這裏我們只考慮只包含終端的句子。)

考慮這樣一個句子。它可以從ab開始。假設它與一個開始:然後至少有一個b在句子中,使得與該b結束前綴具有相同數目的每個終端。 (把這個字符串想象成一個方形網格:每個a向上向右移動一個單位,並且每個對角向下向右移動,因爲端點的高度與起點完全相同,並且有沒有蟲洞在圖中,一旦我們提升我們必須遲早下降回到起始高度,這是結束b的前綴。)這樣的前綴的內部(以外的所有一個在開始和最後的b)是平衡的,正如字符串的其餘部分一樣。這兩者都較短,所以通過歸納假設,它們可以從S得出。使這些替代,我們得到一個小號b小號,這可以從S導出。相同的參數適用於以b開頭的字符串。再次,基礎步驟是微不足道的。

所以這基本上是你需要適應你的語法的證明程序。

祝你好運。


順便說一句,這類問題也可以在cs.stackexchange.com或math.stackexchange.com構成,其中MathJax可用。 MathJax使得寫出數學證明更加乏味,所以你可能會發現你會在那裏得到更多可讀的答案。

+0

我明白了,所以如果兩種語法都產生這種語言,而且這種語言是由兩種語法產生的,那麼語法是等同的?謝謝你的回答,這確實讓我很清楚。 PS:關於答案的結尾,我不知道MathJax沒有在stackoverflow中可用,我有點想知道爲什麼它沒有正確渲染。稍後會詢問我是否需要。 –

+0

我想這取決於你說什麼時你說的兩個語法是「等價的」,但通常我們的意思是他們派生完全相同的語言。對於實際的解析,兩個語法可以派生出相同的語言,但會產生不同的分析樹,如果語法描述的是編程語言,這很重要。 (考慮兩個表達式語法,其中一個實現了運算符優先級,另一個只處理所有運算符。)但是,這個(非)等價關係處於不同的話語領域。 – rici