2010-08-17 63 views
4

我正在研究在Python之上實現的一個特定於領域的語言。語法和Python非常接近,直到現在我們只是進行了一些簡單的字符串轉換,然後將其輸入到ast。例如,縮進被替換爲#endfor/#endwhile/#endif語句,所以我們對縮進進行規範化,但它仍然是一個字符串。解析一個幾乎是Python的語言的最佳方式?

我想知道是否有更好的方法?據我所知,ast是硬編碼來解析Python語法,我真的找不到除http://docs.python.org/library/ast.html#module-ast(以及源自身,我想)以外的任何文檔。

有沒有人有PyParsing,ANTLR或PLY的個人經驗?

有些模糊的計劃將解釋器重寫爲將我們的語言轉換爲有效的Python並將其提供給Python解釋器本身的東西,所以我想要一些與compile兼容的東西,但這不是一個交易斷路器。

更新:它只是發生,我認爲

from __future__ import print_function, with_statement 

改變Python解析下列源的方式。但是,PEP 236表明這是編譯器功能的句法窗口修飾。有人可以確認試圖覆蓋/擴展__future__是不是我的問題的正確解決方案?

+1

「編譯器特性的句法窗口修飾」。這兩個'__future__'模塊實際上不是'模塊'。它看起來像一個'import'語法,但它修改了正在使用的Python編譯器。這不是一個合適的「進口」。這是魔法。 – 2010-08-17 19:16:58

回答

1

PLY的作品。這很奇怪,因爲它模仿lex/yacc的方式不是非常pythonic。

lex和yacc都有一個隱式接口,可以將lex的輸出作爲獨立程序運行。這個「功能」被仔細保存。類似於PLY的yacc-like特徵。小心保留了創建奇怪的,隱含的獨立主程序的「特徵」。

但是,PLY as lex/yacc兼容工具集相當不錯。你所有的lex/yacc技能都會保留下來。

[編輯評論。 「修復」Python的語法可能會浪費時間。幾乎每個人都可以正確縮進,沒有任何幫助。檢查C,Java,C++甚至是Pascal代碼,你會發現幾乎每個人都可以很好地縮進。事實上,人們竭盡全力在Java不需要的地方縮進Java。如果縮進在Java中不重要,爲什麼人們做得這麼好?]

+0

快速回復您的評論:您可能對縮進是正確的,但還有其他一些小小的偏差,其中許多更加合理,並且沒有意見與我的老闆爭論縮進,只要我們仍然需要預處理源以處理其他偏差。 – Wang 2010-08-17 18:19:28

+3

@Wang:任何時候你認爲你的問題都是通過DSL解決的,你有兩個**問題。發明一種新的編程語言似乎是個好主意。在你遇到問題之前,你有兩個級別的調試 - 你的新編程語言和你的底層框架/應用程序。祝你好運。 – 2010-08-17 19:14:19

相關問題