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

此处完成补充 原始空缺代码 的操作
前期准备
  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大家自由发挥呱
计组考试前木得更新了...

写在结尾

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