Java-创建编译器帮助

Java-创建编译器帮助,java,Java,因此,对于我的编程类,我们有一个项目来创建一个虚拟机,包括内存单元、cpu、输入、输出、指令寄存器、程序计数器、MAR、MDR等等。现在,我们需要使用Java代码创建一个编译器,该编译器将使用一些txt编辑器编写的.exe文件,将其转换为Java字节码并运行代码。我们将在.exe文件中写入的代码是机器代码,大致如下: IN X IN Y ADD X STO Y OUT Y STOP DC X 0 DC Y 0 我只是一个初学者,只有2天的时间来写这篇文章,我非常迷茫,不知道从哪里开始…任何帮助

因此,对于我的编程类,我们有一个项目来创建一个虚拟机,包括内存单元、cpu、输入、输出、指令寄存器、程序计数器、MAR、MDR等等。现在,我们需要使用Java代码创建一个编译器,该编译器将使用一些txt编辑器编写的.exe文件,将其转换为Java字节码并运行代码。我们将在.exe文件中写入的代码是机器代码,大致如下:

IN X
IN Y
ADD X
STO Y
OUT Y
STOP
DC X 0
DC Y 0
我只是一个初学者,只有2天的时间来写这篇文章,我非常迷茫,不知道从哪里开始…任何帮助都将不胜感激。谢谢

好吧,看到没有人真正理解我,我会澄清……我在上一年的编程课程,我的老师让我们做了一个虚拟机,我已经做了,我会发布CPU和计算机课程的代码,但是我的老师非常杂乱无章,我们已经没有时间做最后一个项目了,那就是编译器……上面的代码是只是一个将转换为字节码的代码示例…这是我的虚拟机包中CPU和计算机的代码

class Cpu{
    private MemEl acc;
    private InstReg ir;
    private ProgCount pc;
    private Input in;
    private OutPut out;
    private MemEl mdr;
    private MemEl mar;
    public Cpu()
    {
        pc = new ProgCount();
        ir = new InstReg();
        acc = new MemEl();
    }
    public Boolean stop()
    {
        return ir.getOpcode() == 0;
    }
    public int getMAR()
    {
        return ir.getOpcode();
    }
    public int getMDR()
    {
        return mdr.read();
    }
    public void setMDR(int n)
    {
        mdr.write(n);
    }
    public boolean OutFlag()
    {
        return ir.getOpcode() == 8;
    }
    public boolean InFlag()
    {
        return ir.getOpcode() == 7;
    }
    public boolean StoreFlag()
    {
        return ir.getOpcode() == 2;
    }
 public void fetch()
    {
        mar.write(pc.getValue());
        pc.plus();
    }
    public void reset()
    {
        mar.write(0);
        pc.write(0);
        pc.write(1);
    }
    public void fetch2()
    {
        ir.write(mdr.read());
    }
    public void decode()
    {
        mar.write(ir.getOperand());
        mdr.write(acc.read());
    }
 public void execute()
    {

        switch(ir.getOpcode()){
        case 0:
            System.out.println("Complete");
            break;
        case 1:
            acc.write(mdr.read());
            break;
        case 2:
            acc.write(ir.getOperand());
            break;
        case 3:
            acc.write(acc.read() + mdr.read());
            break;
        case 4:
            acc.write(acc.read() - mdr.read());
            break;
 case 5:
            acc.write(acc.read() * mdr.read());
            break;
        case 6:
            acc.write(acc.read() / mdr.read());
            break;
        case 7:
            mar.write(ir.getOperand());
            break;
        case 8:
            System.out.println(getMDR());
            break;
        case 9:
            pc.write(getMDR());
            break;
        case 10:
            if(0 == acc.read())
                pc.write(getMDR());
            else
                fetch();
            break;
        case 11:
            if(0 < acc.read())
                pc.write(getMDR());
            else
                fetch();
            break;
        }

    }

Load方法只是一个临时方法,只是为了看看机器是否工作……它将加载的是编译器形成的字节码

如果需要将某些内容转换为Java字节码,则必须执行以下操作(至少!)

  • 学习java字节码标准!(除非它是为类发明的java字节码模型?)
  • 使用StringTokenizer或类似类解析输入“.exe”(不是一个好的扩展名imho)
  • 或者,使用词法分析器确定要为代码编写什么
  • 使用从阅读Java字节码标准中学到的内容格式化输出

  • “就这些”——但听起来你的项目可能需要更多的时间,除非你在这个主题上非常有经验……

    如果你需要将某些东西转换成Java字节码,你必须做以下事情(至少!)

  • 学习java字节码标准!(除非它是为类发明的java字节码模型?)
  • 使用StringTokenizer或类似类解析输入“.exe”(不是一个好的扩展名imho)
  • 或者,使用词法分析器确定要为代码编写什么
  • 使用从阅读Java字节码标准中学到的内容格式化输出

  • “就这么多”-但听起来你的项目可能需要多一点时间,除非你在这方面非常有经验…

    如果我正确理解了你,你应该:

