根据规则构建转换引擎

时间:2014-10-18 16:04:28

标签: java parsing compiler-construction transform transformation

我想基于规则集构建转换引擎(从COBOL到Java) 例如,我们有以下COBOL代码:

PERFORM 3 TIMES
   IF X = 10 THEN;
   ELSE
       CALL PARA01.
END PERFORM.

我希望能够定义如下规则:

Rule1:
  Pattern: PERFORM $VAR TIMES ==> for (int i = 0; i < $VAR; i ++)
Rule2: 
  Pattern: IF CONDITION THEN ;
           ELSE
              BLOCK_OF_CODE
           ==> if (!(condition))
                  BLOCK_OF_CODE

所以转换后的Java代码看起来像这样:

for (int i = 0; i < 3; i ++)
    if (!(A== 10))
        Para01();

是否有任何工具,平台可供帮助?在我们需要从头开发的情况下,有什么建议吗? 非常感谢你

1 个答案:

答案 0 :(得分:1)

有些人试图用正则表达式做这种事情。它不起作用;正则表达式无法处理无上下文匹配。

正确的答案是Program Transformation Systems

这些工具可以解析源代码,构建AST,让一个人在源语法中编写代码转换,就像OP所展示的那样。

虽然有大量理论(请参阅带有程序转换一词的scholar.google.com),但构建这些工具相当困难。解析代码片段的概念(正如OP所暗示的那样)在解析机器时需要一些非常有趣的转折。自20世纪80年代以来,我一直在这个领域,看过维基百科在过去15到20年间建立的工具;我没有看到更多。我们在构建系统方面的经验(参见我的简历)是大约50人年的博士级软件工程,所以我并不感到惊讶,我没有看到更多的这些。

这些工具通常需要精确的语言前端才有用,而这正是在您构建基本转换引擎之后实际使用它们的大部分工作。 (见discussion on parsing Java and C++;它同样适用于complex legacy languages like COBOL)。

[评论中的查询想知道更多地了解更多技术细节。如果你想要“先剪切”但深入的技术细节,这个survey非常好,但主要集中在“纯”转换引擎上(仅在抽象语法树上运行)。

我碰巧相信一个人需要的远不止于此;看我的生物学讨论“解析后的生活”。您可以在我的older technical paper on our DMS system中获取Google Tech Talk和/或我们系统的最近视频概述,包括它的不同之处。

在对原始问题的评论中,有一个“深度技术之旅”的请求。见this for detailed discussion on how DMS handles rewrite rules;该页面链接到相关主题的类似深度讨论。