2009-06-27 81 views
9

自1999年以來,我一直在爲編程和樂趣進行編程。我想學習新東西,最近我一直專注於解析,因爲我工作的很大一部分是閱讀,整合和分析數據。如果開銷足夠低,我認爲我可以用非常簡單的特定於領域的語言表達大量的重複性任務。我對這個問題有幾個問題。瞭解關於解析的更多信息

  1. 我目前的大部分解析代碼都沒有定義正式的語法。我通常用我的選擇語言來破解一些東西,因爲這很容易,我知道該怎麼做,而且我可以非常快地編寫代碼。對於我一起工作的其他人來說也很容易維護。與大多數程序員用來編寫解析器的黑客相比,定義語法和生成真正的解析器(正如ANTLRYACC所做的那樣)來解析事情有什麼優點和缺點?
  2. 在C++,Perl和Ruby中編寫基於語法的解析器的最佳解析器生成工具是什麼?我已經看過ANTLR,並沒有找到太多有關使用ANTLRv3與C++目標,但否則看起來很有趣。與ANTLR類似,我應該閱讀的其他工具是什麼?
  3. 有人想了解更多關於解析的標準書籍和文章是什麼?不幸的是編譯器課程並不屬於我的教育範疇,因此非常歡迎基礎材料。我聽說過關於Dragon Book的很棒的事情,但還有什麼呢?

回答

4

在1,我要說的主要優點是可維護性 - 做一個變化不大的語言只是意味着作出相應小變化的語法,而不是通過微小的代碼中的各個景點黑客這可能與你想要改變的東西有關......數量級提高了生產力,減少了錯誤風險。

在2.和3.上,我不能提出超出你已經找到的東西(我主要使用Python和pyparsing,並且可以從許多以Python爲中心的解析框架的經驗發表評論,但對於C++,我大多使用良好無論如何,我的舊版yaccbison,以及我的龍書的舊版粗體 - 實際上並非最新版本 - 就是我爲了這個目的而保留在我的身邊......)。

2

Let's Build A Compiler是如何編寫簡單編譯器的分步教程。代碼是用Delphi(Pascal)編寫的,但它的基本功能足以輕鬆翻譯成大多數其他語言。

+0

有趣的是,實際上我會推薦完全相同的東西,但不記得它叫什麼。 +1 – 2009-06-27 20:40:37

1

在perl中,Parse :: RecDescent模塊是第一個開始的地方。向模塊名稱添加教程,Google應該能夠找到大量教程來幫助您入門。

4

以下是一張你的(非常好)的問題:

  1. 我覺得一個解析器受益最大從那裏語法實際存在的不平凡的情況。您必須瞭解解析器和語法如何工作才能想到這種技術,而不是每個開發人員都這麼做。
  2. lex/yacc是較舊的Unix工具,可能作爲C++開發人員使用。也許是野牛。
  3. ANTRL及其附帶的書非常好。 "Writing Compilers and Interpreters"有您可能喜歡的C++示例。

GoF Interpreter模式是編寫「小語言」的另一種技巧。看看那個。

1

使用BNF,EBNF或類似的方法定義語法更簡單,稍後您可以更好地維護它。另外,你可以找到很多語法定義的例子。最後但並非最不重要的一點是,如果您要在場上向其他人講述您的語法,最好是您講的語言相同(BNF,EBNF等)。

編寫您自己的解析代碼就像重新發明輪子並容易出錯。它也不易維護。當然,它可以更靈活,對於小型項目也可能是一個不錯的選擇,但是使用現有的解析器生成器需要語法並且吐出代碼應該覆蓋我們的大部分需求。

對於C++我也會建議lex/yacc。對於Ruby來說,這看起來像是一個不錯的選擇:Coco/R(uby)

1

有趣的時機:我花了很多時間想知道狀態機和解析器,並試圖弄清楚我如何能更多地瞭解它們。

對於2,你可以看看Ragel(這對C++和Ruby來說很好)。

+0

我忘記提到昨天晚上在機器上工作以閱讀你的想法。 :)感謝Ragel的建議,我一定會看看它! – 2009-06-27 21:33:00

2

我會仔細看看Haskell中基於monadic combinator的解析(通常也會涉及詞法分析)。我發現它相當令人大開眼界;使用這種方法可以輕鬆地從頭開始構建解析器,這是多麼令人驚奇。實際上,編寫自己的解析器通常比嘗試使用現有的庫更快。

最有名的例子可能是Parsec,它有一個很好的user guide,解釋如何使用它。這個庫的端口列表是Parsec page of the Haskell wiki上列出的其他語言(包括C++Ruby)的端口列表,雖然我不熟悉它們,所以我不能說它們在Haskell中使用Parsec有多接近。

如果您想了解這些內部工作方式以及如何編寫自己的內容,我建議您從Graham Hutton的Programming in Haskell的第8章開始(「功能解析器」)。一旦你理解了這個章節(可能需要幾個讀數),你將被設置。

1

這裏有一個自包含的教程,完全可移植的編譯器編譯 可用於設計和實施「低開銷」 DSL的速度非常快(10頁!):

http://www.bayfronttechnologies.com/mc_tutorial.html

這網站引導您通過Val Schorre 1964年關於MetaII的論文。 是的,1964年,而且太棒了。這是我從1970年開始學習編譯器 的原因。