2

我正在做一些工作,我需要能够描述对一些要自动完成的程序代码的修改。

是否有任何语言可以描述这一点?

该语言应该具有接收代码中要进行修改的位置的模块或函数,并且应该允许指定可能进行的修改。
它应该允许描述修改,例如删除给定函数、在一段代码周围添加 if 条件、添加什么都不做的新函数声明等
。修改应该在解析树上完成,以便可以恢复原始代码,只有修改。
我什至不需要语言来关联解析器或实现,我所需要的只是语言本身的描述,无论是作为 BNF 语法还是非正式的。

我知道 PHP 提前编译器 phc 能够将源代码转换为 XML 表示形式并返回,从而更容易修改和恢复代码。我需要的是一种描述对 XML 的实际修改的方法,以便我可以运行一个程序,例如删除特定函数调用的所有实例,或者在每个实例周围添加 if(false)。此外,如果该语言与语言无关,尽管它不是必需的,但它会更好。

你认为这样的事情存在吗?

4

2 回答 2

2

查看 Semantic Designs的DMS 软件再造工具包。它可以用于您正在寻找的东西。

于 2011-04-08T16:35:48.280 回答
1

关键思想是程序转换。Ondrej 对 DMS 有正确的想法,但我是 DMS 的作者,所以我可能有偏见。

用于完成转换的DMS语言称为“(DMS)规则规范语言”,或RSL,用于指定(程序转换)规则。这样的规则有:

  • 一个名字(我们往往有很多,这是一种方便的方式来引用它们)
  • 参数(定义模式变量),根据感兴趣的目标语言语法键入,
  • 左手“匹配这个”模式
  • 右手“用这个替换”模式

模式通常用目标语言的表面语法编写,即被转换的语言的本机语法,带有模式变量的扩展。为了区分 RSL 语言语法和目标语言,模式写在(元)引号“...”内。模式中的 \ 字符是(元)转义回 RSL。模式变量写成“\x”。(meta)function foobar 写成 \foobar( ... ),注意 (meta)functions 参数上的 (meta)escape。在引号之外,需要元转义,并且这些结构不带 \,例如 foobar(...)。

DMS 规则可能比这复杂得多,但这些是基础。表面句法模式不代表文本;相反,它们实际上代表了模式中代码的等效 AST。DMS 规则用于匹配和更改 AST。程序转换系统当然必须有解析器来生成 AST,以及反解析器(“prettyprinters”)来将 AST 转换回文本。(DMS 拥有一个庞大的语言前端库,涵盖了地球上所有广泛使用的语言和许多不常见的语言;我们刚刚添加了 MUMPS)。

对于您的具体示例,以下规则可以解决问题:

“...删除给定的功能”:

rule remove_function(f:IDENTIFIER,p:parameters,b:body): declarations -> declarations
  "  \f \p \b " -> " ; "  -- replace function delcaration by empty declation
  if f==target_function_name();

...在代码块周围添加一个 if 条件:

rule wrap_in_if(s:statement): statement -> statement
 " \s " ->  " \if ( \generated_condition\(\) ) \s ";

...添加一个什么都不做的新函数声明:

rule insert_noop_function(d:declarations): delcarations -> declarations
" \d " -> " \target_function\name\(\) ( )  { } ";

正如您所观察到的,您必须将它们指向某个地方;这是一个“元程序”的工作,它定位你希望在 AST 中应用规则的位置,然后应用它们。对于您的规则,您需要(使用 DMS)和明确的程序方法来找到正确的位置。对于某些 DMS 规则,您可以简单地应用然后“无处不在”;DMS 基本上会遍历指定的 AST 并为您应用规则。

几条规则永远不会令人印象深刻,就像几行代码并不令人印象深刻一样。几百或几千条规则就可以完成非常壮观的事情(例如完整的语言翻译),就像几百或几千行代码可以产生非常有趣的结果一样。不同之处在于,传统代码使用数字、字符串和结构,而程序转换工具通过程序结构 (AST) 进行计算。

有一个完整的工作示例展示了如何为 DMS 定义语言和规则,以及如何应用这些规则来实现“程序修改”(该示例实际上修改了“代数表达式”,但想法完全相同)。

DMS 是毫不掩饰的商业化,它不是一个 dimestore 工具,所以它可能不是你的论文所需要的。

如果不是 DMS,您可以获得具有相同想法的免费工具。考虑 TXL (www.txl.ca) 或 StrategoXt (www.strategoxt.org)。DMS、TXL、Stratego 都使用表面语法模式进行程序转换,但 TXL 和 Stratego 无法像 DMS 恕我直言一样处理代码的大量更改。(出于某些原因,请阅读 DMS 网站上的流量分析)。不过,TXL 和 Stratego 非常适合学习基础知识和构建强大的演示。

于 2011-04-14T07:41:09.037 回答