编译原理实验二(2)——补充空缺代码
注:
课程:《编译技术》上机
实验二:符号表管理与语义检查。对抽象语法树进行遍历,完成符号表的管理与相关属性计算。通过对符号表的管理实现语义分析。
此处完成补充 原始空缺代码 的操作
前期准备
- 已经将整个文件夹都备好份,以供魔改后的回溯
开始实验
第一步
解释ast.c文件函数
-
strcat0(char s1,char s2)
连接两个char数组 -
newAlias()
生成别名编号,比如下面的递增的V1, v2,…
-
newLabel()
生成label编号 -
newTemp()
生成temp编号,比如
-
以下是与中间代码生成有关的函数,可以先不了解
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) -
semantic_error(int line,char msg1,char msg2)
划重点,这个要记住,他是将错误输出的函数
我们这个实验二,老师也说了主要是看能检测出多少种静态语义错误,每种错误被检测到都会调用这个函数的。
而且我们这次不是打算偷一丢丢懒嘛,所以我没有打算自己补充检测,先把它给出的错误每一个都搞一个测试用例,这样子分数就得到了。一会ctrl+f搜索这个函数名就可以看到有多少种预设的错误检测。 -
prn_symbol()
显示符号表 -
searchSymbolTable(char * name)
用于检测某个id是否是之前声名的变量名,函数名 -
fillSymbolTable(char name,char alias,int level,int type,char flag,int offset)
添加一行符号到符号表
-
fill_Temp(char * name,int level,int type,char flag,int offset)
添加一行静态变量到符号表
-
ext_var_list(struct ASTNode * T)
处理变量列表(里面是一个迭代,可以处理一串变量 -
match_param(int i,struct ASTNode * T)
检验函数调用时的传入参数是否类型对应,数量对应 -
boolExp(struct ASTNode * T)
处理布尔表达式的符号表定义 -
Exp(struct ASTNode * T)
处理普通表达式的符号表定义 -
semantic_Analysis(struct ASTNode * T)
对抽象语法树的先根遍历,按display的控制结构修改完成符号表管理和语义检查和TAC生成(语句部分) -
semantic_Analysis0(struct ASTNode * T)
给符号表添加一些预先设置的项之后调用semantic_Analysis,最后再调用
第二步
修改ast.c文件
-
第578-580行修改
可以看到他已经说明了这几个不完整,需要补充
我们修改时,直接调用boolExp就会可以了
-
第605行修改
我们修改时,直接调用boolExp就会可以了
-
第608行修改
这里是一个负号,但是我并不想要自己去写代码hhhhh
简单处理一下,之后再完善吧
代码补充先到这里,接下来我想给大家展示一下静态语义检测的错误输出
第三步
查看ast.c文件
- 在ast.c检索semantic_error
比如第614行的这个semantic_error,可知他上面代码检测的是调用未定义的函数的情况。
量身定做test.c文件
- 在第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大家自由发挥呱
计组考试前木得更新了...
写在结尾
希望以上可以帮到你!
如有错误,或不同想法,欢迎指出,互相学习共同进步!
目前为止有一条评论