我想以编程方式编辑python源代码.基本上我想读取一个.py文件,生成AST,然后写回修改过的python源代码(即另一个.py文件).
有一些方法可以使用标准的python模块解析/编译python源代码,例如ast或compiler.但是,我不认为它们中的任何一个都支持修改源代码的方法(例如删除此函数声明),然后回写修改python源代码.
更新:我想这样做的原因是我想为python 编写一个Mutation测试库,主要是通过删除语句/表达式,重新运行测试和查看什么中断.
我有一些代码的情况,eval()作为一种可能的解决方案.现在我从来没有使用eval()过,但是,我已经发现了很多关于它可能造成的潜在危险的信息.也就是说,我对使用它非常谨慎.
我的情况是我有一个用户给出的输入:
datamap = raw_input('Provide some data here: ')
Run Code Online (Sandbox Code Playgroud)
哪里datamap需要是字典.我四处搜索,发现eval()可以解决这个问题.我认为在尝试使用数据之前我可以检查输入的类型,这将是一个可行的安全预防措施.
datamap = eval(raw_input('Provide some data here: ')
if not isinstance(datamap, dict):
return
Run Code Online (Sandbox Code Playgroud)
我仔细阅读了文档,但我仍然不清楚这是否安全.eval在输入或datamap调用变量后立即评估数据吗?
该ast模块是.literal_eval()唯一安全的选择吗?
我打算做一个侧面项目,其目标是将代码从一种编程语言转换为另一种编程语言.我开始使用的语言是PHP和Python(Python到PHP应该更容易开始),但理想情况下我可以添加其他语言(相对)轻松.计划是:
这是面向Web开发的.原始代码和目标代码将位于框架之上(我也必须编写).这些框架将采用MVC设计模式并遵循严格的编码约定.这应该使翻译更容易一些.
我也在研究IOC和依赖注入,因为它们可能使翻译过程更容易,更不容易出错.
我将使用Python的解析器模块,它让我摆弄抽象语法树.显然,我可以用PHP获得的最接近的是token_get_all(),这是一个开始.
从那时起,我可以构建AST,符号表和控制流程.
然后我相信我可以开始输出代码了.我不需要完美的翻译.我仍然需要检查生成的代码并修复问题.理想情况下,翻译人员应标记有问题的翻译.
在你问"这到底是什么意思?"之前 答案是......这将是一次有趣的学习经历.如果您对如何减少这种麻烦有任何见解,请告诉我.
我更感兴趣的是知道我可以在代码上强制执行哪种模式,以便更容易翻译(即:IoC,SOA?)代码而不是如何进行翻译.
php python compiler-construction coding-style abstract-syntax-tree
它们是由编译过程的不同阶段产生的吗?或者它们只是同一个东西的不同名称?
compiler-construction compiler-theory terminology abstract-syntax-tree parse-tree
我一直在阅读有关解释器/编译器如何工作的一些内容,而我感到困惑的一个领域是AST和CST之间的区别.我的理解是解析器生成一个CST,将它交给语义分析器,将其转换为AST.但是,我的理解是语义分析器只是确保遵循规则.我真的不明白为什么它会实际做出任何改变,使其变得抽象而不是具体.
有没有关于语义分析器的东西,或者AST和CST之间的差异有点人为?
parsing terminology abstract-syntax-tree semantic-analysis concrete-syntax-tree
我对AST是什么有一个大概,但我想知道如何构建一个.
如果给你一个语法和一个解析树,你如何构建AST?
如果给你一个语法和表达,你怎么做?
我一直在寻找很多关于这一点,我找不到任何有用的,真正帮助我建立一个AST.我已经知道ANTLR4不像以前的ANTLR3那样构建AST.每个人都说:"嘿,使用访客!",但我找不到任何示例或更详细的解释如何我这样做...
我的语法必须像C一样,但每个命令都用葡萄牙语(portuga编程语言)编写.我可以使用ANTLR4轻松生成解析树.我的问题是:现在我需要做些什么才能创建AST?
顺便说一下,我正在使用Java和IntelliJ ......
EDIT1:我能得到的最接近的是使用本主题的答案:是否有一个使用antlr4从java源代码创建AST并提取方法,变量和注释的简单示例? 但它只打印访问过的方法的名称..
由于第一次尝试对我不起作用,我试图使用ANTLR3中的这个教程,但我无法弄清楚如何使用StringTamplate而不是ST ...
阅读本书The Definitive ANTLR 4 Reference我也找不到任何与AST有关的内容.
EDIT2:现在我有一个类来创建DOT文件,我只需要弄清楚如何正确使用访问者
java compiler-construction antlr abstract-syntax-tree antlr4
抽象语法树..我总是听说在Github上编译为SpiderMonkey AST.
那么,这是JS语法树的实际标准吗?还有V8,是V8使用相同类型的AST吗?
我该怎么玩?
我在编译器设计书中找到了这两个术语,我想知道每个术语代表什么,以及它们是如何不同的.
我在互联网上搜索,发现解析树也称为具体语法树(CST).
有没有人有一个简单的例子,使用ast.NodeVisitor来在Python 2.6中使用抽象语法树?访问和generic_visit之间的区别我不清楚,我找不到任何使用谷歌codesearch或普通谷歌的例子.
python ×4
parse-tree ×2
terminology ×2
antlr ×1
antlr4 ×1
coding-style ×1
eval ×1
java ×1
javascript ×1
parsing ×1
php ×1
python-2.6 ×1