当前位置:文档之家› WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

WHILE循环语句的翻译程序设计(简单优先法、输出四元式)1 需求说明或问题描述1.1 问题描述对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。

1.2 需求说明1 写出符合给定的语法分析方法的文法及属性文法2 完成题目要求的中间代码四元式的描述3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计4 设计若干用例,上机通过测试2 文法及语法设计2.1文法及属性文法:文法G=(V N ,V T ,P ,S)其中V N={S , B, E, C, A, B, P, T} V T={w, (, ), { ,}, i, ;}P={S -> w(B){E}E -> CC -> CAC -> AA -> iPAA -> i;P -> +|-|*|/B -> iTiB-> iT -> >|<|>=|<=|==}2.2 语法分析方法描述及语法分析表设计2.2.1 语法分析方法描述:简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。

基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将文法的产生式保存,设置符号栈S,步骤如下:(1)将输入符号串a1a2…a n#依次逐个存入符号栈S中,直到遇到栈顶符号a i的优先性>下一个待输入符号a j为止。

(2)栈顶当前符号a i为句柄尾,由此向左在栈中找句柄的头符号a k,即找到a k-1<a k为止。

(3)由句柄a k...a i在文法的产生式中查找右部为a k…a i的产生式,若找到则用相应左部代替句柄,若找不到则为出错,这时可断定输入串不是该文法的句子。

(4)重复上述(1)、(2)、(3)步骤直到规约完输入符号串,栈中只剩文法的开始符号为止。

2.2.2 优先关系矩阵:3 中间代码3.1中间代码形式的描述中间代码通过四元式给出。

四元式的四个组成成分是:算符op,第一和第二运算对象ARG1和ARG2及运算结果RESULT。

运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。

3.2 中间代码序列的结构设计通过词法分析及语法分析之后,取出其中的运算表达式。

对表达式进行分析。

其中,先乘除后加减,先运算括号内的。

如a=b*c+b*d 的四元式表示如下:1) (*,b, c, t1)2) (*, b, d, t2)3) (+, t2, t3, t3)4) (=, t3, -, a)4 编译系统的概要设计及部分流程图1 通过程序,在1.txt文本中输入while语句。

对文本进行扫描,通过词法分析函数cifa()对输入的while语句进行词法分析。

2 将已算好的优先关系矩阵放至程序中,通过函数Guanxi()输出优先关系矩阵到guanxi.txt文件中。

3 对已进行词法分析的while语句进行语法分析,分析函数为JanDan()。

其中包含对错误语句的报错处理。

同时,对可以进行四元式输出的运算表达式进行输出。

4 通过四元式输出函数Siyuan()将运算表达式表示为四元式的形式,输出到siyuan.txt文件中。

