2018改版-武汉理工大学横版成绩单
- 格式:doc
- 大小:80.00 KB
- 文档页数:2
武汉理⼯⼤学编译原理实验报告武汉理⼯⼤学学⽣实验报告书实验课程名称编译原理课程实验开课学院计算机科学与技术学院指导⽼师姓名饶⽂碧学⽣姓名徐强国学⽣专业班级软件 16022018 —2019 学年第1 学期实验课程名称:编译原理依次输⼊关键字,⾃定义标识符 BBBJKJL KJKJ4234,整数 3432,特殊符号和其他符号:. {} []。
⼆、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)输出为:三、实验⼩结、建议及体会通过这次的词法分析实验,我遇到了不少问题。
对于输⼊字符串的直接处理,⾸先是分类情况的不完整(起初忽略了对关键字的判断),造成输出结果与预想有很⼤偏差。
总结下:作为编译的第⼀步,词法分析将⾼级语⾔⼀步步分解,然后转化为⾃⼰的语⾔,这是⼀个严谨有⼗分有趣的过程。
核⼼代码:struct word //存储关键字,特殊符号{int code;char T[max];};word important[5]; //结构体变量存储关键字word num; //结构体变量存储数字word identifier; //结构体变量存储标识符word special_symbol[7]; //结构体变量存储特殊符号int function(word* a, word b, word c, word* d, char* input, int k){char getword[max];int j = 0;if (input[j] == ' ') // 判断空格{k = k + j + 1;function(a, b, c, d, input + j + 1, k);}else if (input[j] == '=' || input[j] == '+' || input[j] == ',' || input[j] == '(' || input[j] == ')') //判断特殊符号{if (input[j] == '*'){getword[j] = input[j];j = j + 1;if (input[j] == '*'){} else { }else{}getword[j] = input[j];cout << '(' << d[3].code << ',' << d[3].T << ')' << endl; j = j - 1;cout << '(' << d[2].code << ',' << d[2].T << ')' << endl; getword[j] = input[j];for (int i = 0; i < 7; i++){if (i == 3)continue;elseif (d[i].T[0] == getword[0]){cout << '(' << d[i].code << ',' << d[i].T << ')' << endl; break;}}}k = k + j + 1;function(a, b, c, d, input + j + 1, k);}else if (input[j] >= '0' && input[j] <= '9') //判断数字{getword[j] = input[j];j = j + 1;while (input[j] >= '0' && input[j] <= '9'){getword[j] = input[j];j = j + 1;}j = j - 1;getword[j + 1] = '\0';cout << "(" << b.code << ',' << getword << ')' << endl;k = k + j + 1;function(a, b, c, d, input + j + 1, k);}else if (input[j] >= 'A' && input[j] <= 'Z' || input[j] >= 'a' && input[j] <= 'z') //判断字符{getword[j] = input[j];j = j + 1;while (input[j] >= 'A' && input[j] <= 'Z' || input[j] >= 'a'&&input[j] <= 'z' || input[j] >= '0' && input[j] <= '9') {getword[j] = input[j];j = j + 1;}j = j - 1;getword[j + 1] = '\0';if (!strncmp(getword, a[0].T, 3))cout << '(' << a[0].code << ',' << a[0].T << ')' << endl;else if (!strncmp(getword, a[1].T, 2))cout << '(' << a[1].code << "," << a[1].T << ')' << endl;else if (!strncmp(getword, a[2].T, 2))cout << '(' << a[2].code << "," << a[2].T << ')' << endl;else if (!strncmp(getword, a[3].T, 4))cout << '(' << a[3].code << "," << a[3].T << ')' << endl;else if (!strncmp(getword, a[4].T, 3))cout << '(' << a[4].code << "," << a[4].T << ')' << endl;elsecout << '(' << c.code << ',' << getword << ')' << endl;k = k + j + 1; function(a, b, c, d, input + j + 1, k);}else if (input[j] == '\0') //判断是否为结束符return 0;else //出错处理{cout << "第" << k + 1 << "个字符出错" << endl;k = k + j + 1;function(a, b, c, d, input + j + 1, k);}}第⼆部分:实验调试与结果分析(可加页)⼀、调试过程(包括调试⽅法描述、实验数据记录,实验现象记录,实验过程发现的问题等)算法流程截图:输⼊⼀个正确句⼦:i+i*i# 输⼊⼀个错误句⼦:i*i*(i+#输⼊⼀个⽆#结束的错误句⼦:i*i*i⼆、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)正确结束:错误句⼦:⽆#:三、实验⼩结、建议及体会通过本次实验,我收获了很多,⾸先对 LL(1)⽂法分析的原理和过程理解更进⼀步巩固,算是做到了学以致⽤。