任何用于模式匹配和-rewriting源代码的软件?

Ste*_*owe 7 language-agnostic templates pattern-matching

我有一些旧的软件(用一种不死的语言,但对我来说是死的;-))实现了源代码的基本模式匹配和写入系统.我正在考虑复制这段代码,将其翻译成现代语言,并将项目作为重构的动力工具开源.在我走得更远之前,我想知道是否已经存在这样的事情(我的google-fu今晚正在煽风点火).

以下是它的工作原理:

  • 模式匹配部分使用带有绑定变量的模板匹配跨越多行代码的源代码模式,
  • 模式重写部分使用模板重写匹配的代码,从匹配的模板中插入绑定变量的内容
  • 匹配和重写模板通过简单(无条件)重写规则关联(1:1)

该软件在输入应用程序的抽象语法树(AST)上运行,并输出一个修改后的AST,然后可以将其重新生成为新的源代码

例如,假设我们发现了一堆真正应该是for循环的while循环.以下模板将匹配while循环模式:

Template oldLoopPtrn
    int @cnt@ = 0;
    while (@cnt@ < @max@)
    {
        … @body@
        ++@cnt@;
    }
End_Template
Run Code Online (Sandbox Code Playgroud)

而以下模板将指定输出重写模式:

Template newLoopPtrn
    for(int @cnt@ = 0; @cnt@ < @max@; @cnt@++)
    {
        @body@
    }
End_Template
Run Code Online (Sandbox Code Playgroud)

和一个简单的规则来关联它们

Rule oldLoopPtrn --> newLoopPtrn
Run Code Online (Sandbox Code Playgroud)

所以看起来像这样的代码

int i=0;
while(i<arrlen)
{
    printf("element %d: %f\n",i,arr[i]);
    ++i;
}
Run Code Online (Sandbox Code Playgroud)

自动重写后看起来像这样

for(int i = 0; i < arrlen; i++)
{
    printf("element %d: %f\n",i,arr[i]);
}
Run Code Online (Sandbox Code Playgroud)

我见过的最接近的事情是一些代码重构工具,但它们似乎是针对所选片段的交互式重写,而不是批量自动更改.

我相信这种工具可以增加重构,并且可以使用多种语言(甚至是HTML/CSS).我也相信转换和抛光代码库将是一个巨大的项目,我无法在任何合理的时间内单独完成.

那么,那里有这样的东西吗?如果没有,任何明显的功能(除了重写规则条件)要考虑?

编辑:我非常喜欢这个系统的一个特点是模板模式非常明显且易于阅读,因为它们使用与目标源代码相同的语言编写,而不是以某种深奥的变异正则表达式/ BNF格式编写.

Dou*_*rie 2

TXL基于规则而不是基于模式,因此它具有更多功能,但学习曲线可能更陡峭。