编译原理实验二(2)——补充空缺代码

本文介绍了一次关于编译技术的上机实验,重点在于符号表管理与语义检查。通过补充代码实现静态语义检测,并展示了如何针对预设错误编写测试用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:
课程:《编译技术》上机
实验二:符号表管理与语义检查。对抽象语法树进行遍历,完成符号表的管理与相关属性计算。通过对符号表的管理实现语义分析。


此处完成补充 原始空缺代码+演示静态语义检测 的操作
前期准备
  1. 已经将整个文件夹都备好份,以供魔改后的回溯
开始实验
第一步

解释ast.c文件函数

  1. strcat0(char *s1,char *s2)
     连接两个char数组

  2. newAlias()
     生成别名编号,比如下面的递增的V1, v2,…
    在这里插入图片描述

  3. newLabel()
     生成label编号

  4. newTemp()
     生成temp编号,比如
    在这里插入图片描述

  5. 以下是与中间代码生成有关的函数,可以先不了解
    genIR(int op,struct opn opn1,struct opn opn2,struct opn result)
    genLabel(char * label)
    genGoto(char * label)
    merge(int num,…)
    prnIR(struct codenode *head)

  6. semantic_error(int line,char *msg1,char *msg2)
      划重点,这个要记住,他是将错误输出的函数
      我们这个实验二,老师也说了主要是看能检测出多少种静态语义错误,每种错误被检测到都会调用这个函数的。
      而且我们这次不是打算偷一丢丢懒嘛,所以我没有打算自己补充检测,先把它给出的错误每一个都搞一个测试用例,这样子分数就得到了。一会ctrl+f搜索这个函数名就可以看到有多少种预设的错误检测。

  7. prn_symbol()
     显示符号表

  8. searchSymbolTable(char * name)
     用于检测某个id是否是之前声名的变量名,函数名

  9. fillSymbolTable(char * name,char * alias,int level,int type,char flag,int offset)
     添加一行符号到符号表
    在这里插入图片描述

  10. fill_Temp(char * name,int level,int type,char flag,int offset)
     添加一行静态变量到符号表
    在这里插入图片描述

  11. ext_var_list(struct ASTNode * T)
     处理变量列表(里面是一个迭代,可以处理一串变量

  12. match_param(int i,struct ASTNode * T)
     检验函数调用时的传入参数是否类型对应,数量对应

  13. boolExp(struct ASTNode * T)
     处理布尔表达式的符号表定义

  14. Exp(struct ASTNode * T)
     处理普通表达式的符号表定义

  15. semantic_Analysis(struct ASTNode * T)
     对抽象语法树的先根遍历,按display的控制结构修改完成符号表管理和语义检查和TAC生成(语句部分)

  16. semantic_Analysis0(struct ASTNode * T)
     给符号表添加一些预先设置的项之后调用semantic_Analysis,最后再调用

在这里插入图片描述

第二步

修改ast.c文件

  1. 第578-580行修改
     可以看到他已经说明了这几个不完整,需要补充
    在这里插入图片描述
    我们修改时,直接调用boolExp就会可以了
    在这里插入图片描述

  2. 第605行修改
    在这里插入图片描述
    我们修改时,直接调用boolExp就会可以了
    在这里插入图片描述

  3. 第608行修改
    在这里插入图片描述
    这里是一个负号,但是我并不想要自己去写代码hhhhh
    简单处理一下,之后再完善吧
    在这里插入图片描述

代码补充先到这里,接下来我想给大家展示一下静态语义检测的错误输出

第三步

查看ast.c文件

  1. 在ast.c检索semantic_error
    比如第614行的这个semantic_error,可知他上面代码检测的是调用未定义的函数的情况。
    在这里插入图片描述

量身定做test.c文件

  1. 在第4行插入一个未定义的函数被调用的错误语句
    在这里插入图片描述
结果检验

 依次运行

flex lex.l
bison -d parser.y
gcc -o parser lex.yy.c parser.tab.c ast.c
parser test.c

在这里插入图片描述
 发现有乱码,使用chcp 65001切换到UTF-8编码界面
在这里插入图片描述

 发现错误被检测到了且输出成功。

在ast.c里面有13个semantic_error输出,如果每一个都定制一个test.c,我感觉实验二的分数应该是稳了。就这样吧,那些test.c大家自由发挥呱
计组考试前木得更新了...

写在结尾

希望以上可以帮到你!
如有错误,或不同想法,欢迎指出,互相学习共同进步!

源码资源下载:点赞关注后即可免费下载,下载戳我!

如果不可以的话,戳这里百度网盘 提取码:hust

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值