算术表达式语法检查实验报告.docx
- 文档编号:10437889
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:25
- 大小:22.11KB
算术表达式语法检查实验报告.docx
《算术表达式语法检查实验报告.docx》由会员分享,可在线阅读,更多相关《算术表达式语法检查实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
算术表达式语法检查实验报告
中南民族大学计算机科学学院本科课程设计
任务书
设计名称:
算术表达式语法检查
指导教师:
下达时间:
2015-5-8
学生姓名:
学号:
专业:
一、课程设计的基本要求
根据所学知识,编写指定题目的C++语言程序,并规范地完成课程设计报告。
通过课程设计,加深对《C++面向对象程序设计》课程所学知识的理解,熟练掌握和巩固C++语言的基本知识和语法规范,掌握C++语言的基础知识,理解面向对象系统的封装性、继承性和多态性;熟练使用C语言中的函数、数组、指针、链表和字符串等基本知识;掌握类的定义、标准String类和向量;理解掌握友元函数和重载操作符,动态数组;理解掌握继承和多态性;掌握模版的使用;能够进行程序调试过程中的异常处理;进一步掌握利用C++进行类的定义和操作方法;进一步掌握类的继承和派生方法;进一步理解虚函数和多态;综合利用上述知识,学习设计并编写面向对象的C++简单应用程序;培养解决复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等)。
学会编制结构清晰、风格良好、数据结构适当的C++语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。
具体要求如下:
1、采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。
学生也可根据自己对题目的理解增加新的功能模块(视情况可另外加分)。
2、系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行。
3、程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)。
4、编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等);
5、写出规范的课程设计报告,具体要求见相关说明文档。
二、课程设计的主要内容
【问题描述】
算术表达式语法检查。
【功能要求】
(1)键盘读入一个四则运算算术表达式,对其进行语法检查;
(2)算术表达式允许嵌套,如果出错,指出出错位置;
(3)不需要计算结果;
(4)尽量不使用栈。
程序:
(其余的你们自己写)
voidmain()//主函数
{
intlen;
intf=1;
cout< "< gets(str); len=strlen(str); str[len]='^'; cout< system("pause"); cout< cout<<"***********************词法分析开始*****************"< f=cifa_main(); if(f==0)return; cout< system("pause"); cout< cout<<"***********************语法分析开始*****************"< f=yufa_main(); if(f==0)return; cout< system("pause"); cout< } intF1()//F->(E)|标识符|无符号整数 { if((strcmp(cifa_p->word,"(")==0)) { advance(); strcpy(F_name,cifa_p->word); strcpy(E_name,F_name); E1(); if((strcmp(cifa_p->word,")")==0)) { advance(); strcpy(F_name,E_name); return (1); } else { cout<<"ERROR"< return(0); } } elseif(cifa_p->type==1||cifa_p->type==2) { strcpy(F_name,cifa_p->word); advance(); return (1); } elsereturn0; } intT1()//T->F*T|F/T|F { yuyi*p=newyuyi; F1(); strcpy(p->op1,F_name); if(strcmp(cifa_p->word,"*")==0) { advance(); T1(); p->next=NULL; p->op='*'; strcpy(p->op2,T_name); T_name[0]='t'; T_name[1]=++count; T_name[2]='\0'; strcpy(p->result,T_name); yuyi_add(p); return (1); } elseif(strcmp(cifa_p->word,"/")==0) { advance(); T1(); p->next=NULL; p->op='/'; strcpy(p->op2,T_name); T_name[0]='t'; T_name[1]=++count; T_name[2]='\0'; strcpy(p->result,T_name); yuyi_add(p); return (1); } else { strcpy(T_name,F_name); return (1); } } intE1()//E->T+E|T-E|T { yuyi*p=newyuyi; T1(); strcpy(p->op1,T_name); if(strcmp(cifa_p->word,"+")==0) { advance(); E1(); p->next=NULL; p->op='+'; strcpy(p->op2,E_name); E_name[0]='t'; E_name[1]=++count; E_name[2]='\0'; strcpy(p->result,E_name); yuyi_add(p); return (1); } elseif(strcmp(cifa_p->word,"-")==0) { advance(); E1(); p->next=NULL; p->op='-'; strcpy(p->op2,E_name); E_name[0]='t'; E_name[1]=++count; E_name[2]='\0'; strcpy(p->result,E_name); yuyi_add(p); return (1); } else { strcpy(E_name,T_name); return (1); } } intyufa_main()//语法分析主程序 { intn; cifa*p=newcifa; strcpy(p->word,"#");//对词法分析产生的结果链表进行处理 p->type=-1; p->next=NULL; cifa_add(p); cifa_p=cifa_head; cout< yufa_zfc_disp(cifa_head->next); cout<<"的递归分析过程如下: "< cout< cout<<'\t'<<"步骤\t"<<'\t'<<"产生式"< advance(); n=E(); if(n==0) { cout<<'\t'< "< cout< return(0); } elseif(n==1) { cout<<'\t'< "< cout< return (1); } } //**********************语义分析*************************************** yuyi*yuyi_add(yuyi*p)//在四元式链表末添加一个结点 { yuyi_end->next=p; yuyi_end=p; returnyuyi_head; } voidyuyi_sys_disp()//输出四元式链表 { yuyi*p; p=yuyi_head->next; while(p! =NULL) {cout<<'('<<'\t'< p=p->next; } cout< } intF()//F->(E)|标识符|无符号整数子函数 { intm; if((strcmp(cifa_p->word,"(")==0)) { cout<<'\t'< advance(); m=E(); if(m==0)return(0); if((strcmp(cifa_p->word,")")==0)) { advance(); return (1); } else { cout<<"ERROR"< return(0); } } elseif(cifa_p->type==1||cifa_p->type==2)//数字或是标识符 { cout<<'\t'< advance(); return (1); } elsereturn0; } intS()//S->*FS|/FS|ε子函数 { intt,g; if(strcmp(cifa_p->word,"*")==0) { cout<<'\t'< advance(); t=F(); if(t==0)return0; g=S(); if(g==0)return0; return (1); } elseif(strcmp(cifa_p->word,"/")==0) { cout<<'\t'< advance(); t=F(); if(t==0)return0; g=S(); if(g==0)return0; return (1); } elseif(strcmp(cifa_p->word,"+")==0||(strcmp(cifa_p->word,"-")==0)||(strcmp(cifa_p->word,"#")==0)||(strcmp(cifa_p->word,")")==0)) { cout<<'\t'< return (1); } return(0); } intT()//T->FS子函数 { intt,g; cout<<'\t'< t=F(); if(t==0)return0; g=S(); if(g==0)return0; return (1); } intG()//G-〉+TG|-TG|ε子函数 { intt,g; if(strcmp(cifa_p->word,"+")==0) { cout<<'\t'< advance(); t=T(); if(t==0)return(0); g=G(); if(g==0)return(0); return (1); } elseif(strcmp(cifa_p->word,"-")==0) { cout<<'\t'< advance(); t=T(); if(t==0)return(0); g=G(); if(g==0)return(0); return (1); } elseif(strcmp(cifa_p->word,")")==0||strcmp(cifa_p->word,"#")==0) { cout<<'\t'< return (1); } return(0); } intE()//E->[+|-]TG子函数 { intt,g; if((strcmp(cifa_p->word,"+")==0)||(strcmp(cifa_p->word,"-")==0))advance(); cout<<'\t'< t=T(); if(t==0)return(0); g=G(); if(g==0)return(0); elsereturn (1); } voidyufa_zfc_disp(cifa*p)//输出字符串 { while(p! =NULL) { cout< p=p->next; } //cout< } //************************语法分析部分*************************************** voidadvance()//取词法分析产生列表中的结点作语法分析 { cifa_p=cifa_p->next; } inttest(void)//识别相关符号 { chartemp[3]; inti=0; inttype; switch(ch) { case';': //识别';' { temp[i++]=ch; GetChar(); if(ch=='')temp[i++]=''; temp[i]='\0'; type=4; break; } case'+': //识别'+' { temp[i++]=ch; GetChar(); if(ch=='')temp[i++]=''; temp[i]='\0'; type=3; break; } case'-': //识别'-' { temp[i++]=ch; GetChar(); if(ch=='')temp[i++]=''; temp[i]='\0'; type=3; break; } case'*': //识别'*' { temp[i++]=ch; GetChar(); if(ch=='') temp[i++]=''; temp[i]='\0'; type=3; break; } case'/': //识别'/' { temp[i++]=ch; GetChar(); if(ch=='') temp[i++]=''; temp[i]='\0'; type=3; break; } case'(': //识别'(' { temp[i++]=ch; GetChar(); if(ch=='') temp[i++]=''; temp[i]='\0'; type=4; break; } case')': //识别')' { temp[i++]=ch; GetChar(); if(ch=='') temp[i++]=''; temp[i]='\0'; type=4; break; } default: {cout< cout<<"无法识别,出错! "< GetChar(); if(ch=='')notock(); return(0); } } if(ch=='')notock();//空格跳过 cifa*p; p=newcifa; p->next=NULL; p->type=type; strcpy(p->word,temp); cifa_add(p); return (1); } intcifa_main()//词法分析主函数 { intf; cifa_head=newcifa; cifa_head->type=-1; cifa_head->next=NULL; cifa_end=cifa_head; cout<<"单词种类定义如下: "< cout<<"标识符的种类编码1: "< cout<<"常数的种类编码2: "< cout<<"运算的种类编码3: +,-,*,/"< cout<<"界限符的种类编码4: (,),;"< GetChar(); notock(); cout<<"--------------------------------------------------------"< "< while(nn<100&&ch! ='^') { if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) f=alph();//字母串 elseif(ch>='0'&&ch<='9')f=number();//数字串 elsef=test();//其他符号 if(f==0)return(0); } cifa_disp(cifa_head); cout< return (1); } intnumber(void)//识别数字 { inttype=2; inti=0; chartemp[10]; while('0'<=ch&&ch<='9') { temp[i]=ch; i++; GetChar(); } temp[i]='\0'; if(ch=='')notock(); elseif(ch! ='^'&&ch! ='+'&&ch! ='-'&&ch! =';'&&ch! ='*'&&ch! ='/'&&ch! ='('&&ch! =')') { cout< return(0); } if(ch=='')notock(); cifa*p; p=newcifa; p->next=NULL; p->type=type; strcpy(p->word,temp); cifa_add(p); return (1); } intalph(void)//识别标识符 { inti=0; chartemp[10]; inttype=1; temp[i]=ch; i++; GetChar(); while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')|| (ch>='0'&&ch<='9')) { temp[i]=ch; i++; GetChar(); } temp[i]='\0'; if(ch=='')notock(); elseif(ch! ='^'&&ch! ='+'&&ch! ='-'&&ch! =';'&& ch! ='*'&&ch! ='/'&&ch! ='('&&ch! =')') { cout< return0; } cifa*p; p=newcifa; p->next=NULL; p->type=type; strcpy(p->word,temp); cifa_add(p); return (1); } cifa*cifa_add(cifa*p)//在分析结果列表尾添加一个新接点 {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算术 表达式 语法 检查 实验 报告