例如,我会为一个非常简单的递归语法提取一个抽象语法树 对于C函数调用语句。我已将语法定义为:
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
。当为第一个create_node
调用回调func3(v2, v3)
时,我应该为具有子func3
和v2
等的v3
创建节点,直到解析外部语句为止。哪种方式最好?谢谢
答案 0 :(得分:1)
虽然您的示例代码引发了我,但是您是否尝试命名令牌,类似于下面所示,然后在解析结果上使用dump()
?
...
func_call = (name + ...)('call')
func_args <<= (func_call | name)('func')
...
print(res.dump())
你不得不调整这个代码,我担心,但是在某些地方。