我有一個解釋型語言的自定義語法,我正在尋找一個解析器的建議,這將創建一個我可以查詢的樹。從結構上我希望能夠用解釋型語言生成代碼。我見過的大多數語法分析器都驗證已經存在的代碼。我的問題的第二部分是應該將語法抽象到Python代碼將代替實際代碼術語樹中的符號的程度?理想情況下,我希望能夠查詢根符號並返回所有符合該根的符號,並一直到達終端符號。使用Python的文法分析器和從樹構建文件
對這個過程或我的詞彙表的任何意見將是非常有用的。謝謝。
我有一個解釋型語言的自定義語法,我正在尋找一個解析器的建議,這將創建一個我可以查詢的樹。從結構上我希望能夠用解釋型語言生成代碼。我見過的大多數語法分析器都驗證已經存在的代碼。我的問題的第二部分是應該將語法抽象到Python代碼將代替實際代碼術語樹中的符號的程度?理想情況下,我希望能夠查詢根符號並返回所有符合該根的符號,並一直到達終端符號。使用Python的文法分析器和從樹構建文件
對這個過程或我的詞彙表的任何意見將是非常有用的。謝謝。
絕大多數解析器庫都會根據您生成的任何代碼創建抽象語法樹(AST)你可以使用任何東西,例如pyparsing。要從AST轉到代碼,您可能必須手動編寫函數才能完成此操作,但遞歸執行操作相當容易。例如:
def generate(ast):
if ast[0] == '+':
return generate(ast[1]) + " + " + generate(ast[2])
elif ast[0] == 'for':
return "for %s in %s:\n" % (ast[1], generate(ast[2])) + generate(ast[3])
...
假設的AST結構,這只是一個列表,其中第一個元素是節點名稱標籤,隨後是任何參數的樹:[+, 4, [*, 'x', 5]]
。當然,除非你自己編寫解析器,否則你應該使用解析器庫使用的任何東西。
我不明白你的意思是用Python代碼代替樹中的符號來獲得實際的代碼術語。
你可以寫一個簡單的函數來遍歷根節點下的所有符號:
def traverse_preorder(ast):
yield ast[0]
for arg in ast[1:]:
for x in traverse_preorder(arg):
yield x
關於第二個想法,變量名ast
是因爲AST模塊也許一個糟糕的選擇。
我會使用ANTLR。版本3(當前)支持generating Python code。它將在解析過程中自動生成抽象語法樹(AST),然後可以遍歷。其中一個重要部分是註釋你的語法,將令牌視爲子樹(例如操作符)。
謝謝,我現在對我應該如何解決這個問題有了更好的理解。 – daybreak 2012-02-01 21:31:29