尝试构建一个 Java 程序以从 Alloy 实例转换为任何语言代码

Try to build a Java program to convert from Alloy instance to any language code

我正在进行一个研究项目,Alloy 生成的实例包含类似于编程语言(例如 java、c、等)。

例如,存在用于算术运算(如加、减、乘等)的实体,用于变量、常量的关系运算(如等于、大于、小于或等于等)和等等。

接下来显示模型解决方案(找到的实例)的树视图和图形视图示例(最大两个整数算法)。这些数字是从 Alloy 分析器 GUI 中提取的。

我的问题是有没有一种快速的方法可以将 alloy 实例转换为任何通用语言源代码(Java 将是首选语言)?

或者我应该通过这种方式 (going through an A4Solution) 开始做所有事情(签名、字段、原子、语言括号、缩进等)来构建一种翻译器?

这里的主要目标是构建一个 Java 程序,该程序能够将 Alloy 实例转换为准备编译的 Java 源代码文件,并且 运行 .

//max of 2 integers' java source code at mymax2.java file
class MyMax2 {
    public static void main(String[] args) {
        int x;
        int y;
        int res;
        if(y <= X) {
            res = x;
        } else {
            res = y;
        }
    }
}

最后,从 XML 转换为 Java,starting this way 不是一个理想的选择。

谢谢你帮我:)

你的确实是一个格式化打印问题,以一棵树作为数据输入。该树大致是一个抽象语法树(AST)。

按 post 顺序遍历树,在返回树时向每个节点添加有意义的文本。

这意味着您的 "text for the node" 函数看起来像一个访客,每个节点类型都有很多 "policies";然而,当涉及到变量作用域时,会有一些问题需要解决。基本上,声明的位置似乎在您的 AST 中丢失了,因此您将不得不编写一些代码来缓存 play 中的变量名,并在上层块中定义它们。

由于从下向上折叠树时 "unroll" 和 "variables to be declared" 哪个块可能不明确,因此您的代码将不会与输入代码 100% 相同。例如

public static void main(String[] args) {
   int x;
   if (x > 3) {
     int y = 3 + x;
     return x + y;
   } else {
     return 4;
   }
}

可能(在转换为 AST 并返回的完整往返之后)读作

public static void main(String[] args) {
   int x;
   int y;
   if (x > 3) {
     y = 3 + x;
     return x + y;
   } else {
     return 4;
   }
}

此外,这假设您的 AST 非常适合目标编程语言。例如,如果您想将呈现的 AST 转换为 Prolog;您很快就会发现您的 AST 中的结构不适合 Prolog 生成。

如果您需要一些指导,请查看 Pretty Printers,它利用了编译器的大部分组件,除了在他们拥有 AST 之后,他们将其作为源代码处理回来。

有一些问题,但不会太严重(前提是您的 AST 没有遗漏反向返回源代码的关键信息)。