编译原理(5)——多维数组定义

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

此处完成补充 多维数组定义 的操作

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

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

修改lex.l文件(lex描述文件给出了每一类词法单元的规则)

  1. 第58-59行插入对字符串中括号的识别
    在这里插入图片描述
第二步

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

  1. 第35行插入单词声名LB RB
    在这里插入图片描述

  2. 第70行修改VarDec的语法
     新增的语法 匹配 数组的变量声明
    在这里插入图片描述

  3. 第117-120行插入前曾的文法
     DimensionList匹配数组的 [?]
    在这里插入图片描述

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

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

第三步

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

  1. 在第140-142行插入DIMENSION的输出
     感觉大家应该都懂了,就不解释了
    在这里插入图片描述
  2. 在第140-142行插入DIMENSION_LIST的输出
     提个问题,为什么display()里第一个参数是T->ptr[1]而不是ptr[0]呢?
    在这里插入图片描述
  3. 第124行插入修改DEC_LIST的输出
     DEC_LIST是内部变量的输出控制,我们需要添加一种判断状态是DIMENSION时的情况。如果不添加的话,你在声名内部变量时是无法识别的
    在这里插入图片描述

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

第四步

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

  1. 第4行是测试一维数组定义声名(外部变量)
  2. 第5-6行是测试多维维数组定义声名(外部变量)
  3. 第13行是测试多维维数组定义声名(局部变量)
    在这里插入图片描述
结果检验

 依次运行

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

 一维数组定义声名(外部变量)输出完成!
 多维数组定义声名(外部变量)也可以输出!
在这里插入图片描述
 多维数组定义声名(内部变量)也可以输出!

多维数组定义补充完成啦!似不似感觉自己的技术很厉害了hhhhh

写在结尾

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

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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值