当前位置:文档之家› 武汉理工大学编译原理实验报告

武汉理工大学编译原理实验报告

武汉理工大学学生实验报告书实验课程名称编译原理课程实验开课学院计算机科学与技术学院指导老师姓名饶文碧学生姓名徐强国学生专业班级软件 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)文法分析的原理和过程理解更进一步巩固,算是做到了学以致用。

在做实验的过程中,我发现自己经常忽略对于细节的处理,从而经常导致我要修改一些隐藏的低级错误才能正确运行程序,如中英文问题还有误删中括号等。

在今后的学习中,我会注意改正不足,稳步向前。

核心代码:E(); //从首个推导式E 开始if ((a[_advance] == '#'))_export << "The senetence is right,success!\n";else_export << "No the signal of #,fail\n";void E() //功能识别函数{_export << "E->TE'\n";T();E1();}void E1(){if (a[_advance] == '+'){}else } _export << "E'->+TE\n"; //输出使用E'规则_advance++; //如果是“+”,读取下一字符T(); //调用右部非终结符规则E1();_export << "E'->ε\n";void T(){_export << "T->FT'\n";F();T1();}void T1(){if (a[_advance] == '*'){}else } _export << "T'->*FT'\n"; _advance++;F();T1();_export << "T'->ε\n";void F(){if (a[_advance] == 'i'){_export << "F->i\n";_advance++;}else if (a[_advance] == '('){_advance++;E();if (a[_advance] == ')'){}else{} } _export << "F->(E)\n";_advance++;_export << "\n()nis not matching,error!"; exit(0);else{_export << "\n() is not matching,error!\n";exit(0);}}第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)算法流程:输入为一个标准的算术表达式,输出为四元式,按行区分,如输入:Y=a+b*(c-d*e/f+g*(h-i*x))二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)通过栈和优先级的判断可以很好地实现翻译表达式,产生四元式。

相关主题