编译原理(4)——自增自减

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

此处完成补充 自增自减 的操作

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

前期准备
  1. 已完成上一篇文章中的补充char操作
  2. 已经将整个文件夹都备好份,以供魔改后的回溯
    在这里插入图片描述
开始实验
第一步

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

  1. 第47行插入对字符串++的识别
  2. 第48行插入对字符串–的识别
    在这里插入图片描述
第二步

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

  1. 第35行插入单词声名DPLUS DMINUS
    在这里插入图片描述
  2. 第48行定义优先级
     自增自减的优先级很高,与负号(UMINUS),非号(NOT)优先级相同
    在这里插入图片描述
  3. 第117-120行插入自增的文法
     为了区分前自增与后自增,我又分别设了两个状态DPLUS_BEFORE DPLUS_AFTORE
    在这里插入图片描述
  4. 第38行补充定义状态名
    在这里插入图片描述
第三步

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

  1. 在第152-155行插入DPLUS\DMINUS的输出
     他们与NOT、UMINUS共用一套输出即可
    在这里插入图片描述

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

第四步

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

  1. 第18-21行是测试自增自减单独出现时
  2. 第23行是测试在自增复合语句中
    在这里插入图片描述
结果检验

 依次运行

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

 自增自减输出完成!
 在复合语句也可以输出!

自增自减补充完成啦!胜利就在眼前,加油呀!

写在结尾

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

猜你喜欢

转载自blog.csdn.net/zsh1184528359/article/details/109635301