我使用Bison生成解析器。我有一個轉換/減少衝突,我真的需要Bison使用GLR而不是LALR來處理它。但是我已經通過了%glr-parser
指令,源文件仍然聲明它是一個LALR解析器。我甚至發現了一個「glr.cc」框架,暗示它是一個GLR C++解析器,通過%skeleton "glr.cc"
使用它並不會改變輸出。 Bison是否不爲所有目標語言提供所有算法?C++帶Bison的GLR解析器
5
A
回答
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
相關問題
- 1. Bison,C++ GLR解析:如何強制轉移\減少衝突?
- 2. 如何在bison/yacc GLR解析器中獲得'expected token'?
- 3. GLR解析算法資源
- 4. 多個flex/bison解析器
- 5. 用bison解析bibtex
- 6. 使用flex和Bison的解析器
- 7. 解決模糊語法而不訴諸於GLR解析器
- 8. 如何找出C++ bison解析器中的意外標記?
- 9. 用Bison解析錯誤
- 10. Bison/Flex解析文件
- 11. 使用Bison解析樹
- 12. 是否生成C++ Bison解析器可重入?
- 13. 將Yacc/Bison解析器與C++程序連接起來
- 14. 如何使用Bison(Yacc)在C++中生成64位解析器?
- 15. Bison分析器計算器
- 16. 如何在GLR解析器中執行關聯性規則?
- 17. 解析Bison中的While循環
- 18. 解析大於Bison/Yacc的鏈
- 19. 帶SAX解析器的RSS
- 20. Xapian的履帶/解析器
- 21. 用flex + bison解析bibtex:重溫
- 22. 使用Bison從char *字符串解析
- 23. 在Windows中使用bison/flex生成解析器的命令?
- 24. 如何用flex/bison解析C字符串(char *)?
- 25. Bison/Flex教程使用C++,AST和可重複使用的詞法分析器和解析器
- 26. 創建一個不帶JSON解析器的解析器
- 27. 瞭解Bison/Jison
- 28. 如何在Yacc中打印解析器樹(BISON)
- 29. 如何在Bison解析器上返回多個標記?
- 30. LLVM JIT解析器用Bison/Antlr/Packrat/Elkhound編寫/
bison是免費軟件,所以你可以學習和改進它的soruce代碼。順便說一下,你是否考慮過使用另一個解析器生成器,比如ANTLR? – 2011-12-15 21:35:36
@Basile:我的語法不是LL。至於改善它的源代碼,你的意思是,如果我想通過六十億支持公用事業卡車。 – Puppy 2011-12-15 21:37:59