编译原理课程设计编译课设.docx
《编译原理课程设计编译课设.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计编译课设.docx(17页珍藏版)》请在冰豆网上搜索。
编译原理课程设计编译课设
DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式)
一、1.简单优先法的基本思想
根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,称作简单优先矩阵。
PDA读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。
直到最后栈内只剩下开始符号,输入串读到“#”为止。
此时识别正确。
可分点描述如下:
(1)、对句型中相邻的文法符号规定优先关系,以寻找句型中的句柄;
(2)、规定句柄内各相邻符号之间具有相同的优先级;
(3)、规定句柄两端符号优先级要比位于句柄之外而又和句柄相邻的符号的优先级高,以先归约句柄;
(4)、对于文法中所有符号,只要它们可能在某个句型中相邻,就要为它们规定相应的优先关系,若某两个符号永远不可能相邻,则它们之间就无关系.
2.简单优先矩阵
用于表示文法符号之间的简单优先关系的矩阵。
intShipTable[TABLE_LEN][TABLE_LEN]=
{
{1,1,-1,-1,-1,1,-1,1},
{1,1,-1,-1,-1,1,-1,1},
{1,1,1,1,-1,1,-1,1},
{1,1,1,1,-1,1,-1,1},
{-1,-1,-1,-1,-1,0,-1,-2},
{1,1,1,1,-2,1,-2,1},
{1,1,1,1,-2,1,-2,1},
{-1,-1,-1,-1,-1,-2,-1,0}
};
其中1表示优先关系大于,-1表示优先关系小于,0表示两者的优先级关系相等,定义-2为两者没有优先关系。
3.简单优先法的优缺点
优点:
技术简单,当做简单优先矩阵是要求较短。
缺点:
适用范围小,分析表尺寸太大。
二、源代码实现:
#include
#defineMAX35
#include
#include
#include
usingnamespacestd;
#defineTABLE_LEN8
#defineSTR_LEN256
intzhlen;
charsTable[TABLE_LEN+1]={"+-*/()i#"};//顺3序¨°索¡Â引°y
intShipTable[TABLE_LEN][TABLE_LEN]=//优®?
先¨¨表À¨ª
{
{1,1,-1,-1,-1,1,-1,1},
{1,1,-1,-1,-1,1,-1,1},
{1,1,1,1,-1,1,-1,1},
{1,1,1,1,-1,1,-1,1},
{-1,-1,-1,-1,-1,0,-1,-2},
{1,1,1,1,-2,1,-2,1},
{1,1,1,1,-2,1,-2,1},
{-1,-1,-1,-1,-1,-2,-1,0}
};
charX,a;
charVN[11]={'K','L','P','S','E','G','T','R','F','Q','\0'};
charVT[15]={'i','=','<','>','+','-','*','/','(',')','d','w',';','#','\0'};
charp[18][6]={"dLwS\0","SP\0",";SP\0","\0","iQE\0","TG\0","+TG\0","-TG\0","\0","FR\0",
"*FR\0","/FR\0","\0","(E)\0","i\0","=\0","<\0",">\0"};
charstack[MAX];
charqueue[MAX];
intsp,front;
intM[10][14]={{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1},{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,-1},{4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1},{-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1,8,8,8},{9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1},{-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12},
{14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1},{-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
};
intf=0;
intcount=0;
intc=0;
chararr_i[MAX];
charvar[MAX];//表À¨ª格?
管¨¹理¤¨ª
inttd[MAX];//输º?
出?
产¨²生¦¨²式º?
序¨°列¢D
intt=0;
intopd=-1;
intopr=-1;
intid=0;
//intptr[MAX];
intd=0;
chararr[MAX][4];//存ä?
放¤?
待äy输º?
出?
的Ì?
四?
元a式º?
//charkeyword[2][7]={"do\0","while\0"};
boolIsCharInStr(charc,chars[])
{
for(inti=0;s[i]!
='\0';i++)
{
if(s[i]==c)
returntrue;
}
returnfalse;
}
intGetIndex(chars[],charc)
{
for(inti=0;s[i]!
='\0';i++)
{
if(c==s[i])
returni;
}
return-1;
}
//
stringGetSubString(chars[],intfrom,intto)
{
stringst;
for(inti=from;i{
st+=s[i];
}
returnst;
}
/*******************************************
翻¤-译°?
赋3值¦Ì表À¨ª达ä?
式º?
********************************************/
voidtranslatefuzhi(char*sInput)
{
//栈?
结¨¢构1的Ì?
初?
始º?
化¡¥
charStack[STR_LEN]={0};
intindex=0;
inttop=1;
Stack[0]='#';
listrPolish;
listNum;
intbegin=0;
while(sInput[begin]!
='=')
{
if(IsCharInStr(sInput[begin],sTable))
{
cout<<"Equalexpressionisillegal!
"<return;
}
begin++;
}
Num.push_back(GetSubString(sInput,0,begin));
intnow=begin+1;
intbefore=begin;
rPolish.push_back('i');
while(sInput[now]!
='\0')
{
if(IsCharInStr(sInput[now],sTable))
{
chartemp[3]={0};
if(now-before>1)
{
temp[0]='i';
temp[1]=sInput[now];
Num.push_back(GetSubString(sInput,before+1,now));
}
else
{
temp[0]=sInput[now];
}
inti=0;
while(temp[i]!
=0)
{
intleft=GetIndex(sTable,Stack[index]);
intright=GetIndex(sTable,temp[i]);
switch(ShipTable[left][right])
{
case-1:
//移°?
入¨?
Stack[top++]=temp[i];
index=top-1;
i++;
break;
case0:
//脱ª?
括¤¡§号?
if(Stack[index]=='(')
{
Stack[top++]=')';
Stack[index]='E';
top=index+1;
index--;
}
else//规?
约?
{
if(top!
=2)
{
return;
}
rPolish.push_back('=');
list:
:
iteratoriter;
list:
:
iteratorsiter=Num.begin();
stringfuzhi[256];intd=0,m;
for(iter=rPolish.begin();iter!
=rPolish.end();iter++)
{
if(*iter=='i')
{
fuzhi[d++]=*siter;
siter++;
}
else
{
fuzhi[d++]=*iter;
}
}
m=d;
stringop1,op2;intflag,xiabiao=0;
for(d=0;d{
if(fuzhi[d]=="+"||fuzhi[d]=="-"||fuzhi[d]=="*"||fuzhi[d]=="/"||fuzhi[d]=="=")
{
op2="";op1="";
for(flag=d-1;flag>=0;flag--)
{
if((fuzhi[flag]!
="")&&(op1==""))
{
if(op2=="")
{
op2=fuzhi[flag];
fuzhi[flag]="";
}
else
{
op1=fuzhi[flag];
fuzhi[flag]="";
}
}
}
cout<<"("<fuzhi[d]="T";
fuzhi[d]+=(xiabiao+'0');
xiabiao++;
}
//cout<}
return;
}
i++;
break;
case1:
//归¨¦约?
if(Stack[index]=='i')
{
rPolish.push_back('i');
Stack[index]='E';
index--;
}
else
{
rPolish.push_back(Stack[index]);
Stack[index-1]='E';
top=index;
index-=2;
}
break;
default:
return;
}
}
before=now;
}
now++;
}
}
intlen(charstr[]){
inti=0;
while(str[i]!
='\0')i++;
returni;
}
intindex(charch,charstr[]){
inti=0;
while(str[i]!
='\0'){
if(ch!
=str[i])i++;
elsebreak;}
if(str[i]=='\0')return-1;
returni;
}
voiderr(intn){
if(n==1)cout<<"字Á?
符¤?
不?
匹£¤配?
"<elseif(n==2)cout<<"字Á?
符¤?
没?
有®D出?
现?
在¨²产¨²生¦¨²式º?
中D"<elseif(n==3)cout<<"没?
有®D找¨°到Ì?
合?
适º¨º的Ì?
候¨°选?
产¨²生¦¨²式º?
"<elsecout<<"该?
句?
子Á¨®是º?
文?
法¤¡§语®?
言?
的Ì?
句?
子Á¨®!
ê?
"<}
voidprint(){
cout<<"(";
if(count<10)cout<<'0';
cout<inti;
for(i=0;i<=sp;i++)cout<for(;i<=20;i++)cout<<"";
for(i=0;ifor(;queue[i]!
='#';i++)cout<cout<for(;i<=20;i++)cout<<"";
}
intprintguiyue(char*zh)
{
intj=0;
cout<<"步?
骤¨¨"<<"符¤?
号?
栈?
"<<"输º?
入¨?
符¤?
号?
串ä?
"<<"动¡¥作Á¡Â"<进?
"<(1)#d";for(j=1;j进?
"<(2)#d"<进?
"<"<进?
"<进?
"<"<进?
"<"<进?
"<"<进?
"<进?
"<进?
"<"<cout<<"(15)#dGW"<进?
"<"<"<return0;
}
voidsemantic(){
if(VT[opr]=='='){arr[d][0]='=';arr[d][1]=arr_i[opd];arr[d][2]=id;arr[d][3]='--';id++;}
elseif(opr==-2){arr[d][0]='=';arr[d][1]=id-1;arr[d][2]=arr_i[opd];arr[d][3]='--';}
else{arr[d][0]=VT[opr];arr[d][1]=arr_i[opd];arr[d][2]=id;
if(VT[opr]!
='<'&&VT[opr]!
='>')arr[d][3]=id-1;elsearr[d][3]=id+1;id++;}
d++;
}
voidsyntax(){//语®?
法¤¡§分¤?
析?
intn;
count++;
print();
X=stack[sp];
a=queue[front];
if(X=='#'&&a=='#')f=4;
if(X<'A'||X>'Z'){
if(X==a){
sp--;
front++;
if(a!
='i'){
if(a!
='d'&&a!
='w'&&a!
=';'&&a!
='#'){opr=index(a,VT);semantic();}
elseif(a==';'||a=='w'||a=='#'){opr=-2;semantic();}
cout<<'\t'<<'\''<"<else{
opd=c;
cout<<'\t'<<'\''<"<}
}
elsef=1;
}
else{
inttx=index(X,VN);
intta=index(a,VT);
n=M[tx][ta];
td[t++]=M[tx][ta];
if(ta==-1){f=2;cout<elseif(n==-1)f=3;
else{
sp--;
cout<<'\t'<";
if(len(p[n])!
=0){
for(inti=len(p[n])-1;i>=0;i--){stack[++sp]=p[n][i];cout<
cout<elsecout<<"空?
串ä?
"<}
}
if(f==0)syntax();
else{td[t]='-1';err(f);}
}
voidlexical(){//词䨺法¤¡§分¤?
析?
inti,j,d;
charch;
j=d=0;
for(i=0;var[i]!
='#';i++){
ch=var[i];
if(ch=='d'&&var[i+1]=='o'){cout<<"do"<<'\t'<<"keword"<elseif(ch=='w'){ch=var[i+1];
if(ch=='h'){ch=var[i+2];
if(ch=='i'){ch=var[i+3];
if(ch=='l'){ch=var[i+4];
if(ch=='e'){ch=var[i+5];}}}}
cout<<"while"<<'\t'<<"keyword"<}
elseif(index(ch,VT)<=0){
if(ch!
='{'&&ch!
='}'&&ch!
='('&&ch!
=')'){cout<i["<