我有兴趣编写一个非常简约的编译器.
我想写一小段软件(在C/C++中),它符合以下标准:
>以ELF格式输出(* nix)
> input是单个文本文件
>类似C语法和语法
>没有链接器
>没有预处理器
>非常小(最大1-2 KLOC)
语言特色:
>本机数据类型:char,int和float
>数组(适用于所有本机数据类型)
>变量
>控制结构(if-else)
>功能
>循环(会很好)
>简单代数(div,add,sub,mul,布尔表达式,位移等)
> inline asm(用于系统调用)
谁能告诉我怎么开始?我不知道编译器包含哪些部分(至少在某种意义上我不能直接启动)以及如何对它们进行编程.谢谢你的想法.
解决方法
首先,您需要决定是要创建编译器还是解释器.编译器将您的代码转换为可以直接在硬件上,在解释器中运行的代码,或者编译成另一种语言,然后以某种方式进行解释.这两种语言都是完整的,因此它们具有相同的表达能力.我建议您创建一个编译器,将您的代码编译成.net或
Java字节码,因为它为您提供了一个非常优化的解释器以及许多标准库.
做出决定后,需要遵循一些常见步骤
>语言定义首先,您必须定义语言在语法上的外观.
> Lexer第二步是创建代码的关键字,称为令牌.在这里,我们讨论的是非常基本的元素,如数字,加号和字符串.
>解析下一步是创建一个与您的令牌列表匹配的语法.您可以使用例如定义语法无上下文的语法.可以使用这些语法之一来提供许多工具,并为您创建解析器.通常,解析的标记被组织成一个解析树.解析树是您的语法表示为可以在其中移动的数据结构.
>编译或解释最后一步是在解析树上运行一些逻辑.创建自己的解释器的一种简单方法是创建与树中每个节点类型相关联的逻辑,并从下到上或从上到下遍历树.如果要编译为另一种语言,可以插入如何在节点中转换代码的逻辑.
维基百科非常适合学习更多,你可能想要开始here.
关于现实世界的阅读材料,我建议由David A Watt编写的“JAVA编程语言处理器”. Deryck F Brown.我在编译器课程中使用了那本书,通过实例学习在这个领域很棒.