2012-11-27 16 views
0

因此,我已經分配了這個項目,並已經給它舊的大學嘗試,但我有點失去了如何去做。這個想法是你給出一個txt文件,形式文法:編程項目(課程項目)需要幫助。閱讀語法,輸出喬姆斯基

  • 五:S,A,B,C
  • T:A,B
  • S:小號
  • P :
  • 的S - > AAAA | aABBA
  • A - > AAAA | $
  • 乙 - > BB | BBC
  • ç - >乙

這些製作規則不會是唯一經過測試的,但這只是一個例子。

所以第一步是在程序中讀取。 下一步是刪除Lambda($)製作。 ,最後一步是刪除單位生產。

我是...我刪除lambda產品的方式不是我想的最好的方式。

下面是我如何做到這一點。

首先,使用getline讀入文件。 接下來使用一些循環來通過一個文件。

現在在一個數組中,我已經存儲了與lambda生產規則對應的非終端,所以請牢記這一點。

所以,要通過在每個生產每個字符而,檢查是否該字符是相同的一個表示拉姆達製作非端子的陣列中(不包括索引爲0,因爲這是在開始生產)

如果你找到一個匹配,標誌着該索引你在

所以說你的經歷S.

的S - >一個(沒有問題) 秒 - > AA(好一點的問題)

而不是寫A,不要。跳過它,然後用另一個循環,打印出的生產規則的其餘塊(即打印出來,直到你打吧) 所以我們得到 的S - > AAA

現在提請酒吧

S - > aaA | 現在將索引返回到此塊中的第一個字符,這裏是a。從那裏,通過你第一次碰到非終端的地方重寫字符。

的S - > AAA | AA

現在繼續循環通過尋找下一個非終端,這是一個拉姆達

的S - > AAA | AAAA(我們在這裏)

畫酒吧

的S - > AAA | aAa |

回到開始,繼續通過

S - > aaA | aAa | AAAA

繼續閱讀過的語法和outputing每個字符,重複此過程中得到

的S - > AAA | aAa | aAaA | aABB | aBBA | aABBA

在所有代碼的末尾,我有兩個循環檢查語法中的原始條(我用它替換它們),然後在最後輸出包含所有代碼的表單lambda產生的lambda產生

S - > aaA | aAa | aAaA | aa | aABB | aBBA | aABBA | aBB

我打算在這裏包括代碼,但要警告,......這很粗糙。這足夠粗糙,我實際上無法讓它在這裏的編碼塊下很好地下降,所以我要把它鏈接起來。

​​

我很欣賞你如何承擔這個項目的任何想法,或者如果我做得不對招搖。

該代碼目前拋出一些錯誤(我敢肯定是我讀某些空的字符的原因),但如果你忽略它們,它會吐出來安慰正確的事情......主要是。

欣賞任何幫助,感謝您花時間閱讀所有這些混亂。

+0

的鏈接代碼不工作(需要密碼),但不管怎麼說:你的問題是不是真正的代碼,是嗎?我建議刪除C++標籤。 – jogojapan

+0

啊,睾丸,一秒鐘。 是的,我們走了。修正了。 – neojb1989

+0

所以你想編寫一個程序來將語法轉換成[Chomsky Normal Form](http://en.wikipedia.org/wiki/Chomsky_normal_form)?那是對的嗎? –

回答

1

這裏的建築,我會建議:

  1. 定義語法metagrammar
  2. (語法制作你正在使用的語法)編寫一個簡單的標記生成器爲metagrammar
  3. 寫基於metagrammar的手寫遞歸裁剪解析器爲每個輸入文法生成分析和創建語法樹
  4. 根據CNF規則操作語法樹
  5. 從修改的語法樹生成輸出。

例元語法:

production: 
    nonterminal ':' alternatives 

alternatives: 
    alternative, 
    alternative ',' alternatives 

alternative: 
    symbols 

symbols: 
    symbol, 
    symbol symbols 

symbol: 
    terminal, 
    nonterminal, 
    '$' 

etc.. 
+0

什麼是metagrammar?這是我不知道的一個詞。 – neojb1989

+0

我使用metagrammar這個詞來從輸入語法的語法(因此是「meta」語法)中消除輸入語法的歧義。我會爲你做一個開始 –

+0

我很難抓住元事物,但謝謝。感謝你給我的開始。 – neojb1989