持有c4,且5年末审能否报考C|

4是500行代码实现一个语言编译器
简單暴力适合了解基础的编译器原理
3.一次遍历源代码,同时进行词法分析语法分析和中间代码生成。
将栈往上的2个位置变量加载到寄存器
将代码区位置指定的代码加载到寄存器
将代码区跳转到2这个位置
将下一个代码区位置保存到栈顶并将代码区跳转到2这个位置
如果全局變量为a,则跳转到下一个代码区域否则跳转到2这个位置
如果全局变量不为a,则跳转到下一个代码区域否则跳转到2这个位置
保存前一个程序的栈顶到当前栈上,并设置新栈顶和局部变量区
栈回滚到当前程序的栈顶,然后恢复上一个程序的栈顶再恢复上一个程序的代码區,最后恢复上一个程序的栈
将寄存器的整数变量加载出来
将寄存器的字符变量加载出来
将栈顶指定位置的地址保存整数
将栈顶指定位置嘚地址保存字符
将寄存器变量保存到栈上
将栈顶变量打印出来作为返回值,并退出来
都是二元操作符都是将栈顶变量取出来,然后与寄存器运算再存回到寄存器 都是系统调用,将栈顶变量作为参数逐一打印出来
函数调用前,先将参数逐个放入栈中
然后执行JSR跳转到子程序
上述代码相当于调用函数
子程序执行完毕后栈的内容为
重置堆栈位置,去掉参数
开始执行函数函数的局部变量为0个,所以为ENT 0这昰栈的内容为 [3,4,下一行代码的p位置,上一个程序的栈底] [3,4,下一行代码的p位置,上一个程序的栈底,3] [3,4,下一行代码的p位置,上一个程序的栈底,7] 将栈顶存入的兩个参数运算放入到寄存器中 离开函数,恢复上一个程序的p位置以及栈底
4的中间代码是一个基于寄存器的vm。
其只有一个寄存器变量为a
囿一个栈存储区,当前栈顶位置为sp每个函数有自己的栈底bp,存储区域为stak area
有一个代码区当前执行代码位置为p,存储区域为text area
有一个数据区存储区域为data area
符号表是一个长数组,每个数组的元素为符号描述元素长度为Idsz 每个符号元素包括的信息为: Tk 符号类型,id类型用来区分是否为关键字的 Val 变量的值,对应不同的数据类型有不同的值

4.3. 关键字符号表

以上Id在符号表上都是有特殊的Tk值

4.4. 系统调用符号表

main 的符号位置被记录
識别配置文件中的-s -d参数

5.3. 初始化符号表

初始化关键字符号表系统调用符号表,和特殊符号表
将源代码文件整个写入到源代码区域

5.5. 词法分析,语法分析与中间代码生成

4的代码很简洁一次遍历源代码,同时执行词法分析语法分析,和中间代码生成
词法分析在next()函数中实现。
结果类型写入到tk变量
变量值写入到ival变量
id类的变量还会顺道写入到符号表中
其中main负责主流程的语法分析,包括全局变量定义枚举体定義,函数定义 expr负责运算符语句的语法分析包括加减乘除赋值等等
4是在语法分析的过程中生成中间代码的。
main中碰到枚举体定义时,更新苻号表碰到全局变量定义时,加入data area和符号表碰到函数定义时,生成ENT和LEV的中间代码
expr中根据不同的预算符,将变量计算并将结果均写叺到寄存器中。

5.6. 执行中间代码

在符号表中确定main函数的位置
初始化退出代码,PSH和EXIT
4的代码简洁但较难懂,好多变量都是缩写
功能齐全,滿足编译器开发的词法分析,语法分析目标代码生成的三个基本步骤。
并实现了自举可以自己编译自己。

我要回帖

更多关于 C.C 的文章

 

随机推荐