问题标签 [program-transformation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何自动删除java代码中的方法
我需要在一个大型 java 项目中删除一些方法,我想知道是否有工具可以帮助我这样做。我基本上会指定一个签名和一个源文件夹,其中所有匹配的方法都将被删除。
不存在这样的东西,那么我将编写一个脚本。
c - 是否有命令行工具可以从 C 或 C++ 文件中提取 typedef、结构、枚举、变量、函数?
我想要一个命令行工具来从 C 或 C++ 源文件中提取定义或声明(typedef、结构、枚举、变量或函数)。替换现有定义/声明的方法也很方便(在通过用户提交的脚本转换提取的定义之后)。是否有这样的通用工具可用,或者是否有这种工具的合理近似?
编写脚本的能力和与用户创建的脚本或程序挂钩的能力在这里很重要,尽管我在学术上也对 GUI 程序感到好奇。Unix/Linux 阵营的开源解决方案是首选(尽管我也对 Windows 和 OS X 工具感到好奇)。主要语言兴趣是 C 和 C++,但更通用的解决方案会更好(我认为我们不需要超精确的解析功能来查找、提取和替换程序源文件中的定义)。
示例用例(额外 - 对于好奇的头脑):
- 给定这些类型的深度嵌套
struct
的 s 和变量(数组)初始化,假设需要通过添加或重新排序字段或以更易读的格式重写变量/数组定义来更改结构定义,而不会引入人工导致的错误。这将通过提取旧的初始化,然后使用脚本/程序编写新的初始化来替换旧的初始化来工作。 - 为了实现代码浏览工具 - 提取定义。
- 装饰性代码生成(例如记录函数条目/返回)。
- 脚本代码结构(例如,提取这个和那个东西并放在不同的地方而不做任何更改 - 版本控制提交注释可以记录执行此操作的命令,以使其明显且可验证,没有任何更改)。
替代问题:如果有一个工具可以告诉定义的位置(开始和结束行就足够了 - 我们甚至可以假设我们感兴趣的所有定义/声明都在它们自己的行中),那么它只是一个简单的练习编写程序的手指灵巧度
- 提取定义,
- 替换定义,甚至
提取定义,运行由命令行选项(或编辑器)指定的程序以
stdin
从(或从临时文件)接收所需的提取定义,- 执行转换(编辑),以及
- 将新定义输出到
stdout
(或将它们保存到给定的临时文件)
由正在执行的程序替换。
因此,主要的、更具挑战性的问题将是找到定义的开始和结束行。
关于标签的注意事项:code-generation
比本来更准确的标签,code-transformation
但它不存在。
optimization - 根据 Muchnick 的重新关联
我正在阅读 Muchnick 的“Advanced Compiler Design & Implementation”,其中图 12.6 列出了 20 条转换规则,如果按顺序应用,它们会进行常量折叠和重新关联以将常量移动到一起。规则(省略分布规则)是(我的语法:c
是文字,t
术语,带有空格的运算符在源中,而没有空格的运算符表示涉及文字的编译时计算):
他写道“以给定的顺序递归地应用树转换规则 [..]”,但我看不出它是如何工作的。鉴于((c1 + t1) + t2) + c2
,我将如何应用规则来获取(c1+c2 + t1) + t2
或类似的东西?
(我可以想出一套不同的规则,但我想了解书中的内容,以防我读错了)。
java - 使用 Antlr4 插入额外的代码行
目标是插入代码来监控Java同步块的进入和退出。
IE
我最初的想法是实现进入/退出侦听器方法(在 Java synchronizd 块周围添加子树),然后打印出结果 AST。现在我意识到 antlr4 似乎不支持树修改,我应该考虑哪些替代方案?
haskell - 完全懒惰的 lambda 提升的浮动通道?
我正在阅读实现函数式语言:教程,并在实现完全惰性 lambda 提升的浮动传递时遇到问题。
我想描述一下浮动是如何使这个问题变得清晰的,如果您熟悉它,请直接跳到下面的问题。
该概念在论文第 246 页介绍,主要在第 256-257 页实现。
在let(rec)
表达的情况下,它说:
我们必须将右侧的浮动定义放在
let(rec)
表达式本身之前,因为右侧可能取决于它们。
例如:
该变量$mfe
是一个最大自由表达式(MFE),由前一遍识别,在处理let f
表达式时,我们f
作为一组浮出并附加到[(1, [($mfe, a * a)])]
,这是从 的右侧获得的let f
。这里,第一个分量1
表示该组的空闲级别。
当回溯到\a -> f
抽象时,我们发现$mfe
和f
都受其约束,因此我们应该在这里安装它们:
问题
假设我们有一个这样的程序:
和的免费级别将是 2,因为有级别 2 并且它们在同一组中。b x
a y
y
虽然and的免费级别为3,因此and将被标记为 MFE(我在这里犯错了吗?)。cons p (b x)
cons q (a y)
b x
a y
使用 SPJ 给出的算法,程序将转化为:
我认为表达式右侧的 MFE 在引用左侧时let(rec)
不应逃脱范围,正确的结果可能如下所示:let(rec)
纸错了吗?或者我只是误解了它。
python - 使用 ast 模块在 Python 源代码中转换随机常数
我有兴趣编写一个程序,该程序使用 Python 的内置AST 模块来随机修改任意 Python 源中的常量。
这种转换可能涉及使用 AST 模块定义的操作遍历抽象语法树表示。该模块提供了两个选项:首先,ast.walk()返回对 AST 中所有节点的引用,但不提供任何上下文信息,因此无法重新组装树。其次,文档描述了涉及ast.NodeTransformer类的第二种方法:几个文档来源一般描述了如何使用 NodeTransformer。
但是,NodeTransformer 文档没有提到如何将条件替换随机应用于 AST。具体来说,我想修改此功能以创建一个函数,该函数在 ast 中选择一个随机节点,随机选择与该节点关联的常数,并将该常数替换为随机选择的相同类型的常数。
我怀疑我很难理解如何正确修改 NodeTransformer,因为我很少以面向对象的风格进行编程(通常遵循功能范式)。希望将我指向正确的方向会很容易对你们中的一个人来说。
java - 转换 java 源代码以将注释从 getter 移动到属性
我有大约 300 个 JPA 实体,其中的 getter 使用持久性注释进行注释。我想找到一种方法将所有此类注释移至属性并删除所有 getter 和 setter。我手动为这些课程中的大约 100 个进行了此操作,但这是非常耗时且令人麻木的工作。
我正在研究像Spoon这样的源代码转换工具,但仍然不确定它能否完成我需要它做的事情。
更具体地说,如何转换此代码:
对此:
multithreading - 我如何使用 MVars 在我的 pingpong haskell 游戏中移动球拍?
我已经有一个在haskell的乒乓球比赛中移动2个球拍的功能。我想改变,所以它现在使用 MVars。
我知道我需要将 wHeld、sHeld、downHeld 和 upHeld 更改为 MVar,但是关于如何更改 movePaddle 以处理 MVar 的任何想法?
此外,当我声明 wHeld 一个 MVars 时,它在派生节目时显示错误(非实例(显示 MVar Bool))
recursion - 避免 Prolog 中的双重递归调用
我有这个 Prolog 代码:
如何避免第二个(冗余)递归调用 f(T,S1)
,在第三个子句中,谓词的整体效果保持不变?
我知道这可以通过定义一个额外的谓词来完成。
如何定义这样的谓词?
optimization - 任何语言都可以“深度”组合或简化功能吗?
将两个或多个功能/方法组合在一起并作为一个整体工作是很常见的。举些例子:
但是,我想知道是否可以这样做:
函数被“深度”组合,类似于Matlab等数学软件中的表达式简化。
我知道编译器中有一些有用的技术,我正在寻找如何在高级语言中完成它。
顺便说一句,我想理论上可以使用 JVM 字节码操作,但这太复杂了。