




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验三语义分析有如下算术运算文法:1)E->E+T2)E->E-T3)E->T4)T->T*F5)T->T/F6)T->F7)F->(E)8)F->I9)I->十进制实数|十进制整数|十六进制实数|十六进制整数|八进制实数|八进制整数10)十进制实数->(0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*).(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*11)八进制实数->0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*.(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*12)十六进制实数->0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*.(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*13)十进制整数->0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*14)八进制整数->0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*15)十六进制整数->0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*单词分类:运算符:+-*/()常数:十进制实数十进制整数十六进制实数十六进制整数八进制实数八进制整数1.实验目的在实验二的基础上实现一个语义分析程序,求出输入算式的最后结果。2.实验要求输入运算式,如无任何词法和语法错误,则得到运算结果并显示,如有错误,显示错误内容。#include<iostream>#include<stdio.h>#include<stdlib.h>#include<iostream>#include<stdio.h>#include<stdlib.h>#include<vector>#include<string>#include<sstream>usingnamespacestd;boolnewstringXC(string&strsor);boolnewstringJJ(string&strsor);boolresetstringJia1(string&strsor);boolresetstringJia2(string&strsor);boolresetstringJia3(string&strsor);boolresetstringJia4(string&strsor);boolnewstringKH(string&strsor){ intindex1=strsor.rfind("(",strsor.length()-1); if(index1==string::npos) returnfalse; intindex2=strsor.find(")",index1); stringchildstr; childstr.assign(strsor,index1+1,index2-index1-1); while(newstringXC(childstr)) { while((resetstringJia1(childstr))){} while((resetstringJia2(childstr))){} while((resetstringJia3(childstr))){} while((resetstringJia4(childstr))){} } while(newstringJJ(childstr)) { while((resetstringJia1(childstr))){} while((resetstringJia2(childstr))){} while((resetstringJia3(childstr))){} while((resetstringJia4(childstr))){} } strsor.replace(index1,index2-index1+1,childstr.c_str(),childstr.length()); while((resetstringJia1(strsor))){} while((resetstringJia2(strsor))){} while((resetstringJia3(strsor))){} while((resetstringJia4(strsor))){} returntrue;};boolnewstringXC(string&strsor){ intindex1=strsor.find_first_of("*/",0); if(index1==string::npos) returnfalse; intindex2=strsor.find_first_of("+-*/",index1+2); if(index2==string::npos) index2=strsor.length(); intindex3=strsor.find_last_of("+-*/",index1-1); if(index3==string::npos) index3=-1; stringstr1; str1.assign(strsor,index3+1,index1-index3-1); stringstr2; str2.assign(strsor,index1+1,index2-index1-1); doubledob1=atof(str1.c_str()); doubledob2=atof(str2.c_str()); doubledob3; if(strsor.at(index1)=='*') dob3=dob1*dob2; elseif(strsor.at(index1)=='/') dob3=dob1/dob2; charc_str3[50]; memset(c_str3,0,50); sprintf(c_str3,"%.5f",dob3); strsor.replace(index3+1,index2-index3-1,c_str3,strlen(c_str3)); returntrue;};boolnewstringJJ(string&strsor){ intindex1=strsor.find_first_of("+-",1); if(index1==string::npos) returnfalse; intindex2=strsor.find_first_of("+-*/",index1+1); if(index2==string::npos) index2=strsor.length(); intindex3=strsor.find_last_of("+-*/",index1-1); if((index3==string::npos)||(index3==0)) index3=-1; stringstr1; str1.assign(strsor,index3+1,index1-index3-1); stringstr2; str2.assign(strsor,index1+1,index2-index1-1); doubledob1=atof(str1.c_str()); doubledob2=atof(str2.c_str()); doubledob3; if(strsor.at(index1)=='+') dob3=dob1+dob2; elseif(strsor.at(index1)=='-') dob3=dob1-dob2; charc_str3[50]; memset(c_str3,0,50); sprintf(c_str3,"%.5f",dob3); strsor.replace(index3+1,index2-index3-1,c_str3,strlen(c_str3)); returntrue;};boolresetstringJia1(string&strsor){ intindex1=strsor.find("++"); if(index1==string::npos) returnfalse; strsor.replace(index1,2,"+",1); returntrue;};boolresetstringJia2(string&strsor){ intindex1=strsor.find("+-"); if(index1==string::npos) returnfalse; strsor.replace(index1,2,"-",1); returntrue;};boolresetstringJia3(string&strsor){ intindex1=strsor.find("-+"); if(index1==string::npos) returnfalse; strsor.replace(index1,2,"-",1); returntrue;};boolresetstringJia4(string&strsor){ intindex1=strsor.find("--"); if(index1==string::npos) returnfalse; strsor.replace(index1,2,"+",1); returntrue;};charyuyi[100]={'\0'};intf(char*t){ intj; boolss=0,is8=0,is10=0,is16=0; for(j=0;j<strlen(t);j++) { if(t[j]=='.') ss=1; } if(t[0]=='0'&&t[1]=='x') { intc=0; for(j=2;j<strlen(t);j++) if((t[j]-'0'>=0&&t[j]-'0'<10)||(t[j]-'a'>=0&&t[j]-'a'<6)) c++; if(ss&&c==strlen(t)-3) is16=1; if(!ss&&c==strlen(t)-2) is16=1; if(is16&&ss) { char*s; inti=(int)strtol(t,&s,16); charss[100]; //sprintf(ss,"%d",i); //strcat(yuyi,ss); doubleans=(double)i; i=0; doublesum=0; intquan=16; while(t[i]!='.')i++; for(intk=i+1;k<strlen(t);k++) { sum=sum+(double)(t[k]-'0')/quan; quan=quan*2; } ans=ans+sum; sprintf(ss,"%lf",ans); strcat(yuyi,ss); return1; } //cout<<"十六进制实数"<<t<<endl; elseif(is16) { char*s; inti=(int)strtol(t,&s,16); charss[100]; sprintf(ss,"%d",i); strcat(yuyi,ss); return1; } //cout<<"十六进制整数"<<t<<endl; else return0; //cout<<"错误数据"<<t<<endl; //return; } if(t[0]=='0') { intcc=0; for(j=1;j<strlen(t);j++) if(t[j]-'0'>=0&&t[j]-'0'<8) cc++; if(ss&&cc==strlen(t)-2) is8=1; if(!ss&&cc==strlen(t)-1) is8=1; if(is8&&ss) { char*s; inti=(int)strtol(t,&s,8); charss[100]; doubleans=(double)i; i=0; doublesum=0; intquan=8; while(t[i]!='.')i++; for(intk=i+1;k<strlen(t);k++) { sum=sum+(double)(t[k]-'0')/quan; quan=quan*2; } ans=ans+sum; sprintf(ss,"%lf",ans); strcat(yuyi,ss); return1; } //cout<<"八进制实数"<<t<<endl; elseif(is8) { char*s; inti=(int)strtol(t,&s,8); charss[100]; sprintf(ss,"%d",i); strcat(yuyi,ss); return1; } //cout<<"八进制整数"<<t<<endl; else return0; //cout<<"错误数据"<<t<<endl; //return; } if(t[0]-'0'>0&&t[j]-'0'<10) { intccc=0; for(j=1;j<strlen(t);j++) if(t[j]-'0'>=0&&t[j]-'0'<10) ccc++; if(ss&&ccc==strlen(t)-2) is10=1; if(!ss&&ccc==strlen(t)-1) is10=1; if(is10&&ss) { strcat(yuyi,t); return1; } //cout<<"十进制实数"<<t<<endl; elseif(is10) { strcat(yuyi,t); return1; } //cout<<"十进制整数"<<t<<endl; else return0; //cout<<"错误数据"<<t<<endl; //return; } // if(t[0]=='') return0; //cout<<"错误数据"<<t<<endl; //return;}voidyyfx(char*yy){ stringm_str=(string)yy; while(newstringKH(m_str)) { while((resetstringJia1(m_str))){} while((resetstringJia2(m_str))){} while((resetstringJia3(m_str))){} while((resetstringJia4(m_str))){} } while(newstringXC(m_str)) { while((resetstringJia1(m_str))){} while((resetstringJia2(m_str))){} while((resetstringJia3(m_str))){} while((resetstringJia4(m_str))){} } while(newstringJJ(m_str)) { while((resetstringJia1(m_str))){} while((resetstringJia2(m_str))){} while((resetstringJia3(m_str))){} while((resetstringJia4(m_str))){} } cout<<"运算结果"<<m_str<<endl; }intmain(){ char*m[50]={"零","一","二","三","四","五","六","七","八","九","十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","二一","二二","二三","二四","二五","二六","二七","二八","二九","三十"}; chars[100],temp[100],yf[100]; //charyuyi[100]; while(gets(s)) { yuyi[0]='\0'; //strcpy(yuyi,s); inti; intk=0; intq=0; for(i=0;i<strlen(s);i++) { if(s[i]=='') continue; if(s[i]!='+'&&s[i]!='-'&&s[i]!='*'&&s[i]!='/'&&s[i]!='('&&s[i]!=')') { temp[k++]=s[i]; } else { temp[k]='\0'; if(k>0) { if(f(temp)) { yf[q++]='N'; //cout<<"1"<<q-1<<""<<yf[q-1]<<endl; } else { yf[q++]='E'; //cout<<"2"<<q-1<<""<<yf[q-1]<<endl; } if(i!=strlen(s)) { yf[q++]=s[i]; chars2[100]; strcpy(s2,s); char*sss=s2+i; sss[1]='\0'; strcat(yuyi,sss); //cout<<"3"<<q-1<<""<<yf[q-1]<<endl; } //cout<<"运算符"<<s[i]<<endl; k=0; } else { yf[q++]=s[i]; chars2[100]; strcpy(s2,s); char*sss=s2+i; sss[1]='\0'; strcat(yuyi,sss); //cout<<"4"<<q-1<<""<<yf[q-1]<<endl; //cout<<"运算符"<<s[i]<<endl; } } } if(k>0) { temp[k]='\0'; if(f(temp)) { yf[q++]='N'; //cout<<"5"<<q-1<<""<<yf[q-1]<<endl; } else { yf[q++]='E'; //cout<<"6"<<q-1<<""<<yf[q-1]<<endl; } } yf[q++]='#'; yf[q++]='\0'; chartyf[100]; strcpy(tyf,yf); inth[100]={0}; charcc[100]; intkuohao=0; if(yf[0]=='+'||yf[0]=='-'||yf[0]=='*'||yf[0]=='/'||yf[0]==')') { h[0]=1; cc[0]=yf[0]; yf[0]='#'; } if(yf[0]=='(') kuohao++; if(yf[0]=='E') h[0]=2; for(i=1;i<strlen(yf);i++) { if(yf[i]=='+'||yf[i]=='-'||yf[i]=='*'||yf[i]=='/') { if(yf[i-1]=='#') { h[i]=1; cc[i]=yf[i]; yf[i]='#'; } if(yf[i-1]=='+'||yf[i-1]=='-'||yf[i-1]=='*'||yf[i-1]=='/'||yf[i-1]=='(') { h[i]=1; cc[i]=yf[i]; yf[i]=yf[i-1]; } } if(yf[i]=='(') { if(yf[i-1]=='N'||yf[i-1]=='E') { h[i]=1; cc[i]=yf[i]; yf[i]=yf[i-1]; } else kuohao++; } if(yf[i]==')') { if(yf[i-1]=='+'||yf[i-1]=='-'||yf[i-1]=='*'||yf[i-1]=='/'||yf[i-1]=='(') { h[i]=1; cc[i]=yf[i]; yf[i]=yf[i-1]; } else kuohao--; } if(yf[i]=='N'||yf[i]=='E') { if(yf[i-1]==')') { h[i]=1;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 涂料运输安全代理合同
- 生产运作诊断
- 二零二五年度信息安全人工费用咨询与风险防范合同
- 2024深圳市新鹏职业高级中学工作人员招聘考试及答案
- 2024济宁市兖州区职业中等专业学校工作人员招聘考试及答案
- 2024湖南省茶陵县职业中等专业学校工作人员招聘考试及答案
- 餐饮店铺租房合同
- 管理学讲座直播课件
- 房屋转租合同标准版
- 计算机配件采购协议合同
- 重点流域水环境综合治理项目类型及项目合理造价估算标准表
- 一组超全面的5S可视化标准课件
- 10KV供配电工程施工组织设计方案
- 钢结构施工方案(钢结构-施工方案)
- 《民法典》合同编实务培训课件
- 《产业经济学》课程思政教学案例
- 施工组织设计管理台帐
- 腾冲县西山坝片区控制性详细规划课件
- 闭合导线计算表(带公式)
- 商务礼仪培训52873734(PPT143页)
- (高清正版)T_CAGHP 066—2019危岩落石柔性防护网工程技术规范(试行)
评论
0/150
提交评论