2008-09-18 46 views
11

我最近在Python中使用Ply編寫了一個解析器(這是yacc的python重新實現)。當我幾乎完成解析器時,我發現我需要解析的語法需要我在解析過程中查看一些信息以通知詞法分析器。如果不查看通知詞法分析器,我無法正確解析語言中的字符串。Parsec的Python實現?

鑑於我能從語法規則中控制詞法分析器的狀態,我想我會在解析器模塊中使用查找表來解決我的使用案例,但維護/測試可能會變得非常困難。所以我想知道其他一些選擇。

在Haskell我會使用Parsec,一個解析函數庫(稱爲組合器)。有沒有Parsec的Python實現?或者,也許還有一些其他生產質量庫充滿了解析功能,所以我可以在Python中構建一個上下文敏感的解析器?

編輯:我所有的上下文免費解析嘗試都失敗了。出於這個原因,我不希望ANTLR在這裏有用。

回答

3

如果一個LL解析器對你來說可以考慮,你可以考慮的一個選擇是給ANTLR一個嘗試,它也可以生成python(實際上它是LL(*),因爲它們的名稱,*表示數量它可以應付的前瞻)。

+1

在我的情況下,我需要的不僅僅是傳統的解析。出於理論上的原因,我所有編寫傳統上下文免費解析器的嘗試都已經落在他們的面前。在這一點上,我相當有信心,至少需要有條件的學習。 ANTLR仍然適用? – 2008-09-18 18:03:13

+0

你可以用ANTLR向前看,如果你需要的話,你可以在你的語法中添加語法和謂詞(語義謂詞也存在)。 使用antlrwork,它對設計/調試語法(http://www.antlr.org/works/index.html)非常有幫助。 ANTLR網站上也有現成的語法。 – 2008-09-19 13:39:04

1

有ANTLR,這是LL(*),PyParsing,這是更友好的對象,有點像DSL,然後有Parsing這就像OCaml的Menhir。

0

ANTLR非常棒,並具有跨多種語言工作的額外優勢。

4

PySec是另一個單子解析器,我也不是很瞭解,但它是值得看的here

7

我相信pyparsing是基於同樣的原則秒差距。

1

沒有什麼能阻止你使用PLY將分析器從「上下文釋放」路徑中轉移出來。您可以在解析過程中將信息傳遞給詞法分析器,並以此方式實現全面的靈活性。我很確定你可以用這種方式用PLY解析任何你想要的東西。

對於動手實例,consider - 它是一個解析器,用於使用PLY編寫的ANSI C語言。它通過在解析器中填充符號表來解決經典的C typedef標識符問題(這使得C的語法不具有上下文敏感性),該符號表在詞法分析器中用於將符號名稱解析爲任一類型或不是。