我希望能够为python源代码生成一个解析树。此代码不必编译,例如。
if x == 5:
应该转换为某种树形式。我可以使用Python编译器包来创建树,但这仅适用于可编译的代码,例如
if x == 5: print True
答案 0 :(得分:0)
您链接到的论文说使用了Python标准库中的ast
模块。它还说他们在if
语句的正文中使用了一个虚拟主体。使用易于识别为虚拟主体的语句,如pass
或函数调用,如dummy()
。
答案 1 :(得分:0)
我们的DMS Software Reengineering Toolkit及其Python front end可以执行此操作。
DMS提供解析代码的基础结构,通过语言定义(例如,Python语法等)参数化并自动构建AST,以及检查/导航/更改这些AST的能力,以及对生成的修改树进行重新打印的能力
它的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的兴趣论文的目标如何真正成功地提供有用的伪代码(尽管它的主张)。理解算法需要了解相应的数据结构以及应用于这些数据结构的抽象和具体算法。本文只关注 原始语言语法;没有任何理解更抽象的想法的暗示。