2012-10-27 39 views
5

我的目標是寫,將採取的邏輯表達式的函數(例如:A OR NOT(B和C)),並轉換到這一點析取範式。 (A OR NOT B或NOT C)書寫解析器,需要一個語法並生成解析樹

我已經寫了語法,將產生邏輯表達式

S => !S 
S => (S) 
S => S op S 
S => W 
op => AND | OR 
W => A | B | C | ... | Z 

這是我的算法

  1. 給定一個表達式S
  2. 遞歸解析使用上述的語法,並建立對應的解析樹
  3. 通過遞歸轉換表達式來DNF「簡化」任何在NOT運算表達樹。
  4. 遞歸經過最終分析樹和輸出的DNF邏輯表達式。

對於一個分析樹,我可以通過檢查當前節點的父節點,並將它向下推向樹或重新排列樹(在NOT NOT的情況下)來簡化NOT運算符。然後平坦化樹是微不足道的。

這紙上作品,但現在我堅持與實際解析器。我如何將這些規則轉換爲解析器類?我不想使用外部庫,並且想從頭開始編寫解析器。

+0

如果你不想使用外部工具,我推薦這本書 - 編譯器構建的「聖經」:http://www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/0201100886 – Casper

+0

另外這是一個偉大的系列:http://www.rubyinside.com/writing-a-compiler-in-ruby-1222.html – Casper

+0

和:http://stackoverflow.com/questions/1669/learning-to-write -a-compiler – Casper

回答

1

看一看樹頂,這可能會做你想做的。 http://treetop.rubyforge.org/

+1

[citrus](https://github.com/mjijackson/citrus)是該家族的另一成員。如果需要遞歸下降,它們都不會起作用,但是可以將語法按照適當的形式呈現給寶石。 – x1a4