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

时间:2014-01-29 12:41:21

标签: python pyparsing

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

1 个答案:

答案 0 :(得分:1)

虽然您的示例代码引发了我,但是您是否尝试命名令牌,类似于下面所示,然后在解析结果上使用dump()

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

你不得不调整这个代码,我担心,但是在某些地方。