编译原理(6)——一维数组赋值

本文档详细记录了一次《编译技术》实验的过程,主要涉及词法语法分析器的修改,以支持一维数组赋值操作。作者通过LEX/FLEX和YACC/BISON工具处理移进/归约冲突,并调整文法规则和优先级。实验中遇到的问题包括空语句优先级设定导致的冲突,以及在AST生成和测试代码中的相应调整。最终成功实现一维数组的赋值输出,并给出了错误排查和结果检验的步骤。

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

注:
课程:《编译技术》上机
实验一:词法语法分析器的设计与实现,生成抽象语法树。
建议使用词法语法分析程序生成工具如:LEX/FLEX , YACC/BISON等专业工具完成。

此处完成补充 一维数组赋值 的操作

另外:希望大噶支持下我滴个人博客网站:www.xyzsh.cn
文章有更新的话,个人网站会优先发出来的(优快云有审核)
希望童鞋们可以去踩一踩~!

前期准备
  1. 已经将整个文件夹都备好份,以供魔改后的回溯
    在这里插入图片描述
开始实验
第一步

修改parser.y文件(parser.y是C语言文法)

  1. 第133行修改Exp语法
     新增的语法 匹配 一维数组赋值部,即{ 8,2,3 }
    在这里插入图片描述

  2. 第135-138行插入Arraylist的文法
     通过迭代达到可以匹配多个参数的目的
     那个空语句我注释起来了,本来是想要支持的,但是它支持空后会与其他的产生冲突,比如函数体是支持空的,当某个函数体为空,那么文法检测时检测到左大括号{后,都想要移进右大括号},但是采用哪个文法移进呢(他就有了两个选择1.函数体为空2.数组赋值体为空),需要设置优先级解决。emmmmm我懒了
    在这里插入图片描述

  3. 第26行补充定义非终结符名
    在这里插入图片描述

  4. 第38行补充定义状态名
    在这里插入图片描述

  5. 第42、43、50、57行补充优先级
     补充定义一下优先级,因为如果不定义的话会出现移进/规约冲突
    一会儿我给你们截个图看一看移进归约冲突张啥子样子hhhhh
    在这里插入图片描述

  6. 第103行修改DefList优先级
     插入%prec ID表明该条语句有着和ID一样的优先级(具体为什么是ID,emmmm只能说是分析加尝试,我的头就是这么秃的hhhhhh
    在这里插入图片描述
    参观开始啦!
     移进/归约冲突的报错,然后我们运行bison -d -v parser.y,他会输出一个文件parser.output
    在这里插入图片描述
    打开文件后他告诉我们 状态47发生了12个移进归约冲突
    在这里插入图片描述
     来到状态47,拿INT举例,它既可以移进shift,又可以使用规则29归约reduce
    于是就产生了一个冲突。
    在这里插入图片描述
     我们可以再去看规则29时可以发现,是DefList的空语句跟其他语句产生的冲突,所以我们要调整它或者与他产生冲突的语句的优先级(只要优先级不同就不会冲突),但是还是要注意优先级也不是随便调的,比如这个空语句你如果调太高的话,识别时看到左大括号,下一个就想要右大括号,而不想要检测其他语句,也会产生错误。
    不过这种错误都是在最后一步parser test.c时爆出来的
    在这里插入图片描述
     好了参观就到此为止了hhhh

第二步

修改ast.c文件(ast.c定义了树的生成与输出)

  1. 在第148-151行插入ARRAY的输出
     感觉大家应该都懂了,就不解释了
    在这里插入图片描述
  2. 在第152-154行插入ARRAY_LIST的输出
    在这里插入图片描述

补:解释一下 printf(“% * cCHAR:%c\n”,indent,’ ',T->type_char);的含义:先打印indent个空格,再打印CHAR:%c
默认低一级的话,往后移3个空格

第三步

修改test.c文件(测试代码)

  1. 第14行是测试一维数组局部变量声名时赋值
  2. 第42行是测试一维维数组赋值
    在这里插入图片描述
结果检验

 依次运行

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编码界面
在这里插入图片描述

 一维数组的赋值输出完成!
在这里插入图片描述
 一维数组局部变量声明时赋值也可以输出!

 一维数组赋值补充完成啦!这里就稍微难一点了,需要权衡优先级之类的,而且优先级也不是很好调节,太高太低都不行,不过难度还行不算大,我当时耗在这里的时间比多维数组赋值少得多得多....加油吧!奥力给!

近期可能不会更新了,我要去gun去复习了~

写在结尾

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

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

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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值