Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取python代码的解析树_Python_Parsing_Tree - Fatal编程技术网

获取python代码的解析树

获取python代码的解析树,python,parsing,tree,Python,Parsing,Tree,我希望能够为python源代码生成一个解析树。此代码不必是可编译的,例如 if x == 5: if x == 5: print True 应该变成某种树表示。我可以使用Python编译器包创建树,但这只适用于可编译的代码,例如 if x == 5: if x == 5: print True 您链接到的那篇文章说使用了Python标准库中的ast模块。它还说,他们使用了一个虚拟体作为if语句的主体。使用易于识别为伪体的语句,如pass,或使用函数调用,如dummy()我们的its可以做

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

if x == 5:
if x == 5: print True
应该变成某种树表示。我可以使用Python编译器包创建树,但这只适用于可编译的代码,例如

if x == 5:
if x == 5: print True

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

我们的its可以做到这一点

DMS提供了解析代码、通过语言定义(例如Python语法等)参数化和自动构建AST的基础设施,以及检查/导航/更改这些AST以及预打印修改后的树的能力

其AST解析机制可以处理各种特殊情况:

  • 将文件或字符串(“流”)解析为(Python)完整程序。 报告流中的语法错误,如果可以通过单令牌插入或删除进行修复,则进行修复
  • 根据非终结符的任意语言解析流
  • 解析,对应于命名语法非终结符,并为缺少的子树指定占位符。模式匹配结果可用于与具体的AST进行匹配,以确定匹配与否,如果匹配,则为模式变量提供绑定
  • 正在分析有效的任意子字符串。这将返回一个可能缺少左或右子级的树,这些子级定义了子字符串的左端和右端
例如,OP可以编写以下模式来处理他的示例:

pattern if_x_is_5(s: statement):statement
  =  " if x==5: \s ";
DMS将读取该模式并构建相应的模式树

OP引用的论文确实希望操作符和关键字在AST中保留为显式工件。一种解释方法是,他们真的需要一个具体的语法树。DMS实际生产;这具有非常接近完美AST应该是什么的效果,但是可以很容易地确定任何叶节点应该在哪里插入常量终端(或者可以配置DMS以简单地生成未压缩的CST)


就个人而言,我不明白OP感兴趣的论文的目标如何能够真正成功地提供有用的psuedo代码(尽管它声称)。理解算法需要理解相应的数据结构以及应用于这些数据结构的抽象和具体算法。本文只关注原始语言语法;没有任何迹象表明理解更抽象的思想

那部分代码的语法树是什么样子的?如何表示一棵有洞的树?如果没有其他办法,你可以用它来编写自己的解析器。我试图复制这篇NLP研究论文,它使用基于树的结构进行机器翻译。解析树的结构如第5页所示
如果x==5:
语法不完整,则无法使用内置ast。