实验三 语义分析_第1页
实验三 语义分析_第2页
实验三 语义分析_第3页
实验三 语义分析_第4页
实验三 语义分析_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三语义分析有如下算术运算文法: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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论