我有一些旧软件(使用的语言还没有死,但对我来说已经死了;-))为源代码实现了基本的模式匹配和重写系统。我正在考虑恢复这段代码,将其翻译成现代语言,并将项目作为重构动力工具开源。在我走得更远之前,我想知道这样的事情是否已经存在(我的 google-fu 今晚正在宣传这件事)。
以下是它的工作原理:
- 模式匹配部分使用具有绑定变量的模板匹配跨越多行代码的源代码模式,
- 模式重写部分使用模板重写匹配的代码,从匹配的模板插入绑定变量的内容
- 匹配和重写模板通过一个简单的(无条件的)重写规则关联(1:1)
该软件对输入应用程序的抽象语法树 (AST) 进行操作,并输出修改后的 AST,然后可以将其重新生成为新的源代码
例如,假设我们发现一堆真正应该是 for 循环的 while 循环。以下模板将匹配 while-loop 模式:
Template oldLoopPtrn
int @cnt@ = 0;
while (@cnt@ < @max@)
{
… @body@
++@cnt@;
}
End_Template
而以下模板将指定输出重写模式:
Template newLoopPtrn
for(int @cnt@ = 0; @cnt@ < @max@; @cnt@++)
{
@body@
}
End_Template
和一个简单的规则来关联它们
Rule oldLoopPtrn --> newLoopPtrn
所以看起来像这样的代码
int i=0;
while(i<arrlen)
{
printf("element %d: %f\n",i,arr[i]);
++i;
}
自动改写成这样
for(int i = 0; i < arrlen; i++)
{
printf("element %d: %f\n",i,arr[i]);
}
我见过的最接近这样的东西是一些代码重构工具,但它们似乎是针对选定片段的交互式重写,而不是大规模的自动更改。
我相信这种工具可以增强重构,并且可以在多种语言(甚至 HTML/CSS)上工作。我也相信转换和完善代码库将是一个巨大的项目,我根本无法在任何合理的时间内单独完成。
那么,已经有类似的东西了吗?如果没有,是否需要考虑任何明显的特征(除了重写规则条件)?
编辑:我非常喜欢这个系统的一个特点是模板模式相当明显且易于阅读,因为它们是用与目标源代码相同的语言编写的,而不是一些深奥的变异正则表达式/BNF 格式。