整体框图:词法分析程序框图5 源程序与执行结果(含测试方法和测试结果)5.1 源程序5.1.1 词法分析函数void cifa()//词法分析程序{char a[100];char ch;ifstream infile("1.txt",ios::in);for(int i=0;i<100;i++){infile.get(ch);if(ch!='#')a[i]=ch;else {a[i]=ch;break;}}i=0;int m;cout<<"词法分析结果见cifa.txt文件内!"<<endl;while(i<100){m=Judge(a[i]);//第一个字符的形式if(m==1) i=Keyword(i,a);//关键字else if (m==2) i=Numb(i,a);//数字else if (m==3) i=YunSuan(i,a);//运算符else if (m==4) i=JieFu(i,a);//界符else if (m==5) i++;//空格else if (m==6) i++;//回车else if (m==7) return;//“#”号else break;}}5.1.2 简单优先法void JanDan(int Q){cout<<"简单优先法部分步骤输出到jiandan.txt文件中!"<<endl;coutj<<"简单优先法,部分步骤:"<<endl;S1="w(B){E}";//产生式E1="C";C1="CA";C2="A";A1="iPA";A2="i;";B1="iTi";B2="i";string str2;for(t=0;t<Q;t++){if(JD[t]=="while")R[t]='w';else if(JD[t]=="(")R[t]='(';else if(JD[t]==")")R[t]=')';else if(JD[t]=="{")R[t]='{';else if(JD[t]=="}")R[t]='}';else if(JD[t]==";")R[t]=';';elseif(JD[t]=="+"||JD[t]=="-"||JD[t]=="*"||J D[t]=="/"||JD[t]=="=")R[t]='P';elseif(JD[t]==">"||JD[t]=="<"||JD[t]==">="|| JD[t]=="<="||JD[t]=="==")R[t]='T';else R[t]='i';}R[t]='#';// cout<<"R="<<R<<endl;int a1=1,m,z,x;int n;t=1;char a[50]="\0";a[0]=R[0];loop4:while(t<=Q){z= Panduan(a[a1-1],R[t]);if(z==0||z==-1){coutj<<setw(20)<<a;x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<endl;a[a1]=R[t];a1++;t++;}else if(z==1){m=0;a1--;t--;coutj<<setw(20)<<a;goto loop5;}else if(z==2){coutj<<"a["<<a1-1<<"]="<<a[a1-1] <<" "<<"R["<<t<<"]"<<R[t]<<endl;coutj<<"1错误,这不是文法的句子!"<<endl;return;}}loop5:if((a1-m-1)>=0){z=Panduan(a[a1-m-1],a[a1-m]);}else z=-1;if(z==2){coutj<<"2错误,这不是文法的句子"<<endl;return;}else if(z==0||z==1){m++;goto loop5;}else if(z==-1){n=a1-m;str="\0";for(;m>=0;m--){str2="\0";str2=a[a1-m];str=str+str2;a[a1-m]='\0';}if(str==S1){a[n]='S';x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<setw(20)<<"需要归约的是:"<<str<<endl;coutj<<setw(20)<<a;coutj<<setw(20)<<"归约结束!"<<endl;return;}else if(str==E1){a[n]='E';a1=n;a1++;t++;x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<setw(20)<<"需要规约的是:"<<str<<endl;}else if(str==C1||str==C2){a[n]='C';a1=n;a1++;t++;x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<setw(20)<<"需要规约的是:"<<str<<endl;}else if(str==A1||str==A2){a[n]='A';a1=n;a1++;t++;Siyuan(str);x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<setw(20)<<"需要规约的是:"<<str<<endl;}else if(str==B1||str==B2){a[n]='B';a1=n;a1++;t++;Siyuan(str);x=t;coutj<<" ";while(R[x])coutj<<R[x++];coutj<<setw(20)<<"需要规约的是:"<<str<<endl;}else{coutj<<" "<<"3错误,归约失败!"<<endl;return;}goto loop4;}}5.1.3 四元式输出void Siyuan(string str){//cout<<"str="<<str<<endl;int m=0,n=0;while(str[m])m++;if(str[m-1]==';')//对A{if(S[t-u-2]==0){couts<<"T"<<j<<":(";couts<<"=,"<<"T"<<j<<","<<JD[t-u-2]<<",T"<<j<<")"<<endl;j++;}else{couts<<"T"<<j<<":(";couts<<"=,"<<"T"<<j<<","<<S[t-u-2]<<",T"<<j<<")"<<endl;j++;}u=u+3;}else if(str[m-1]=='i')//对B{if(S[t-3]==0&&S[t-1]!=0){couts<<"B"<<j<<":(";couts<<JD[t-2]<<",";couts<<JD[t-3]<<",";couts<<S[t-1]<<",B"<<j<<")"<<en dl;j++;}else if(S[t-3]!=0&&S[t-1]!=0){couts<<"B"<<j<<":(";couts<<JD[t-2]<<",";couts<<S[t-3]<<",";couts<<S[t-1]<<",B"<<j<<")"<<en dl;j++;}else if(S[t-3]==0&&S[t-1]==0){couts<<"B"<<j<<":(";couts<<JD[t-2]<<",";couts<<JD[t-3]<<",";couts<<JD[t-1]<<",B"<<j<<")"<<e ndl;j++;}else if(S[t-3]!=0&&S[t-1]==0){couts<<"B"<<j<<":(";couts<<JD[t-2]<<",";couts<<S[t-3]<<",";couts<<JD[t-1]<<",B"<<j<<")"<<e ndl;j++;}}else if(str[m-1]=='A')//对A{if(S[t-u-4]==0){couts<<"T"<<j<<":(";couts<<JD[t-u-3]<<",";couts<<JD[t-u-4]<<",T"<<j-1<<",T "<<j<<")"<<endl;j++;}else{couts<<"T"<<j<<":(";couts<<JD[t-u-3]<<",";couts<<S[t-u-4]<<",T"<<j-1<<",T" <<j<<")"<<endl;j++;}u=u+3;}}5.2 执行结果5.2.1 执行方法:编译,链接,运行。

相关主题