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

时间:2017-01-28 12:30:34

标签: java xml abstract-machine

我的问题是我需要学习完成该任务...任务是从简单的编程指令创建自动代码生成器,如

(x:=5-z; while x<z do (x:=x*2; z:=z+x) ) 

并将其转换为摘要机器输入..

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

所以我的问题是......从哪里开始? ,我需要一些解析器,解析器必须使用一些XML ..但我真的不知道如何定义XML ..

请帮助从哪里开始..谢谢..

我将在JAVA swing UI中编写代码

2 个答案:

答案 0 :(得分:1)

如果你知道你支持的语法,那么实现你自己的解析器并不是那么难。通过char解析字符串char,通过下一个运算符或空白检测运算符,字面终止或变量名称结尾,并将先前存储的字符作为标记获取。确定令牌的种类,并在Java中构建面向对象的模型。只要有表达式的面向对象模型,就可以使用例如访客模式到PRETTY-PRINT,EVALUATE甚至转换为机器代码,具体取决于您的访客实施。

(出于透视:从你的问题来看,它不清楚这个解析器如何处理XML ......)

多年前,我实现了这样一个解析这些表达式的解析器(但还没有转换为机器码)。 My old project可以让你知道我是如何解决这个问题的。

答案 1 :(得分:1)

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

这个领域的经典着作是Aho和Ullmann,现在很古老,但说实话,基本思想并没有那么多改变,我仍然使用它。

基本步骤是:

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

  2. 为此语言实现解析器(和tokenizer),将源代码的表示构造为表达式树。

  3. 编写大量测试用例。 (有人会说你应该早点这样做,但我自己的偏好是编写一个测试用例,然后编写足够的代码来传递测试,然后编写更多的测试。)

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

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

  6. 在编写代码生成器之前,您需要(a)具有您正在定位的(虚拟)机器代码的规范,以及(b)具有运行时内存管理的设计:您是如何要分配堆栈空间和堆空间,并进行垃圾收集?

  7. 编写代码生成器。尽可能保持简单,让它适用于所有测试用例,然后考虑优化。