java - 基于规则构建转型引擎

标签 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();

有什么工具、平台可以提供帮助吗?如果我们需要从头开始开发,有什么建议吗? 非常感谢

最佳答案

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

正确答案是Program Transformation Systems .

这些工具可以解析源代码、构建 AST,并让人们用源语法编写代码转换,就像 OP 所示的那样。

虽然有大量的理论(请参阅 seller.google.com 中的术语程序转换),但构建这些工具相当困难。只是解析代码片段的概念(正如OP所暗示的那样)需要在解析机制中进行一些非常有趣的转变。我从 20 世纪 80 年代起就进入了这个领域,并看到了 Wikipedia 上列出的过去 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 ;该页面链接到相关主题的类似深入讨论。

关于java - 基于规则构建转型引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26441749/

相关文章:

java - 为什么我们在 Java 中需要一个默认的无参数构造函数?

java - 使用泛型类型和继承时出现警告

c++ - 为什么 C++ 程序会为局部变量分配比最坏情况下所需更多的内存?

c++ - 编译器如何区分 C++ 中的私有(private)数据和公共(public)数据?

java - 如何在android中通过引用传递对象以更改原始对象?

parsing - 将数字字符串解析为 float 有哪些风险?

api - 维基旅行 XML 树结构

c# - 当对象确实是一个字符串时,转换与将对象转换为字符串

php - 如何在Windows平台上用PHP编译C/C++代码?

java.lang.AssertionError : Content type not set - Spring Controller Junit Tests 错误