
700行实现C minus编译器
文章平均质量分 73
学习完哈工大的编译原理的网课,参考视频【「700行手写编译器」】 https://www.bilibili.com/video/BV1Kf4y1V783/?share_source=copy_web&vd_source=e8a86cd2a9b9101ce9742da0017专栏中记录了代码和笔记。
爱吃小酥肉的小波
这个作者很懒,什么都没留下…
展开
-
「700行手写编译器」Part 1:项目背景与设计思路 笔记
因为视频的作者说原本是想让编译器实现比基础的C编译器更多的内容,但是实际上实现的比C编译要缩减,B站视频的作者说实际上应该是C minus,看到评论区里有人说C - -,蛮好玩的,遂给专栏起名C - -编译器。原创 2023-12-17 09:56:05 · 1123 阅读 · 1 评论 -
「700行手写编译器」Part 2.1:虚拟机与指令集 笔记
项目中设计的VM指令集说明VM指令集:1.Save & Load:IMM(immediate的缩写,加载立即数),LEA(load effective address),LC(load char), LI(load integer),SC(save char),SI(save integer),PUSH(将寄存器数据推到栈顶)原创 2023-12-17 11:34:14 · 524 阅读 · 1 评论 -
「700行手写编译器」Part 2.2:栈与函数调用 笔记
上图中的code是实现了一个二元的加法,如3+4这种,“,”输入数字3,探针右移,“,”输入数字4,然后“[”判断4!=0那就不会跳转继续执行,在“[ < + > ]”的循环过程中让3的位置不断+1,4的位置不断-1,直到4的位置减到0,那么原本3的位置就实现了3+4的结果。bp指到sp所指位置中描述的地址,也就是上一个函数的bp位置,然后sp++;答:可以没有函数调用,比如Brain-Fuck,一共只有八个语句“<”“>”“+”“-”“[”“]”“,”“.”。:首先把pc的下一个位置的值,压入栈中;原创 2023-12-17 14:06:01 · 1030 阅读 · 1 评论 -
「700行手写编译器」Part 3.1:词法分析与符号表 笔记
包括一些我们不需要的实际没有意义的字符:stop words(停用词),如//注释,space 空格,tab缩进,\n换行,没有实际含义。:Num(Number,比如enum{A,B,C},这里的A,B,C就是number),Fun(函数),Sys(System Call,比如printf),Loc(局部变量),Glo(全局变量)变量/函数的声明/定义是在实际使用之前,因此需要单独有一个table存储事先声明的变量/函数,当使用的时候必须在table中读出该变量/函数的属性然后才能使用它。原创 2023-12-17 19:46:53 · 980 阅读 · 1 评论 -
「700行手写编译器」Part 3.2:语法分析与递归下降 笔记
我们在tokenize之后,看拿到的token是否符合S的解析规则,如果符合的话就逐步的解析它剩下的部分,①剩下的部分如果依然是S,那么就递归的调用parse_s继续做解析②如果剩下的部分是S’,那就调用parse_s’③或者不符合,就输出Symtax error。而token会把变量名a,b都记为Id,因此a,b的token是一样的。另外上面的Grammar没有带终结符,实际的Grammar中需要带终结符,这样解析的过程中,每一层解析都能至少解析掉一部分的token。:句子背后实际的含义。原创 2023-12-18 00:29:29 · 500 阅读 · 1 评论 -
「700行手写编译器」Part 3.3:表达式与优先级爬山 笔记
优先级爬山算法:也就是遇到的符号的优先级能在栈中的情况一定是从栈底到栈顶,优先级越来越高(>=,也可以同级)的情况(比如+ → * → ++ )语句(statement):描述做什么,不需要返回值 (if…表达式(expression):为了求值,需要一个返回值 ( 2+3,4*5 )operater stack:可以通过递归调用的函数栈实现。number stack: 可以通过压入stack中实现。递归下降一直下降到表达式为止。但是a = 3的情况很难说是。因此我们把a = 3看成是。原创 2023-12-18 03:41:16 · 484 阅读 · 0 评论 -
「700行手写编译器」Part 4:再看代码生成 笔记
代码生成:解析完源代码,形成了相应的VM指令,在正式执行VM指令之前。上图的左边的code区域会有这些数据,data区的数据在图的中间,除此之外其他的东西应该都是处在初始化的状态,比如寄存器、stack等。上图的右边是symbol table,在代码解析完成之后,实际上就不会有任何意义或任何作用了,它的作用只是在衔接定义和使用lexeme,让函数执行过程中,该lexeme前后关系和属性对应起来。原创 2023-12-20 15:33:00 · 511 阅读 · 1 评论