2014-01-29 55 views
1

我會爲一個非常簡單的遞歸語法提取抽象語法樹,例如對於C函數調用語句爲 。我已經將語法定義爲:如何用pyparsing構建一個簡單的AST

name = Word(srange("[a-z]"), srange("[a-zA-Z0-9_]")) 

func_args = Forward() 
func_call = (name + "(" + func_args + ZeroOrMore(Word(",") + func_args) + ")").setParseAction(create_node) 
func_args <<= (func_call | name) 

res = func_call.parseString("func1(func2(v1,func3(v2,v3)))", True) 

解析是可以的,但我無法弄清楚創建AST的最佳方法。

我想在這個例子中的字符串這是什麼AST:

func1 
    - func2 
     - v1 
     - func3 
      - v2 
      - v3 

假設我有一個類tree。當爲第一個func3(v2, v3)調用回調create_node時,我應該創建節點func3與孩子v2v3等etc直到外語句被解析。這是最好的方法?謝謝

回答

1

雖然你的示例代碼拋出了我,你是否嘗試命名標記,類似如下所示,然後在解析結果上使用dump()

... 
func_call = (name + ...)('call') 
func_args <<= (func_call | name)('func') 
... 
print(res.dump()) 

你必須適應這個代碼恐怕,但沿着這些線的某處。