您感兴趣的是“源到源”程序转换系统。
解析器是必要的,但还不够。(实际上,您使用的语言方言的解析器是必要的……鉴于人们使用如此多的“编程”语言,因此需要很多解析器)。您还需要捕获解析结果(通常作为树),能够以某种方式操作该树,然后从树中重新生成有效的源代码。如果您希望该源代码永久更改为手动编程的源代码,则解析器/树/解解析器组合必须在最大程度上保留代码格式和注释。
除非标识符的含义很清楚,否则您通常无法真正转换代码。所以在实践中,您不仅需要解析,还需要构建符号表(此时您拥有相当于编译器前端的东西,而不是解析器)。许多转换需要跟踪信息流(控制流、数据流、指向、谁调用......)。如果没有这些特性,这些工具对于迄今为止构成大量源代码的过程/OO 语言不是很有效。(函数式语言的人可以通过较少的流分析来解决问题,因为一切都是一个表达式,但大多数编写的代码都不是函数式的,所以这在实际意义上并不重要)。
有许多源到源的转换系统,某些特定于语言(例如, Java 的JackPot);一些由语言定义(TXL、Stratego、DMS)参数化。
一些特定于语言的语言提供符号表和流分析。我知道只有一种转换可以为多种编程语言提供这些功能,那就是我们的DMS Software Reengineering Toolkit。
DMS 为许多真正的编程语言及其常用方言提供此功能,而不是玩具:C、Java、COBOL。
DMS 是为数不多的 C++ 源到源程序转换系统之一;它已被愤怒地用于对大型 C++ 程序进行更改。 我认为Clang非常接近,当然是雄心勃勃。Rose Compiler是另一种主要用于超级计算领域的编译器,但它们都是 C++(可能包含 C)特定的。