如何使用pyparsing构建一个简单的AST



例如,我会为一个非常简单的递归语法提取一个抽象语法树对于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。当为第一个func3(v2, v3)调用回调create_node时,我应该为func3创建具有子级v2v3等的节点,直到解析外部语句。哪种方式最好?谢谢

当您的示例代码让我感到困惑时,您是否尝试命名令牌,如下图所示,然后在解析结果中使用dump()

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

恐怕您将不得不修改此代码,但在某些方面。

最新更新