2022年编译原理实验——语法分析器报告 .pdf
组员学号姓名实验名称对各算术表达式进行语法分析实验室实验目的或要求实验目的:1、掌握语法分析器生成工具的使用和了解编译器的设计;2、了解自上而下语法分析器的构造过程;3、能够构造 LR 分析表,编写由该分析表驱动的语法分析器程序;4、借助语法制导翻译,可在语法分析的同时,完成对语义的翻译;5、借助语法分析,设计一个表达式的判断分析器,即从键盘上输入算术表达式,分析器将显示该表达式的正确与否。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 实验原理(算法流程)实验算法流程图如下所示:开始输入表达式表达式保存到数ch第一个元素为)+ -*/YChi= (i+YNChi=NULLNChi是 09i+YChi是 09Chi=+ -*/)N多了+ -*/)Y其他错误NYChi=* /Ni+YChi=+ -*/NY多了+ -*/Chi=+ -NNChi=)Y少了)N错误首部多了) + -*/结束名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 程序界面(效果图)实验结果界面:只选择几个典型的例子进行分析,可进行任意表达式输入。1)未进行语法分析时的界面;2)输入正确的表达式 (1+2)*(6-3)+1 进行语法分析时的界面结果;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 程序界面(效果图)3)输入错误的表达式1*2+(2+3 并进行语法分析时的界面结果;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - 程序界面(效果图)4)输入错误的表达式1+(+5+6)并进行语法分析时的界面结果;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - 程序代码 #include stdafx.h #include grammer.h #include mfc_ 语法分析器 .h #include mfc_ 语法分析器Dlg.h int flag; int i,j; int length; CString string; int grammer(CString str) i=0; flag=0; char chMAX; length=str.GetLength(); strcpy(ch,str); if(length!=0) F(ch); if(flag=0) MessageBox(NULL, 输入表达式符合文法, 正确 ,MB_OK|MB_ICONINFORMATION); /str=ch; /return flag; else MessageBox(NULL, 表达式为空 ,提示 ,MB_OK|MB_ICONWARNING); /MessageBox(NULL, 表达式为空 ,提示 ,MB_OK|MB_ICONERROR); return -1; return flag; void F(char ch) if(ch0=+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - 程序代码flag=0; MessageBox(NULL, 输入表达式不符合文法0,错误 ,MB_OK|MB_ICONERROR); MessageBox(NULL, 开始处多了 +, 提示 ,MB_OK|MB_ICONINFORMATION); flag=1; else if(ch0=-) flag=0; MessageBox(NULL, 输入表达式不符合文法0, 错误 ,MB_OK|MB_ICONERROR); MessageBox(NULL, 开始处多了 -, 提示 ,MB_OK|MB_ICONINFORMATION); flag=1; else if(ch0=*) flag=0; MessageBox(NULL, 输入表达式不符合文法0, 错误 ,MB_OK|MB_ICONERROR); MessageBox(NULL, 开始处多了 *, 提示,MB_OK|MB_ICONINFORMATION); flag=1; else if(ch0=/) flag=0; MessageBox(NULL, 输入表达式不符合文法0, 错误 ,MB_OK|MB_ICONERROR); MessageBox(NULL, 开始处多了 /, 提示 ,MB_OK|MB_ICONINFORMATION); flag=1; else if(ch0=) flag=0; MessageBox(NULL, 输入表达式不符合文法0, 错误 ,MB_OK|MB_ICONERROR); MessageBox(NULL, 开始处多了 ), 提示 ,MB_OK|MB_ICONINFORMATION); flag=1; /* 上述为对第一个字符的特殊处理*/ else if(chi!=NULL) if(chi=() i+; F(ch); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - 程序代码if(chi!=) if(flag=0) MessageBox(NULL,输入表达式不符合文法1,错误,MB_OK|MB_ICONERROR); MessageBox(NULL, 少了 ), 提示 ,MB_OK|MB_ICONINFORMATION); flag=1; else i+; if(chi!=NULL) T(ch); else if(chi=0) while(chi=0) i+; if(chi!=NULL) T(ch); else if(flag=0) if(chi!=NULL&chi!=) MessageBox(NULL, 输入表达式不符合文法2.1, 错误 ,MB_OK|MB_ICONERROR); if(chi= ) MessageBox(NULL,含有空格,提示,MB_OK|MB_ICONINFORMATION); else if(chi=+) MessageBox(NULL,多了+号,提示,MB_OK|MB_ICONINFORMATION); else if(chi=-) MessageBox(NULL,多了-号,提示,MB_OK|MB_ICONINFORMATION); else if(chi=*) MessageBox(NULL,多了*号,提示,MB_OK|MB_ICONINFORMATION); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - 程序代码else if(chi=/) MessageBox(NULL,多了/号,提示,MB_OK|MB_ICONINFORMATION); else if(chi=NULL) MessageBox(NULL, 输入表达式不符合文法2.2, 错误 ,MB_OK|MB_ICONERROR); if(chi-1= ) MessageBox(NULL,含有空格,提示,MB_OK|MB_ICONINFORMATION); else if(chi-1=+) MessageBox(NULL,多 了 最 后 的+ 号 ,提 示,MB_OK|MB_ICONINFORMATION); else if(chi-1=-) MessageBox(NULL,多 了 最 后 的- 号 ,提示,MB_OK|MB_ICONINFORMATION); else if(chi-1=*) MessageBox(NULL,多 了 最 后 的* 号 ,提 示,MB_OK|MB_ICONINFORMATION); else if(chi-1=/) MessageBox(NULL,多了 最 后的/ 号 ,提示,MB_OK|MB_ICONINFORMATION); else if(chi!=NULL&chi=) MessageBox(NULL, 输入表达式不符合文法2.3, 错误 ,MB_OK|MB_ICONERROR); if(chi-1= ) MessageBox(NULL,含有空格,提示,MB_OK|MB_ICONINFORMATION); else if(chi-1=() MessageBox(NULL,含有一对空 括号,提示,MB_OK|MB_ICONINFORMATION); else if(chi-1=+) MessageBox(NULL,多 了 最 后 的+ 号 ,提 示,MB_OK|MB_ICONINFORMATION); else if(chi-1=-) MessageBox(NULL,多 了 最 后 的- 号 ,提示,MB_OK|MB_ICONINFORMATION); else if(chi-1=*) MessageBox(NULL,多 了 最 后 的* 号 ,提 示,MB_OK|MB_ICONINFORMATION); else if(chi-1=/) MessageBox(NULL,多了 最 后的/ 号 ,提示,MB_OK|MB_ICONINFORMATION); flag=1; void T(char ch) if(chi=*|chi=/) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - 程序代码 i+; if(chi!=NULL&chi!=+&chi!=-&chi!=*&chi!=/) F(ch); else if(flag=0) MessageBox(NULL, 输入表达式不符合文法3,错误 ,MB_OK|MB_ICONERROR); if(chi= ) MessageBox(NULL, 含有空格 , 提示,MB_OK|MB_ICONINFORMATION); else if(chi=+) MessageBox(NULL,多了+号,提示,MB_OK|MB_ICONINFORMATION); else if(chi=-) MessageBox(NULL,多了-号,提示,MB_OK|MB_ICONINFORMATION); else if(chi=*) MessageBox(NULL,多了*号,提示,MB_OK|MB_ICONINFORMATION); else if(chi=/) MessageBox(NULL,多了/号,提示,MB_OK|MB_ICONINFORMATION); flag=1; else E(ch); void E(char ch) if(chi=+|chi=-) i+; if(chi!=NULL&chi!=+&chi!=-&chi!=*&chi!=/) F(ch); else if(flag=0) if(chi!=NULL) MessageBox(NULL, 输入表达式不符合文法4.1, 错误 ,MB_OK|MB_ICONERROR); if(chi= ) MessageBox(NULL,含有空格,提示,MB_OK|MB_ICONINFORMATION); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - 程序代码else if(chi=+) MessageBox(NULL,多了+号,提示,MB_OK|MB_ICONINFORMATION); else if(chi=-) MessageBox(NULL,多了-号,提示,MB_OK|MB_ICONINFORMATION); else if(chi=*) MessageBox(NULL,多了*号,提示,MB_OK|MB_ICONINFORMATION); else if(chi=/) MessageBox(NULL,多了/号,提示,MB_OK|MB_ICONINFORMATION); else if(chi=NULL) MessageBox(NULL, 输入表达式不符合文法4.2, 错误 ,MB_OK|MB_ICONERROR); if(chi-1= ) MessageBox(NULL,含有空格,提示,MB_OK|MB_ICONINFORMATION); else if(chi-1=+) MessageBox(NULL,多 了 最 后 的+ 号 ,提 示,MB_OK|MB_ICONINFORMATION); else if(chi-1=-) MessageBox(NULL,多 了 最 后 的- 号 ,提示,MB_OK|MB_ICONINFORMATION); else if(chi-1=*) MessageBox(NULL,多 了 最 后 的* 号 ,提 示,MB_OK|MB_ICONINFORMATION); else if(chi-1=/) MessageBox(NULL,多了 最 后的/ 号 ,提示,MB_OK|MB_ICONINFORMATION); flag=1; else if(chi!=) if(flag=0) MessageBox(NULL, 输入表达式不符合文法5, 错误 ,MB_OK|MB_ICONERROR); if(chi=(&chi+2=) MessageBox(NULL,含 有 一 对 多 余 的 括 号 , 提 示,MB_OK|MB_ICONINFORMATION); else MessageBox(NULL, 其他类型的错误, 提示 ,MB_OK|MB_ICONINFORMATION); flag=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - 实验结果分析及心得体会实验结果分析:本次实验借助语法分析,设计一个表达式的判断分析器,从键盘上输入算术表达式,分析器对该表达式的正确与否进行分析。若是正确的算术表达式,则符合文法,输出正确;若是错误的算术表达式,则表达式不符合文法,输出其错误之处并显示异常。该程序执行过程无误,输出结果正常。但由于我们的疏忽,该程序未能完全满足实验要求,并不能够构造其LR 分析表,并不是由该分析表驱动的语法分析器程序,这是本次实验的一个缺陷。心得体会:通过本次实验让我们了解到了如何进行设计,编制并调试语法分析程序,掌握语法分析器生成工具的使用和了解编译器的设计。也加深对语法分析原理的理解,熟悉了构造语法分析程序的相关原理和使用高级语言直接编写此次语法分析程序的方法。在此次实验中,我们也了解到了进行实验必须具备的严谨性和准确性,也懂得了团结合作的重要,这为我们将来的编写程序提供了宝贵经验。成绩评定教师签名:年月日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -