注:
课程:《编译技术》上机
实验一:词法语法分析器的设计与实现,生成抽象语法树。
建议使用词法语法分析程序生成工具如:LEX/FLEX , YACC/BISON等专业工具完成。
此处完成补充 自增自减 的操作
另外:希望大噶支持下我滴个人博客网站:www.xyzsh.cn
文章有更新的话,个人网站会优先发出来的(CSDN有审核)
希望童鞋们可以去踩一踩~!
前期准备
- 已完成上一篇文章中的补充char操作
- 已经将整个文件夹都备好份,以供魔改后的回溯
开始实验
第一步
修改lex.l文件(lex描述文件给出了每一类词法单元的规则)
- 第47行插入对字符串++的识别
- 第48行插入对字符串–的识别
第二步
修改parser.y文件(parser.y是C语言文法)
- 第35行插入单词声名DPLUS DMINUS
- 第48行定义优先级
自增自减的优先级很高,与负号(UMINUS),非号(NOT)优先级相同
- 第117-120行插入自增的文法
为了区分前自增与后自增,我又分别设了两个状态DPLUS_BEFORE DPLUS_AFTORE
- 第38行补充定义状态名
第三步
修改ast.c文件(ast.c定义了树的生成与输出)
- 在第152-155行插入DPLUS\DMINUS的输出
他们与NOT、UMINUS共用一套输出即可
补:解释一下 printf("% * cCHAR:%c\n",indent,’ ',T->type_char);的含义:先打印indent个空格,再打印CHAR:%c
默认低一级的话,往后移3个空格
第四步
修改test.c文件(测试代码)
- 第18-21行是测试自增自减单独出现时
- 第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编码界面
自增自减输出完成!
在复合语句也可以输出!
自增自减补充完成啦!胜利就在眼前,加油呀!
写在结尾
希望以上可以帮到你!
如有错误,或不同想法,欢迎指出,互相学习共同进步!