2011-12-15 69 views
5

我使用Bison生成解析器。我有一個轉換/減少衝突,我真的需要Bison使用GLR而不是LALR來處理它。但是我已經通過了%glr-parser指令,源文件仍然聲明它是一個LALR解析器。我甚至發現了一個「glr.cc」框架,暗示它是一個GLR C++解析器,通過%skeleton "glr.cc"使用它並不會改變輸出。 Bison是否不爲所有目標語言提供所有算法?C++帶Bison的GLR解析器

+0

bison是免費軟件,所以你可以學習和改進它的soruce代碼。順便說一下,你是否考慮過使用另一個解析器生成器,比如ANTLR? – 2011-12-15 21:35:36

+1

@Basile:我的語法不是LL。至於改善它的源代碼,你的意思是,如果我想通過六十億支持公用事業卡車。 – Puppy 2011-12-15 21:37:59

回答

1

您只需要%glr-parser即可獲得GLR解析器。請注意,GLR解析器可能仍然存在衝突(shift/reduce或reduce/reduce),只是生成的解析器會嘗試兩種選擇並統一結果。

如果您想關閉有關衝突的消息,可以使用%expect%expect-rr。但是,只是盲目地使用GLR解析器,如果你不明白所有衝突是什麼都很危險 - 如果不小心,解析器可能會花費指數級的時間來解析某些輸入,或者可能會在運行時給出模糊錯誤。

1

我不知道你的意思是「%skeleton "glr.cc"沒有改變輸出」,因爲它的確如此!你確定你真的重新產生了輸出嗎?如果你這樣做,請提供更多細節。

$ echo "%% exp: '0'" > /tmp/f.y 
$ bison -S lalr1.cc /tmp/f.y -o f1.cc 
$ bison -S glr.cc /tmp/f.y -o f2.cc 
$ ls -l f1.cc f2.cc 
-rw-r--r-- 1 akim wheel 28373 30 oct 09:29 f1.cc 
-rw-r--r-- 1 akim wheel 82767 30 oct 09:29 f2.cc