类C编译器 C代码实现
2018-06-18 03:51:48来源:未知 阅读 ()
大三上学期做的一个小项目
类C编译器
源代码和测试文件地址https://github.com/zxt1995/ttbox.git
总体框架: 读入待编译文件->语义分析并转换为指令->按照指令进行栈操作->得出结果
拓展部分(个人负责内容 其他内容在代码中有注释)
完成内容
Do while循环
Switch case语句
Goto语句
循环中Break和continue的实现
补充基础部分的短路计算
词法分析(switch)
Switch语句加入关键字 SYM_SWITCH,SYM_CASE,SYM_DEFAULT ,SYM_BREAK
加入新的OPR操作 OPR_CMP 保留栈顶和次栈顶 次栈顶是switch后面的选择表达式的结果值 栈顶为1(相等) 0(不相等)
语法分析(switch)
switch(expression)
begin
Case num1:
为0跳转 Statement(若最后无break);
Case num2: JMP到下一个Statement开头
为0跳转 Statement(若最后有break);
Case num3:
为0跳转 Statement;
Default: JMP到结束
Statement;
end;
代码分析(switch)
在pl0.h中加入全局变量
在statement中 加入
Switch语句正常检测对应SYM 然后做一次表达式计算即可
在switch语句的最后
要判断是否出现default来给最后一个case决定跳转位置
Case部分代码如下 default类似
Break 等待回填
截图示例(switch)
测试样例如下
左边是测试代码 右边是步骤
下面是结果 结果只计算了一开始i的赋值和p=30 j=40满足switch的语法规则
(这里结果是每次参数赋值之后的结果 后面的测试结果类同,组内其他成员实现了print函数可以输出特定的参数结果)
词法分析(goto)
加入关键字SYM_GOTO
加入新的label(字符型2元数组)
语法分析(goto)
begin:
statement
jmp statement
goto: label1;
Statement
label2:
statement
Statement jmp
goto: label2;
statement
label1:
statement
end;
只要匹配到对应的label就无条件跳转就可以
但是由于不知道对应的label是在哪里出现 所以要在block结束后再回填跳转指令
代码分析(goto)
首先在statement的if(getsym()==SYM_IDENTI)中加入无法辨别的id将他判别为标识符
然后在statement的if(getsym()==SYM_GOTO)中存入另一个label
最后在main函数的block之后进行字符串匹配就行
截图示例(goto)
测试样例如下
结果满足goto语法
词法分析(do while)
Statement中重写SYM_DO
语法分析(do while)
do
Statement 为0跳转
while(expression);
代码分析(do while)
基本实现方式和while循环类似
截图示例(do while)
(见continue break 和do while共同示例)
词法分析(break continue)
加入关键字 SYM_BREAK
SYM_CONTINUE
加入全局变量
每次进入循环的时候 loopfi++ 出循环的时候loopfi-- 这样就不会在回填时出现失误
(注回填指令在出循环之后马上回填)
语法分析(break continue)
以while循环为例(begin end总体归约为一个大的statement)
While(expression)
begin
Statement 无条件跳转到expression之前
Continue;
Statement
break;
Statement 无条件jmp到循环结束
Statement
End;
代码分析(break continue)
在do while语句 for循环语句 while循环语句中都有修改 以while语句为例
添加识别sym Break和continue如下
截图示例(break continue )
附带do while
结果正确
词法分析(补充bool短路)
加入全局变量如下
加入和JPC相反的指令JNP不是0跳转
语法分析(补充bool短路)
先以一层为例
Expression简写为expi JNP到结束
JPC到同层第一个||之后
多层就存到对应层的的trur_list和false_list然后结束代表括号之后的位置即可
代码分析(补充bool短路)
如下以if语句为例
修改func_or和func_and基本同上
以or为例
遇到and更新假值链
遇到or更新真值链(同时填写同层与上一层的假值出口)
遇到Not交换真值假值链内容
示例截图
指令序列中不再出现opr_or 和opr_and
结果正确
总结(有什么能修改的地方)
Goto语句中label的数量
支持break continue的循环层数
Swich case中case和break的数量 都有一定上限!!
有待更好的数据结构来表述而不是二维/一维数组
所有代码https://github.com/zxt1995/ttbox.git
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:C语言 设一个函数process,调用它时,实现不同功能。
下一篇:Two Sum
- C++冒泡排序 (基于函数模板实现) 2020-05-31
- opencv-12-高斯滤波-双边滤波(附C++代码实现) 2020-05-10
- C++ 存储持续性 2020-05-10
- Android P HIDL demo代码编写 (原创) 2020-05-07
- 前缀和 2020-05-04
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash