0

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

(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 中对其进行编码

4

2 回答 2

1

如果你知道你支持的语法,那么实现你自己的解析器并不难。通过char解析字符串char,通过next运算符或空白检测运算符、文字终止或变量名结尾,并获取先前存储的字符作为令牌。确定令牌的种类,并在 Java 中构建面向对象的模型。一旦你的表达式有一个面向对象的模型,你就可以使用访问者模式来打印、评估甚至翻译成机器代码,这取决于你的访问者实现。

(从角度来看:从您的问题来看,尚不清楚该解析器必须如何处理 XML ......)

几年前,我实现了这样一个解析器来评估这些表达式(但还没有转换成机器代码)。我的旧项目可以让您了解我是如何解决这项任务的。

于 2017-01-28T12:39:52.773 回答
1

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

这个领域的经典著作是 Aho and Ullmann,它现在很古老,但说实话,基本思想并没有太大变化,我仍然在使用它。

基本步骤是:

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

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

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

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

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

  6. 在编写代码生成器之前,您需要 (a) 为您所针对的(虚拟)机器代码制定规范,并且 (b) 制定运行时内存管理的设计:您将如何分配堆栈空间和堆空间,做垃圾回收?

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

于 2017-01-28T15:20:42.240 回答