
编译器一日一练
文章平均质量分 66
写编译器和读编译器
嵌入式-老费
计算机科班出身,09年研究生毕业即投入嵌入式开发工作,欢迎付费咨询,微信联系:xiaoxing_fei。
展开
-
编译器一日一练(DIY系列之总结)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和其他的编译器专栏相比较,这里的编译器只是侧重于对单一的文法进行处理。主要还是以四则运算为主。要说语法层面的话,相当于c语言里面的expression语法。虽然,这个语法的内容并不多,但是我们可以把这部分作为基础,一步一步去理解、分析、实现背后的逻辑。通过做深做透单一知识点,可以更好地去了解编译的全流程。这是这个系列和其他编译器文章最大的不同。 读书的时候,很多时候原创 2022-11-05 11:13:49 · 402 阅读 · 0 评论 -
编译器一日一练(DIY系列之汇编优化)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 代码地址:https://github.com/feixiaoxing/DIYCompiler/blob/master/day11/Parse1.jj 上一篇文章谈到了汇编代码的生成,但是留了一个小尾巴,那就是汇编的优化。在实际操作中,优化主要分成两个部分。一个是中间代码的优化,比如a=4*5,一般生成中间代码的时候,编译器就帮你算了;另外一种就是汇编代码的优化,原创 2022-11-05 06:36:29 · 584 阅读 · 0 评论 -
编译器一日一练(DIY系列之汇编输出)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 代码地址:https://github.com/feixiaoxing/DIYCompiler/blob/master/day10/Parse.jj 前面的几章,我们陆续讨论了词法分析、语法树、复杂语法树、语义分析、中间代码输出这些环节,今天终于到了汇编代码这个大结局了。很多人都认为编译器,就是把源代码编译成二进制文件。这其实是一个误会。大部分编译器的工作就是把s原创 2022-11-04 06:27:00 · 450 阅读 · 0 评论 -
编译器一日一练(DIY系列之中间代码生成)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 代码地址:https://github.com/feixiaoxing/DIYCompiler/blob/master/day09/Parse1.jj 说到中间代码生成,目前来说用的比较多的一个方案就是llvm。也就是说,如果把ast语法树翻译成llvm支持的中间代码,那么后端的事情就不需要自己操心了。当然,如果开发的是商用编译器,确实可以这么做。原创 2022-11-03 20:41:00 · 446 阅读 · 0 评论 -
编译器一日一练(DIY系列之语法树打印)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 代码地址:https://github.com/feixiaoxing/DIYCompiler/blob/master/day08/Parse1.jj 之前我们谈到了词法分析、语法分析、语义分析,但是没有讨论,如果自己写编译器的话,应该如何来调试。其实,对于编译器来说,它也是有自己的调试方法。一般来说,语法分析结束了,这个时候一个完整的语法树就原创 2022-11-03 05:57:25 · 432 阅读 · 0 评论 -
编译器一日一练(DIY系列之语义分析)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 代码地址:https://github.com/feixiaoxing/DIYCompiler 语义分析一般是跟在语法分析后面进行的。语义分析的内容比较广。它的输入是语法树,并且在这过程当中会生成符号表,利用符号表的意义去检测语义是否正确。记录的符号表一般有全局变量、函数名、局部变量、参数名这些。此外,除了检测符号表之外,还会检测一些关键字的合理性,比如br原创 2022-11-01 06:15:05 · 314 阅读 · 0 评论 -
编译器一日一练(DIY系列之复杂语法树)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 代码地址:GitHub - feixiaoxing/DIYCompiler 之前一章,我们谈到过简单语法树的构建。说是语法树,其实就是一个tree node。它的左子树是一个整数,右子树也是一个整数。所有的工作都是为了构建一个div_node。 在此基础上,大家可以思考一下,如果是一个连续的除法,这个时候应该怎么处理?一个比较容易想到的办法就是在原原创 2022-10-31 07:28:19 · 233 阅读 · 0 评论 -
编译器一日一练(DIY系列之简单语法树)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 代码地址:https://github.com/feixiaoxing/DIYCompiler 之前我们做四则运算的时候,用的都是数值进行计算。大家有没有思考过,其实可以用二叉树的形式,把这些语法都串起来、构建起来。举一个例子,现在有一个除法运算,如果没有语法树,那么jj格式的内容基本是这样的,原创 2022-10-30 16:41:01 · 346 阅读 · 0 评论 -
编译器一日一练(DIY系列之词法分析)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 词法分析是编译原理的基础。目前来说,大部分编程语言还是以英文为主。使用英文有几个好处,这主要是因为英文的单词和单词之间是用空格分开来的,不像中文需要用词组来分割。记得读书的时候,有一个编译原理上机作业,就是编写一个词法分析器。如果是纯手工编写词法分析器,那么势必涉及到状态机的知识。然而如果使用javacc来编写,只需要描述清楚规则就可以了。 目前词法分析涉及到的分词原创 2022-10-29 09:08:06 · 884 阅读 · 0 评论 -
编译器一日一练(DIY系列之四则运算)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面说到了javacc,也谈到了加法运算、减法运算、加减法运算、连续加减法运算。今天正好可以说一下乘法、除法运算。大家都知道,运算里面是分优先级的。也就是说,表达式里面,如果有乘法和除法,那么先做乘除,再做其他的加减运算。 因此为了实现四则运算,我们需要先处理乘除运算,再慢慢加入加减运算。1、乘除运算 单独的乘除运算还是比较简单的,只需要把原创 2022-10-28 09:10:27 · 472 阅读 · 0 评论 -
编译器一日一练(DIY系列之连续加减法)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 上一篇我们说到了怎么用javacc写一个加法器的解析工具。今天继续,可以在这个基础上看一下怎么做一个连续加减法的工具。1、减法工具 剑法工具比较简单,就是在原来加法的基础之上,修改成-就可以了。我们可以看一下对应生成的Adder.jj文件,原创 2022-10-27 07:48:02 · 451 阅读 · 0 评论 -
编译器一日一练(DIY系列之加法器)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 过去编写编译器可以用lex和bison,其实用javacc也是不错的选择。如果使用javacc,token和语法都是放在一个文件里面的。通过javacc解析jj文件,就可以生成对应的java代码。把这些java代码编译好,就是最后我们需要的工具。原创 2022-10-25 14:43:44 · 405 阅读 · 0 评论 -
编译器一日一练(DIY系列之开篇)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 编译原理这门课,很多计算机专业的同学都学过。但是学的怎么样,就看每个人自己了。和操作系统、计算机组成原理、计算机网络一样,很多学校都把编译原理当成了文科、理科来学,这就大错特错了。计算机专业本来就属于工科,工科的重要特点就是理论和实际相结合。理论是原理、方法、算法,实际就是动手操作。没有实际的操作,理论是不可能领会的。 编译原理的步骤,大家都比较熟悉,就是词法分析、原创 2022-10-13 08:34:12 · 427 阅读 · 0 评论