Java 从简单的编程指令生成抽象机器代码

Java 从简单的编程指令生成抽象机器代码,java,xml,abstract-machine,Java,Xml,Abstract Machine,我的问题是我需要学习什么来完成这项任务…任务是从简单的编程指令创建自动代码生成器,如 (x:=5-z; while x<z do (x:=x*2; z:=z+x) ) 所以我的问题是…从哪里开始,我需要一些解析器,解析器必须处理一些XML。但是我真的不知道如何定义XML 请帮忙从哪里开始谢谢 我将在JavaSwingUI中对其进行编码,如果您知道所支持的语法,那么实现自己的解析器并不难。逐字符解析字符串,按下一个运算符或空格检测运算符、文字终止或变量名结尾,并获取以前存储的字符作为标记

我的问题是我需要学习什么来完成这项任务…任务是从简单的编程指令创建自动代码生成器,如

(x:=5-z; while x<z do (x:=x*2; z:=z+x) ) 
所以我的问题是…从哪里开始,我需要一些解析器,解析器必须处理一些XML。但是我真的不知道如何定义XML

请帮忙从哪里开始谢谢


我将在JavaSwingUI中对其进行编码,如果您知道所支持的语法,那么实现自己的解析器并不难。逐字符解析字符串,按下一个运算符或空格检测运算符、文字终止或变量名结尾,并获取以前存储的字符作为标记。确定令牌的种类,并用Java构建面向对象的模型。一旦你有了一个面向对象的表达式模型,你就可以根据你的访问者实现,使用访问者模式来打印、计算甚至翻译成机器代码

(从角度来看:从您的问题来看,不清楚这个解析器如何处理XML…)


几年前,我实现了这样一个解析器,用于计算这些表达式(但尚未转换为机器代码)。您可以了解我是如何解决此任务的。

如果您知道所支持的语法,那么实现自己的解析器并不难。逐字符解析字符串,按下一个运算符或空格检测运算符、文字终止或变量名结尾,并获取以前存储的字符作为标记。确定令牌的种类,并用Java构建面向对象的模型。一旦你有了一个面向对象的表达式模型,你就可以根据你的访问者实现,使用访问者模式来打印、计算甚至翻译成机器代码

(从角度来看:从您的问题来看,不清楚这个解析器如何处理XML…)


几年前,我实现了这样一个解析器,用于计算这些表达式(但尚未转换为机器代码)。可以告诉你我是如何解决这个问题的。

你需要读几本关于编译器编写的书。对于StackOverflow来说,这是一个太大的问题——首先,不知道你有多少计算机科学知识就不可能回答(例如,你了解stacks和有限状态自动机吗?)

这方面的经典著作是《阿霍和乌尔曼》,这本书现在已经很古老了,但老实说,基本思想并没有发生太大的变化,我仍然在使用它

基本步骤是:

  • 指定要实现的编程语言的语法和语义。(随后的一些细节将取决于它是哪种语言,例如,它是过程性的还是声明性的,以及它具有哪种类型的类型系统;但编译器的总体架构仍然是相同的)

  • 为这种语言实现一个解析器(和标记器),它将源代码表示为一个表达式树

  • 编写大量的测试用例。(有人会说您应该早一点这样做,但我个人的偏好是编写一个测试用例,然后编写足够的代码通过该测试,然后编写更多的测试。)

  • 实现语义阶段,该阶段负责绑定变量和函数名以及类型检查等任务

  • 在这个阶段,我建议为该语言编写一个解释器,因为这比编写代码生成器要容易得多,它将帮助您验证前面的阶段是否正常工作

  • 在编写代码生成器之前,您需要(a)为目标(虚拟)机代码制定规范,以及(b)设计运行时内存管理:如何分配堆栈空间和堆空间,以及如何进行垃圾收集

  • 编写代码生成器。一开始,让它尽可能简单,让它适用于所有测试用例,然后考虑优化


  • 你需要读几本关于编译器编写的书。对于StackOverflow来说,这是一个太大的问题——首先,不知道你有多少计算机科学知识就不可能回答(例如,你了解stacks和有限状态自动机吗?)

    这方面的经典著作是《阿霍和乌尔曼》,这本书现在已经很古老了,但老实说,基本思想并没有发生太大的变化,我仍然在使用它

    基本步骤是:

  • 指定要实现的编程语言的语法和语义。(随后的一些细节将取决于它是哪种语言,例如,它是过程性的还是声明性的,以及它具有哪种类型的类型系统;但编译器的总体架构仍然是相同的)

  • 为这种语言实现一个解析器(和标记器),它将源代码表示为一个表达式树

  • 编写大量的测试用例。(有人会说您应该早一点这样做,但我个人的偏好是编写一个测试用例,然后编写足够的代码通过该测试,然后编写更多的测试。)

  • 实现语义阶段,该阶段负责绑定变量和函数名以及类型检查等任务

  • 在这个阶段,我建议为该语言编写一个解释器,因为这比编写代码生成器要容易得多,它将帮助您验证前面的阶段是否正常工作

  • 在编写代码生成器之前,您需要(a)为目标(虚拟)机代码制定规范,以及(b)设计运行时内存管理:如何分配堆栈空间和堆空间,以及如何进行垃圾收集

  • 编写代码生成器。一开始,让它尽可能简单,让它适用于所有测试用例,然后考虑优化

    PUSH-5:FETCH-z:SUB:STORE-x: LOOP ...etc....