我的问题是我需要学习完成该任务...任务是从简单的编程指令创建自动代码生成器,如
(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中编写代码
答案 0 :(得分:1)
(出于透视:从你的问题来看,它不清楚这个解析器如何处理XML ......)
多年前,我实现了这样一个解析这些表达式的解析器(但还没有转换为机器码)。 My old project可以让你知道我是如何解决这个问题的。
答案 1 :(得分:1)
您需要阅读几本关于编译器编写的书籍。对于StackOverflow来说这是一个非常大的问题 - 首先,如果不知道你拥有多少计算机科学知识(例如,你了解堆栈和有限状态自动机吗?),就不可能回答这个问题。
这个领域的经典着作是Aho和Ullmann,现在很古老,但说实话,基本思想并没有那么多改变,我仍然使用它。
基本步骤是:
指定要实现的编程语言的语法和语义。 (后续的一些细节将取决于它是什么类型的语言,例如它是程序性的还是声明性的,以及它具有什么类型的系统;但编译器的整体架构仍然是相同的。)
为此语言实现解析器(和tokenizer),将源代码的表示构造为表达式树。
编写大量测试用例。 (有人会说你应该早点这样做,但我自己的偏好是编写一个测试用例,然后编写足够的代码来传递测试,然后编写更多的测试。)
实现语义阶段,负责绑定变量和函数名称以及类型检查等任务。
在这个阶段,我建议为该语言编写一个解释器,因为这比编写代码生成器更容易,它将帮助您验证前面的阶段是否正常工作。
在编写代码生成器之前,您需要(a)具有您正在定位的(虚拟)机器代码的规范,以及(b)具有运行时内存管理的设计:您是如何要分配堆栈空间和堆空间,并进行垃圾收集?
编写代码生成器。尽可能保持简单,让它适用于所有测试用例,然后考虑优化。