【开源】司马编译器结构

来源:互联网 发布:linux系统能玩lol吗 编辑:程序博客网 时间:2024/06/11 22:07

编译器前段部分:源代码经过预处理模块处理之后,剔除了一些空格,跟注释,把源代码重新组织给了词法分析器,词法分析器处理后形成了记号流,记号(终结符、非终结符)被存放到了词法表中。语法分析器根据词法表中的终结符、非终结符开始语法分析。需要注意的是,在该体系结构中,词法分析器、语法分析器、语义分析器之间没有接口存在。这样做是有好处的,例如当改动语法分析器的时候,影响不到词法分析器,反之亦然,提高了维护性。

驱动整个编译前端的是词法表,产生式的所有元素都存在这里面。对符号表的引用是在语义分析阶段开始的,该结构使得各个阶段的模块关系都比较简单,虽然这样会降低在时间上的性能,因为把语义分析让语法分析器完成是可行的,但这会降低维护性能。

处理模块处理之后,剔除了一些空格,跟注释,把源代码重新组织给了词法分析器,词法分析器处理后形成了记号流,记号(终结符、非终结符)被存放到了词法表中。语法分析器根据词法表中的终结符、非终结符开始语法分析。需要注意的是,在该体系结构中,词法分析器、语法分析器、语义分析器之间没有接口存在。这样做是有好处的,例如当改动语法分析器的时候,影响不到词法分析器,反之亦然,提高了维护性。

编译器后端部分:一个可移植性高的编译器它的后端必须尽可能的跟“具体语言”无关。“中间代码生成”从符号表、二叉树、词法表中获得“表达式”“控制结构”后将其翻译为三地址码。优化器把“三地址码表”中的代码优化之后又存入到了三地址码中,三地址码跟汇编码有很直接的对应模式,所以从三地址码到汇编码的转换并不会很麻烦,存储空间分配也是在这个“时刻”进行的,最终汇编代码会被存入“汇编码表”。“机器码生成”模块把“汇编码表”中的代码一对一映射到了二进制的机器码,这一步最简单。


司马编译器:

开发:

 

项目地址:

http://gforge.osdn.net.cn/projects/unixtok/