2008-08-31 64 views
50

人們可以用Python指向我的資源嗎?在python中進行lexin,令牌化和解析的資源

我在開源項目(hotwire)上做了一點小小的修改,並且想要對lexes,parses and tokenises這些命令輸入的代碼進行一些修改。因爲它是真正的工作代碼,所以它相當複雜並且難以制定。

我之前沒有研究過lex/parse/tokenise的代碼,所以我想一種方法是在這方面學習一兩個教程。我希望能夠學習到足以瀏覽我實際想要改變的代碼。有什麼合適的嗎? (理想情況下,它可以在一個下午完成,而無需先購買並閱讀龍書...)

編輯:(2008年10月7日)下面的答案都沒有給我想要的東西。有了它們,我可以從頭開始生成解析器,但我想學習如何從頭開始編寫我自己的基本解析器,而不是使用lex和yacc或類似的工具。做完這些之後,我可以更好地理解現有的代碼。

那麼有人可以指向一個教程,我可以從頭開始構建一個基本的解析器,只需使用python?

回答

4

看一看標準模塊shlex並修改它的一個副本,以配合您使用您的shell的語法,這是一個很好的起點

如果你想爲詞法的完整解決方案的所有功能/解析,ANTLR也可以生成python。

3

我建議http://www.canonware.com/Parsing/,因爲它是純粹的Python,你不需要學習語法,但它沒有被廣泛使用,並且文檔相對較少。重量級是ANTLR和PyParsing。 ANTLR也可以生成Java和C++解析器,而AST漫步者則需要了解新語言的含義。

28

我是PLY的快樂用戶。它是Lex & Yacc的純Python實現,它具有許多小巧的細節,使其非常容易使用。由於Lex的& Yacc是最受歡迎的lexing &解析工具,並且用於大多數項目,PLY的優勢在於站在巨人的肩上。 Lex & Yacc在線上存在大量知識,您可以將其自由應用於PLY。

PLY也有一個很好的documentation page與一些簡單的例子,讓你開始。

有關很多Python解析工具的列表,請參閱this

+0

我第二次推薦PLY,很棒。 – mipadi 2008-11-11 01:46:09

4

pygments是用python編寫的源代碼語法高亮器。它有詞法分析器和格式化程序,並且可能很有興趣查看源代碼。

15

對於中等複雜的文法,PyParsing是輝煌的。您可以直接在Python代碼定義語法,不需要代碼生成:

>>> from pyparsing import Word, alphas 
>>> greet = Word(alphas) + "," + Word(alphas) + "!" # <-- grammar defined here 
>>> hello = "Hello, World!" 
>>>> print hello, "->", greet.parseString(hello) 
Hello, World! -> ['Hello', ',', 'World', '!'] 

(從PyParsing主頁採取的例子)。

通過解析動作(觸發特定語法規則時調用的函數),可以將解析直接轉換爲抽象語法樹或任何其他表示形式。

有許多幫助函數封裝循環模式,如操作符層次結構,帶引號的字符串,嵌套或C風格的註釋。

+3

對於它的價值,我一直在PyParsing遇到麻煩。我嘗試過使用它幾次,從來沒有完全滿意的結果(例如,它花了很長時間,很難調試,需要更多的代碼,然後我期望等)。我不能說這是由於我的無知還是PyParsing的失敗,儘管... – 2010-09-10 17:45:45

4

這裏有讓你開始的幾件事(大致從最簡單到最複雜,最到最強大的):

http://en.wikipedia.org/wiki/Recursive_descent_parser

http://en.wikipedia.org/wiki/Top-down_parsing

http://en.wikipedia.org/wiki/LL_parser

http://effbot.org/zone/simple-top-down-parsing.htm

http://en.wikipedia.org/wiki/Bottom-up_parsing

http://en.wikipedia.org/wiki/LR_parser

http://en.wikipedia.org/wiki/GLR_parser

當我知道這個東西,它是在一個學期之久的400級的大學課程。我們在手動解析的過程中完成了一些任務;如果你想真正理解發生了什麼,我會推薦相同的方法。

這不是我用過的書,但很不錯:Principles of Compiler Design

希望這足夠讓你開始:)

+5

這是如何幫助某人知道所有的東西,但在python中尋找實現? – Alex 2013-03-25 11:00:45

17

這個問題是很老,但也許我的回答能幫助別人誰願意學習的基礎知識。我覺得這個資源非常好。這是一個用python編寫的簡單解釋器,不需要使用任何外部庫。因此,這將幫助任何人想了解解析,記載和tokenising的內部工作誰:

「一個簡單的Intepreter從無到有的Python:」 Part 1Part 2Part 3Part 4

+4

非常好的一系列文章,關注目標而不是工具! – Janus 2013-09-24 10:21:48