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

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


前期准备
  1. 已经将整个文件夹都备好份,以供魔改后的回溯
开始实验
第一步

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

  1. 第138行修改Exp语法
     注意:将ArrayList改为了ArrayListN
  2. lua 多维数组 to json文件 多维数组怎么赋值_gcc/gdb编译调试

  3. 第41行补充优先级LCOMMA定义
  4. lua 多维数组 to json文件 多维数组怎么赋值_多维数组_02

  5. 第140-143行插入ArraylistN的文法
     第一行文法通过迭代达到可以匹配多个维度的赋值的目的,可以类比{{1,2},{2,3},{3,4}},匹配的是最外层大括号包括的全部内容
     第三行匹配的是一维数组的赋值内容
    %prec LCOMMA圈起来,重点要考。自己想一下为什么要加这个,如果不加后果会怎样,加别的符号行不行
  6. lua 多维数组 to json文件 多维数组怎么赋值_多维数组_03

  7. 第144-145行插入Arraylist1的文法
  8. lua 多维数组 to json文件 多维数组怎么赋值_一维数组_04

  9. 第26行补充定义非终结符名
  10. lua 多维数组 to json文件 多维数组怎么赋值_赋值_05

  11. 第38行补充定义状态名ARRAY_1 ARRAY_N
     补充定义ARRAY_1 ARRAY_N
  12. lua 多维数组 to json文件 多维数组怎么赋值_多维数组_06

第二步

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

  1. 在第155-157行插入ARRAY_N的输出
     感觉大家应该都懂了,就不解释了
  2. lua 多维数组 to json文件 多维数组怎么赋值_一维数组_07

  3. 在第158-159行插入ARRAY_1的输出
     问:为什么没有printf()?
  4. lua 多维数组 to json文件 多维数组怎么赋值_gcc/gdb编译调试_08

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

第三步

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

  1. 第15行是测试多维数组局部变量声名时赋值
  2. 第44行是测试多维维数组赋值
结果检验

 依次运行

flex lex.l
bison -d parser.y
gcc -o parser lex.yy.c parser.tab.c ast.c
parser test.c

lua 多维数组 to json文件 多维数组怎么赋值_gcc/gdb编译调试_09


 发现有乱码,使用chcp 65001切换到UTF-8编码界面

lua 多维数组 to json文件 多维数组怎么赋值_gcc/gdb编译调试_10

 多维数组的赋值输出完成!

lua 多维数组 to json文件 多维数组怎么赋值_多维数组_11

 一维数组局部变量声明时赋值也可以输出!

这一步是我花时间最多的步骤了,可能你看教程步数并没有感觉出来,但是他确实很难,每一步都会出很多bug...累瘫

写在结尾

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


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