2008-08-29 78 views
16

我已經獲得了將一種語言翻譯成另一種語言的工作。使用正則表達式對於簡單的逐行方法來說,源代碼太靈活(複雜)。我可以在哪裏學習更多關於詞法分析和解析器的知識?解析,我在哪裏可以瞭解到它

回答

2

我最近一直在使用PLY這是一個在Python中執行lex和yacc。開始使用它很容易,文檔中有一些簡單的例子。

解析可以很快成爲一個非常技術性的話題,如果您使用像PLY這樣的解析器生成器,您可能不需要知道解析算法的所有細節。

8

嘗試ANLTR

ANTLR,另一個工具語言 識別,是一種語言工具, 提供了一個框架構建 識別,翻譯,編譯器, 和含在行動語法 描述翻譯一個 各種目標語言。

還有一個book

alt text

1

如果你更喜歡基於Java的工具,Java編譯器編譯,JavaCC的,是一個很好的解析器/掃描器。它是由配置文件驅動的,並且會生成可以包含在程序中的Java代碼。雖然我還沒有使用它幾年,所以我不知道當前版本是如何。你可以在這裏找到更多:https://javacc.dev.java.net/

11

如果你想得到關於這個問題的「情緒化」,拿起一份「The Dragon Book」。它是通常是這個文本在編譯器設計過程中。它肯定會滿足你的需求「瞭解更多關於詞法分析和解析器」以及其他一些好玩東西!

IMH(umble)O,保存自己的胳膊和/或腿和購買舊版 - 它會填補你的信息需求。

1

flex和野牛是新的lex和yacc。 BNF的語法經常被嘲笑爲有點愚蠢。出於這個原因,有些人已經搬到了ANTLR和Ragel。

如果您沒有做太多的翻譯,您可以使用Perl或Ruby使用多線正則表達式來進行一次性的翻譯。爲現有語言編寫兼容的BNF語法不是一件輕鬆的任務。

另一方面,如果任何給定語言的.l和.y文件以開源形式提供,則完全可以利用它。然後,您可以從現有的分析樹中構建新的代碼。

1

樂星/解析+類型檢測+代碼生成是一個偉大的CS練習,我會推薦給任何人想要一個堅實的基礎,所以我所有的龍書

1

要考慮的另一個教科書是Programming Language Pragmatics。我更喜歡龍書,但是YMMV。

如果您使用的是Perl,另一個需要考慮的工具是Parse::RecDescent

如果你只需要做一次這個翻譯並且對編譯器技術一無所知,那麼我建議你儘可能使用一些相當簡單的翻譯,然後手動修復它。是的,這是很多工作。但比學習複雜的主題和爲一份工作編寫正確的解決方案要少得多。也就是說,你還應該學習這個主題,但不要不知道它是完成當前項目的障礙。

1

我發現這個網站有幫助:

Lex and YACC primer/HOWTO

我第一次使用的lex/yacc的是一個相對簡單的項目。本教程是我真正需要的。當我後來接觸更復雜的項目時,我從本教程中學到的熟悉和一個簡單的項目讓我可以創造更有趣的作品。

1

經過(相當)一些編譯器類後,我使用了The Dragon BookC&T。我認爲C編譯器的構建可以消化得更好。不要把任何東西從龍書中拿走,但我認爲C是一本更實用的書。另外,如果您喜歡用Java編寫,我建議您使用JFlexBYACC/J來滿足您的興趣和分析需求。

2

很多人推薦書籍。對於許多這些在分配和到期日等等的結構化環境中更有用。即使不是這樣,以不同的方式呈現材料也可以大有幫助。 (a)你有沒有考慮去一所擁有體面的CS課程的學校? (b)有很多在線講座,如MIT's Open Courseware。他們的EE/CS section有很多涉及解析的課程,儘管我本身看不到任何解析。它通常被引入作爲語言分類和自動機是許多CS理論的核心的第一理論課程之一。

+0

+1爲mit的ocw,我一直使用它的數學。出於某種原因,按照我的計劃上課要比在六點半起牀要好得多。 – Shawn 2011-04-21 03:24:25

1

Parsing Techniques - A Practical Guide 作者:Dick Grune和Ceriel J.H. Jacobs

本書(以PDF形式免費提供)給出了不同解析技術/算法的廣泛概述。如果你真的想理解不同的解析算法,這個IMO比Dragon Book更好參考(因爲解析技術完全側重於解析,而Dragon Book解析只是作爲一個 - 雖然很重要)解析器構建過程的一部分) 。

+0

您的鏈接似乎被破壞 – Shawn 2011-04-22 02:28:10

相關問題