2011-06-17 104 views
5

我聽說「真正的編譯器編寫者」推出了他們自己的手工解析器,而不是使用解析器生成器。我也聽說解析器生成器不會爲真實世界的語言剪切它。據說,有很多特殊情況使用解析器生成器很難實現。我懷疑這一點:生產編譯器是否使用解析器生成器?

  1. 從理論上講,一個GLR分析器發電機應該能夠處理大多數編程語言設計(也許除了C++ ......)
  2. 我知道,使用至少一個生產語解析器生成器:Ruby [1]。
  3. 當我在學校上課時,我們使用了一個解析器生成器。

所以我的問題:使用解析器生成器編寫生產編譯器,還是使用編譯器社區認爲糟糕的設計決策的解析器生成器是否合理?

[1] https://github.com/ruby/ruby/blob/trunk/parse.y

+3

真正的程序員使用麪包板。 – Woot4Moo

+1

我以爲他們使用蝴蝶http://xkcd.com/378/ –

+0

@Fichman touche我的朋友 – Woot4Moo

回答

4

對於它的價值,使用GCC 4.0以前的我相信一個解析器生成器,然後切換到寫遞歸下降解析器的手,因爲它更容易維護和擴展。

解析器生成器爲真正的語言「剪切」它,但將您的語法轉換爲可行的語言的工作量呈指數增長。

編輯:鏈接到海灣合作委員會文件,詳細說明原因和收益與成本分析的變化:http://gcc.gnu.org/wiki/New_C_Parser

+1

我特別喜歡他們的「錯誤恢復可能進入無限循環」評論... – Blindy

0

有時使用兩種方法的組合,例如使用解析器生成代碼,以及稍後修改該「代碼」。

其他方式是,某些掃描器(詞法分析器)和分析器工具允許它們添加自定義代碼,除了語法規則外,稱爲「語義操作」。這種情況的一個很好的例子是,解析器檢測通用標識符和一些自定義代碼,將某些特定標識符轉換爲關鍵字。

編輯: 添加

1

我在一家公司工作了幾年,我們或多或少編寫編譯「語義動作」。我們並不關心表現,只是減少工作/維護的數量。我們使用了生成的解析器+手寫代碼的組合來實現這一點。理想的平衡是使用解析器生成器自動化簡單,重複的部分,然後解決定製函數中的難題。

相關問題