我有兴趣写一个非常简约的编译器。

我想写一个小型的软件(C/C++)满足以下标准:

  • 出于精灵格式(*nix)
  • 输入一个单一的文本文件
  • C-等语法和句法
  • 没有接头
  • 没有预处理器
  • 非常小(最大。1-2KLOC)

语言特点:

  • 当地的数据类型:char,int和漂浮
  • 阵(用于所有当地数据的类型)
  • 变量
  • 控制结构(如果-其他)
  • 功能
  • 循环(将是不错的)
  • 简单的代数(div,加,子,穆尔布尔表达,移位,等等。)
  • 内联限公司(为电话系统)

谁能告诉我如何开始呢?我不知道哪些部分组成一个编译器的(至少不是在这个意义上,我只是可能会开始离架)和如何计划。谢谢你为你的想法。

有帮助吗?

解决方案

首先,你需要来决定你是否会让一个编译或口译员。一个编译器翻译代码的东西,可以运行,无论是直接的硬件上,在一个解释,或获得编译成另一种语言,其后再解释在一些方式。这两种类型的语言是图灵完成,以便他们有相同的表现的能力。我建议你创建的一个编译器而编译码进入。网或Java字节,因为它给您一个非常优化的解释器上运行,以及大量的标准库。

一旦你做了决定有一些共同的要遵循的步骤

  1. 语的定义 首先,你必须确定如何你的语言应该看看在语法上.

  2. 语法分析程序 第二步是创建了关键词的代码,被称为标记。在这里,我们正在谈论非常基本的元素,例如数字,除了签署和弦。

  3. 下一步是创建一个法相匹配的名单的标记。你可以定义你的语法使用例如一个上下文的免费法。一些工具可以吃一个这些语法和建立分析程序用于你。通常,被分析的标记组织分析树。一个分析树是表示你的语法用作数据结构,该结构你可以四处走动。

  4. 编译或口译 最后一步是进行一些逻辑上你的分析树。一个简单的方法来使自己的解释是创造一些逻辑关联的,每个节点类型在你的树,走过的树底部的,或顶下。如果你想要编译为另一种语言,你可以插入的逻辑如何翻译代码的节点,而不是。

维基百科大学习更多,你可能要开始 在这里,.

关于现实世界的阅读材料,我建议"编程语言的处理器在JAVA"通过大卫*瓦&Deryck F褐色。我用那本书在我编的课程和学习的实例是大在这一领域。

其他提示

所有的你希望完成,最具有挑战性的要求可能是"很小(最大。1-2KLOC)".我认为你的第一个要求单独(产生的精灵输出)可能需要超过一万行代码本身。

一的方式简化问题,至少在开始,是产生的代码,在大会语文,然后进入一个现有的汇编(nasm 将会是一个好的选择)。该汇编将照顾产生了实际的机器码,以及所有的精灵的特定代码需要建立一个实际可运行的可执行的。然后你的工作是减少语言分析和汇编码的产生。当你的项目成熟点,你想要删除的依赖汇编,你可以改写这一部分自己和它插在任何时候。

如果我是你,我可能会开始汇编,并建立件。最简单的"编译器"可能采取一种语言的只是几个非常简单的可能的发言:

print "hello"
a = 5
print a

和翻译,以大会的语言。一旦你得到这工作的,然后你可以建立一个语法分析程序和分析程序和抽象的法树和代码生成器,它是大部分零部件你需要一个现代化的框结构化的语言。

祝你好运!

这些都是绝对必要的部件:

  • 扫描器:这种破裂的输入文件的进入标记
  • 分析器:这个构造一个抽象的法树(AST)从币确定的扫描仪。
  • 代码生成:此产生的输出AST.

你也可能想要的:

  • 错误的处理:这告诉parser做什么,如果遇到意外的标记
  • 优化:这将有助编译器,以产生更有效的机的代码

编辑:你已经设计的语言?如果不,你会想要看到语言设计、太。

我不知道你希望摆脱这一点,但如果它是学习,并寻找在现有码对你的作品,总是有 tcc.

一个重要的是书上的一个编译器的写作。很多人会告诉你的读"龙书"通过Aho et al,但最好书我读过上编译是"Brinch*汉森在Pascal编译器".我怀疑它的出版(亚马逊是你的朋友),但它需要你通过的所有步骤的设计和编写一个编译器,使用递归下降,这是最简单的方法编译器的新理解。

虽然书中使用帕斯卡尔为执行和目标的语言,经验教训和技术提出了同样适用于所有其他语言。

例都是在Perl,但是 探索编程语言构在Perl 是一本好书,(并免费的)。

一个很好的设置的免费参考文献,恕我直言,是:

整个编译器教程:让我们建立一个编译器由杰克Crenshaw(http://compilers.iecc.com/crenshaw/)是冗长的,但我喜欢它。

汇编:NASM(nasm.我们)良好的Linux和Windows/DOS,并且最重要的是许多doco和实例/教程。(FASM 也是好的,但下文件/教程)

其他来源 电脑组件的书(http://www.drpaulcarter.com/pcasm/index.php)

我想写一个口齿不清,所以我用的 口齿不清1.5手册.你可能想要获得语言规范的任何语言书写。

尽1-2KLOC,假定使用一个高水平的语言(如Py或Rb)你应该接近如果你不是太雄心勃勃。

我总是推荐 flex野牛 这方面的工作作一个初学者。你总是可以学习的来龙去脉的编写自己的扫描仪和分析器以后,尽管它们可能增加的码尺寸至少他们将会产生对于你的工具。:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top