abstract-syntax-tree相关内容

从PLY yacc访问并打印AST

我正在使用PLY编译一种语言(C-减法),以构建词法分析器和解析器。在PLY文档中很清楚,构建AST完全由用户决定(https://www.dabeaz.com/ply/ply.html#ply_nn2): Yacc.py的输出通常是抽象语法树(AST)。但是,这完全由用户决定。 那么,在我的词法分析器和解析器正常工作的情况下,我如何构建一个AST阅读器(因为正如文档中所说,输出是一个AST, ..
发布时间:2022-06-18 21:26:54 Python

TypeScrip:如何根据数据结构生成和打印AST

我正在启动一个新项目,作为其接口的一部分,我们有一大堆“令牌”,这是一个带有字符串值的递归对象,如下所示: const colors = { accent: '#f90', primary: { active: '#fff', inactive: 'silver' } }; 我们提供了一个通过基于字符串的路径使用这些内容的实用程序(例如,在本例中,primar ..
发布时间:2022-06-18 21:19:48 其他开发

通过海象进行多个赋值:=运算符?

我曾尝试使用walrus运算符进行多个赋值,并在StackOverflow上看到了类似this的问题,它也无法使用walrus运算符为多个变量赋值,我只是想知道成功的多重赋值是什么样子,或者它是否不可能。 这样做的目的是添加对检测我的库mvdef(特别是在mvdef.src.ast_util模块中的find_assigned_args函数内)中所有分配的变量名的支持。 通过运行ast. ..
发布时间:2022-06-18 21:10:33 Python

返回不同数据类型的ANTLR AST访问器

我完成了ANTLR CST到AST的转换,并创建了一个特定的Visitor接口,该接口允许我访问所有的AST节点,但我遇到的主要问题是,一些访问应该返回不同的数据类型,我不确定如何处理这一问题。 例如,对于简单的算术运算,我希望从它们各自的访问方法返回一个双精度值;但其他字符串操作需要它们各自的节点返回一个字符串。 因为我的访问方法都需要泛型类型T,所以我尝试创建了一个名为Result的类和 ..
发布时间:2022-04-12 19:07:01 Java开发

Julia 中 Python 的 ast.literal_eval() 等价物是什么?

Julia 中有什么东西相当于 Python 的 literal_eval包提供的ast(抽象语法树)? 对其(literal_eval)描述的总结: 这个函数只计算 Python 文字结构:字符串,字节、数字、元组、列表、字典、集合、布尔值和 None,以及可用于安全地评估来自不受信任来源的字符串无需自己解析值.它没有能力评估任意复杂的表达式,例如涉及运算符或索引. 解决方案 ..
发布时间:2022-01-23 19:27:10 Python

如何用 Python 编写抽象语法树的访问者模式?

我的同事建议我编写一个访问者模式来导航 AST.谁能告诉我更多我将如何开始写它? 据我了解,AST 中的每个节点都会有 visit() 方法(?),它会以某种方式被调用(从哪里?).我的理解到此结束. 为了简化一切,假设我有节点 Root、Expression、Number、Op 并且树看起来像这样: 根|操作(+)/\/\号码(5)\操作(*)/\/\/\号码(2) 号码(444 ..

解析树和抽象语法树 (AST) 有什么区别?

它们是由编译过程的不同阶段生成的吗?还是它们只是同一事物的不同名称? 解决方案 这是基于Expression Evaluator Terrence Parr 的语法. 本例的语法: 语法 Expr002;选项{输出=AST;ASTLabelType=CommonTree;//$stat.tree ref 的类型等...}编:(统计)+;stat : expr NEWLINE ->表 ..

解析 .py 文件,读取 AST,修改它,然后写回修改后的源代码

我想以编程方式编辑 python 源代码.基本上我想读取 .py 文件,生成 AST,然后写回修改后的python源代码(即另一个.py文件). 有一些方法可以使用标准 python 模块来解析/编译 python 源代码,例如 ast 或 编译器.但是,我认为它们中的任何一个都不支持修改源代码的方式(例如删除此函数声明),然后将修改后的 python 源代码写回. 更新:我想这样做的 ..
发布时间:2022-01-16 23:57:15 Python

我可以对代码强制执行哪些类型的模式以使其更容易转换为另一种编程语言?

我正在着手做一个附带项目,其目标是将代码从一种编程语言翻译成另一种编程语言.我开始使用的语言是 PHP 和 Python(Python 到 PHP 应该更容易开始),但理想情况下,我可以(相对)轻松地添加其他语言.计划是: 这是面向 Web 开发的.原始代码和目标代码将位于框架之上(我也必须编写).这些框架将采用 MVC 设计模式并遵循严格的编码约定.这应该会使翻译更容易一些. 我也在 ..

用 ast 重写代码;Python

我正在学习 AST,它似乎是一个强大的东西,但我很困惑代码去了哪里以及为什么它消失了.说我要重写 example = """def fake(x):\ny = ['无用列表']\n返回 x""" 作为 example = """def fake(x):\n返回 x""" 我看不到任何以这种方式重写的方法.我什至找不到获取行文本的方法: In [1]: example = """def f ..
发布时间:2021-11-26 18:06:31 Python

如何使用 ast 列出函数的参数?

我正在使用 ast 模块来解析 Python 模块中的文档字符串,以将我们的文档转换为读取文档格式.我正在使用以下内容将函数名称和文档字符串放入我的其余代码可以很好地使用的字典列表中.我也在寻找一些东西来获取函数的参数: good_file = (file for file in os.listdir() if file[-3:] == '.py' and file != '__init__.p ..
发布时间:2021-11-26 18:06:20 Python

在 Eclipse JDT Java 解析器中,是否可以在不使用访问者的情况下逐节点遍历 AST?

通过 Eclipse JDT API 访问节点信息的标准方法是使用访问者模式.例如: unit.accept(new MyVisitorAdapter() {@Override 公共无效访问(MethodCallExpr 节点,对象参数){System.out.println("找到的方法调用:" + node.toString());}}, 空值); 在这种情况下,要访问节点,我需要指定我感 ..

如何以 JSON 格式表示 clang AST?

clang-check -ast-dump -ast-dump-filter=main.c 给出了特定代码的 AST(只是一个函数声明). 我们如何以 JSON 格式表示生成的 AST? PS:我只想要 AST 用于函数声明. 解决方案 使用 -ast-dump=json 参数调用 clang. 这是最近才实施的(2019 年 5 月),因此您需要最新版本的 Clang. ..
发布时间:2021-11-26 18:05:59 其他开发

在打字稿AST中获取变量声明类型的正确方法?

查看declarationEmitter,对于变量声明,它具有函数#emitVariableDeclaration,最终调用#writeTypeOfDeclaration.这段代码按照所说的去做——它需要一个变量声明并打印变量及其类型——这正是我想要做的. 问题是,当我复制此代码时,VariableDeclaration 节点没有符号属性……因此,类型始终为“任何".是否缺少初始化“符号"的 ..

使用 Eclipse JDT 查找特定节点内可见的所有标识符

我正在开发一个 Eclipse JDT 插件,它可以解析 Java 文件并为它们提供自动更正.我这样做是使用 Eclipse 的 API 来分析 AST. 我正在尝试编写一种计算环境的方法方法 - 方法范围内可见的所有标识符的列表.看待这一点的另一种方式是可以从 Eclipse 中的特定点自动完成的标识符列表. 例如: 导入...公共类 MyClass {私有静态最终 int a = ..
发布时间:2021-11-26 18:05:43 Java开发

获取函数的 AST

说我有一个函数: 函数hi()打印('嗨')结尾 我希望能够将这个函数作为参数并对其进行分析,例如列出其中的所有函数调用,查看它引用的所有变量等. 请注意,我不是在谈论分析源代码;我没有函数的源文本,我只有函数对象,即这是在运行时完成的. 我认为您会这样做的方法是获取函数的 AST.但我不知道该怎么做.那么,我将如何获取函数的 AST(或者如果有更好的方法则对其进行分析)? ..
发布时间:2021-11-26 18:05:33 其他开发

eclipse ASTNode 到源代码行号

eclipse中给定一个ASTNode,有什么办法可以得到对应的源代码行号吗? 解决方案 您可以使用下面的代码获取ASTNode的行号 int lineNumber = compilerUnit.getLineNumber(node.getStartPosition()) - 1; 可以使用以下代码从ASTParser获取编译单元 ASTParser parser = ASTPa ..
发布时间:2021-11-26 18:05:22 Java开发