获取python代码的解析树

时间:2016-05-04 03:33:47

标签: python parsing tree

我希望能够为python源代码生成一个解析树。此代码不必编译,例如。

if x == 5:

应该转换为某种树形式。我可以使用Python编译器包来创建树,但这仅适用于可编译的代码,例如

if x == 5: print True

2 个答案:

答案 0 :(得分:0)

您链接到的论文说使用了Python标准库中的ast模块。它还说他们在if语句的正文中使用了一个虚拟主体。使用易于识别为虚拟主体的语句,如pass或函数调用,如dummy()

答案 1 :(得分:0)

我们的DMS Software Reengineering Toolkit及其Python front end可以执行此操作。

DMS提供解析代码的基础结构,通过语言定义(例如,Python语法等)参数化并自动构建AST,以及检查/导航/更改这些AST的能力,以及对生成的修改树进行重新打印的能力

它的AST解析机器可以处理各种特殊情况:

  • 将文件或字符串(“stream”)解析为(Python)完整程序。 报告流中的语法错误,如果通过单个令牌插入或删除进行修复,则进行修复。
  • 根据任意语言非终结解析流。
  • 解析pattern,对应于已命名的语法非终结符,其中包含缺少子树的命名占位符。模式匹配结果可用于匹配具体的AST以决定是否匹配,如果匹配,则为模式变量提供绑定。
  • 解析有效的任意子字符串。这将返回一个树,其中可能缺少左或右子节点,这些子节点定义子字符串的左端和右端。

例如,OP可以编写以下模式来处理他的例子:

pattern if_x_is_5(s: statement):statement
  =  " if x==5: \s ";

DMS将读取该模式并构建相应的模式树。

OP引用的论文确实希望运算符和关键字在AST中保持为显式工件。解释这一点的一种方法是他们真的想要一个具体的语法树。 DMS实际上产生"AST"s which are concrete syntax trees with the constant terminals removed;这具有非常接近完美AST应该是什么的效果,但是可以容易地确定应该插入恒定终端的任何叶节点(或者可以配置DMS以简单地生成未压缩的CST)。

就个人而言,我看不出OP的兴趣论文的目标如何真正成功地提供有用的伪代码(尽管它的主张)。理解算法需要了解相应的数据结构以及应用于这些数据结构的抽象和具体算法。本文只关注 原始语言语法;没有任何理解更抽象的想法的暗示。