首页 文章

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

提问于
浏览
-2

我正在研究一个研究项目,一个Alloy生成的实例保存类似于编程语言(如java,c等)的实体(如Signatures,Fields,Relations或Tuples) .

例如,对于变量,常量等的关系运算(例如,等于,大于,小于或等于等),存在用于算术运算的实体(诸如Add,Sub,Multiply等) .

接下来显示模型解决方案(找到的实例)的树视图和图形视图示例(最多两个整数算法) . 这些数据是从Alloy Analyzer GUI中提取的 .

Tree view of max2 of two integers

Graph view of max2 of two integers

我的问题是有一种快速的方法将合金实例转换为任何公共语言源代码(Java将是首选语言)?

或者我应该通过这种方式(going through an A4Solution)来构建一种翻译器来完成所有事情(Sigs,Fields,Atoms,语言括号,缩进等)?

这里的主要目标是构建一个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;
        }
    }
}

最后,通过starting this way从XML转换为Java不是一个理想的选项 .

谢谢你的帮助:)

1 回答

  • 1

    你的确是一个格式化的打印问题,树是数据输入 . 树大致是一个抽象语法树(AST) .

    执行树的颠倒后横向,在向上返回树时向每个节点添加敏感文本 .

    这意味着您的“节点文本”功能看起来像访问者,每个节点类型都有许多“策略”;但是,当涉及到变量范围时,会有一些皱纹要解决 . 基本上,声明的位置似乎在AST中丢失了,因此您必须编写一些代码来缓存变量名称,并在上面的块中定义它们 .

    由于当您从下往上折叠树时,您将“展开”您的“要声明的变量”块可能是不明确的,因此您的代码将不会与输入代码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没有错过反向源代码的关键信息) .

相关问题