编译原理课程设计编译课设.docx

上传人:b****5 文档编号:6498474 上传时间:2023-01-07 格式:DOCX 页数:17 大小:55.77KB
下载 相关 举报
编译原理课程设计编译课设.docx_第1页
第1页 / 共17页
编译原理课程设计编译课设.docx_第2页
第2页 / 共17页
编译原理课程设计编译课设.docx_第3页
第3页 / 共17页
编译原理课程设计编译课设.docx_第4页
第4页 / 共17页
编译原理课程设计编译课设.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

编译原理课程设计编译课设.docx

《编译原理课程设计编译课设.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计编译课设.docx(17页珍藏版)》请在冰豆网上搜索。

编译原理课程设计编译课设.docx

编译原理课程设计编译课设

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;i

for(;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["<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1