    • 创建词法分析器。对于给定的文本,它产生一系列词汇
    • 创建语法分析器。它将生成语法树
    • 创建解释器,该解释器遍历树并生成代码
    • 创建运行此生成代码的VM

      • 如果我正确理解了你,你应该:

        • 创建词法分析器。对于给定的文本,它产生一系列词汇
        • 创建语法分析器。它将生成语法树
        • 创建解释器,该解释器遍历树并生成代码
        • 创建运行此生成代码的VM

          • 您是初学者,有两天时间编写编译器

            哇。希望你的姓是“克努斯”

            你当然应该读一读。它的一个链接是

            您需要知道“机器代码”文件指令如何映射到该指令。“DC”等同于“双重比较”吗?如果是,它是dcmpg(十六进制98)还是dcmpl(十六进制98)?等等


            说真的?祝你好运。

            你是个初学者,你有两天的时间来编写编译器

            哇。希望你的姓是“克努斯”

            你当然应该读一读。它的一个链接是

            您需要知道“机器代码”文件指令如何映射到该指令。“DC”等同于“双重比较”吗?如果是,它是dcmpg(十六进制98)还是dcmpl(十六进制98)?等等


            说真的?祝你好运。

            基于你的问题和你必须做的时间,这看起来很有野心,但我会努力让你走上正轨。显然,因为这是家庭作业,没有人会给你答案;)

            您的示例中的代码更准确地称为“汇编代码”。这样看,;你必须:

            • 读每一行
            • 查看第一个“单词”(指令或运算符),并将其等同于Java字节码
            • 计算应该为运算符读入多少个参数(操作数)
            • 确保行的其余部分包含适当数量的操作数
            • 根据Java规范以适当的顺序写出字节码
            • 将字节码加载到VM中并运行它

            示例中的汇编代码看起来有一些讲师可能给您的明确规则。例如,“添加X”意味着将位置X的内容添加到--什么?“IN”是指“输入”还是“增量”?“STOY”是指将某物存储到位置Y——什么?似乎有一个隐含的寄存器保存结果。这也应该是讲师规范的一部分。祝你好运开始黑客攻击

            从你的问题和你必须做的时间来看,这似乎很有野心,但我会尽力让你走上正轨。显然,因为这是家庭作业,没有人会给你答案;)

            您的示例中的代码更准确地称为“汇编代码”。这样看,;你必须:

            • 读每一行
            • 查看第一个“单词”(指令或运算符),并将其等同于Java字节码
            • 计算应该为运算符读入多少个参数(操作数)
            • 确保行的其余部分包含适当数量的操作数
            • 根据Java规范以适当的顺序写出字节码
            • 将字节码加载到VM中并运行它
            屁股
            import java.io.*;
            class Computer{
                private Cpu cpu;
                private Input in;
                private OutPut out;
                private Memory mem;
                public Computer() throws IOException
                {
                    Memory mem = new Memory(100);
                    Input in = new Input();
                    OutPut out = new OutPut();
                    Cpu cpu = new Cpu();
                    System.out.println(in.getInt());
                }
                public void run() throws IOException
                {
                    cpu.reset();
                    cpu.setMDR(mem.read(cpu.getMAR()));
                    cpu.fetch2();
                    while (!cpu.stop())
                        {
                            cpu.decode();
                            if (cpu.OutFlag())
                                OutPut.display(mem.read(cpu.getMAR()));
                            if (cpu.InFlag())
                                mem.write(cpu.getMDR(),in.getInt());
                            if (cpu.StoreFlag())
                                {
                                    mem.write(cpu.getMAR(),in.getInt());
                                    cpu.getMDR();
                                }
                            else
                                {
                                    cpu.setMDR(mem.read(cpu.getMAR()));
                                    cpu.execute();
                                    cpu.fetch();
                                    cpu.setMDR(mem.read(cpu.getMAR()));
                                    cpu.fetch2();
                                }
                        }
                }
            public void load()
                {
                    mem.write(0,799);
                    mem.write(1,199);
                    mem.write(2,1009);
                    mem.write(3,398);
                    mem.write(4,298);
                    mem.write(5,199);
                    mem.write(6,497);
                    mem.write(7,299);
                    mem.write(8,902);
                    mem.write(9,898);
                    mem.write(97,0);
                    mem.write(98,0);
                    mem.write(99,1);
                }
            
            }
            
            initialize Map of instruction names (keys) to instruction op codes (ByteCodeInfo);
            initialize empty bytecode-operations list;
            open input text file;
            while (more to read)
            {
                read next line;
                split line by spaces;
                lookup ByteCodeInfo in the Map;
                if (num actual operands != num expected operands - from ByteCodeInfo)
                    throw exception(parse failed on line ####);
                add new operation to list of operations (each element in the list is an address)
                if there is a variable reference (e.g. "X") add this to a symbol Map;
                if this is a variable declaration (DC...) update the symbol object with the address;
            }
            close input text file;
            
            open output binary file (the byte-code file);
            for each element in operation list
            {
                write address, byte-code, operands (if any);
            }
            close byte-code file;