我正在开展一个研究项目,自动修改代码以包含高级数学概念(例如将随机效应添加到循环中或使用添加更高级物理模型的新函数封装现有函数)。
我向社区提出的问题是:有什么好的工具可以直接操作源代码吗?我想做这样的事情
- 交换函数
- 在需要的地方添加变量声明
- 确定函数是否与任意值相乘
- 确定在一行代码上调用哪些函数
- 查看传递给函数的参数并将其替换为替代参数
- 在某些代码行上引入新的函数调用
- 尽可能保持其余代码不变并写出结果
我从来不想实际编译代码,我只想了解使用了哪些符号,以语法正确的方式替换和添加,并能够在正确的位置声明变量。
我一直在使用最小的 Flex/bison 方法并取得了一些成功,但我不认为它很强大。我讨厌编写一个完整的语言解析器,只是为了在行尾或函数顶部添加一些新信息。看起来这几乎就是所需要的,但似乎应该已经有一些工具可以完成这些类型的操作。
要更改的代码有多种语言,但我对 FORTRAN 特别感兴趣。
有什么想法吗?
最佳答案
我们的DMS Software Reengineering Toolkit是一个通用程序转换系统,它接受任意语言描述以允许它操作这些语言。它的前端为 Fortran 、C++、C、Java、C#、COBOL 等多种语言。这些前端将源代码解析为编译器数据结构(例如完整的 AST),并使 AST 能够重新生成为有效的语言源文本,甚至保留注释。 DMS API 允许任意导航/检查/修改 AST,构建基于属性语法的分析器。 DMS 为构建特定于语言的符号表以及控制和数据流分析提供支持机制。最后,对于提供给 DMS 的任何语言,它可以将源模式匹配应用于 AST,以及源到源模式驱动的转换来匹配和修改 AST,其中每个转换都可以通过任意分析谓词来启用.
您的任务之一是找到乘以某项的函数调用。此 DMS 模式会识别它:
domain Fortran.
pattern match_multiplied_function_call(f: IDENTIFIER, a: arguments, t: term): product
= " \f(\a)*\t ";
它与找到相应语法的 AST 相匹配。
DMS 的开发和使用已超过 15 年。它已被用于对非常大的目标软件系统(C语言2500万行、COBOL 1000万行、Fortran 150万行等)进行生产分析和转换。
Fortran 前端处理 F77 和 F90,它处理 Fortran 程序中常见的额外问题(F2003、Cray 指针等),甚至处理 Fortran 文本中使用的 C 预处理器指令。
关于parsing - 自动源代码编辑工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4611505/