编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx

上传人:b****5 文档编号:28938251 上传时间:2023-07-20 格式:DOCX 页数:33 大小:67.17KB
下载 相关 举报
编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx_第1页
第1页 / 共33页
编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx_第2页
第2页 / 共33页
编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx_第3页
第3页 / 共33页
编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx_第4页
第4页 / 共33页
编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx

《编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx》由会员分享,可在线阅读,更多相关《编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx(33页珍藏版)》请在冰豆网上搜索。

编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx

编译原理无符号数的算术四则运算LR语法分析器设计实现

编译原理实验二源程序及结果

【源程序】

#include

#include

usingnamespacestd;

#defineM101

/*

i1

+2

-3

*4

/5

(6

)7

#8

E9

T10

F11

S移近操作1【S115例外】

R归约操作2

acc3识别成功

*///ACTON表

intACTION[16][8]={

{15,0,0,0,0,14,0,0},{0,16,17,0,0,0,0,30},{0,23,23,18,19,0,23,23},{0,26,26,26,26,0,26,26},

{15,0,0,0,0,14,0,0},{0,28,28,28,28,0,28,28},{15,0,0,0,0,14,0,0},{15,0,0,0,0,14,0,0},

{15,0,0,0,0,14,0,0},{15,0,0,0,0,14,0,0},{0,16,17,0,0,0,115,0},{0,21,21,18,19,0,21,21},

{0,22,22,18,19,0,22,22},{0,24,24,24,24,0,24,24},{0,25,25,25,25,0,25,25},{0,27,27,27,27,0,27,27}};//GOTO表

intGOTO[10][3]={{1,2,3},{0,0,0},{0,0,0},{0,0,0},{10,2,3},{0,0,0},{0,11,3},{0,12,3},{0,0,13},{0,0,14}};

classGrammerAnalysis

{

private:

intLeftSymStr[M],*p1;//定义余留符号串和指向它的指针

intStatus[M],*p2;//定义状态和指向它的指针

intStack[M],*p3;//定义分析栈和指向它的指针

intTopSat,InpSym;//栈顶状态,当前输入单词

public:

GrammerAnalysis();

~GrammerAnalysis();

intConcludeSwitch(inta);////用来归约的产生式号,返回ETF,9,10,11

intETFtoNum(inta);//查GOTO表用来转换

intSearchAction(inta,intb);//查询动作表

intSearchGoto(inta,intb);//查询状态转移表

intBackChNum(inta);//归约产生式回退字符个数

voidInputWords();//输入单词

voidPushStatus(inta);//状态号压栈

voidAdvance(inta);//将余留符号串的当前字符移入分析栈

voidPopStack(inta);//归约时分析栈回退字符

voidPopStatus(inta);//归约时状态栈栈回退字符

voidNumToChar(inta);//数字转换为字符

voidStaNumToStaCh(inta);//状态号大于10时转换为字符

voidOutput(int*p1,int*p2,int*p3);

voidAnalysis();

voidError();

};

intGrammerAnalysis:

:

SearchAction(inta,intb)

{

returnACTION[a][b-1];

}

intGrammerAnalysis:

:

SearchGoto(inta,intb)

{

returnGOTO[a][b];

}

voidGrammerAnalysis:

:

StaNumToStaCh(inta)

{

switch(a)

{

case10:

cout<<"A";

break;

case11:

cout<<"B";

break;

case12:

cout<<"C";

break;

case13:

cout<<"D";

break;

case14:

cout<<"E";

break;

case15:

cout<<"F";

break;

default:

break;

}

}

voidGrammerAnalysis:

:

NumToChar(inta)

{

switch(a)

{

case1:

cout<<"i";

break;

case2:

cout<<"+";

break;

case3:

cout<<"-";

break;

case4:

cout<<"*";

break;

case5:

cout<<"/";

break;

case6:

cout<<"(";

break;

case7:

cout<<")";

break;

case8:

cout<<"#";

break;

case9:

cout<<"E";

break;

case10:

cout<<"T";

break;

case11:

cout<<"F";

break;

default:

break;

}

}

voidGrammerAnalysis:

:

Output(int*p1,int*p2,int*p3)

{

intstatick=11;

cout<

int*p4;

p4=&Status[0];

while(p4<=p2)

{

if(*p4>=10)

StaNumToStaCh(*p4);

else

cout<<*p4;

p4++;

}

cout<<"\t"<<"";

int*p5;

p5=&Stack[0];

while(p5<=p3)

{

NumToChar(*p5);

p5++;

}

cout<<"\t";

int*p6;

p6=p1;

p6--;

do

{

p6++;

cout.setf(ios:

:

right);

NumToChar(*p6);

}while(*p6!

=8);

cout<<"";

cout<<"\t";

cout.setf(ios:

:

left);

if(SearchAction(*p2,*p1)/10==1)

{

cout<<"S"<

cout<<"\t";

intnextStatus=SearchAction(*p2,*p1)%10;//下一状态

if(nextStatus>=10)

StaNumToStaCh(nextStatus);

else

cout<

}

elseif(SearchAction(*p2,*p1)/10==2)

{

cout<<"R"<

cout<<"\t";

inta=BackChNum(SearchAction(*p2,*p1)%10);

int*Ptr=p2;

while(a!

=0)

{

Ptr--;

a--;

}

intnextStatus=SearchGoto(*Ptr,ETFtoNum(ConcludeSwitch(SearchAction(*p2,*p1)%10)));

if(nextStatus>=10)

StaNumToStaCh(nextStatus);

else

cout<

}

elseif(SearchAction(*p2,*p1)/10==11)

{

cout<<"S"<<"15";

cout<<"\t"<<"F";

}

elseif((SearchAction(*p2,*p1)/10)==3)

cout<<"acc";

k++;

cout<

if(k%99==0)

k=11;

}

GrammerAnalysis:

:

GrammerAnalysis()

{

for(inti=0;i

{

LeftSymStr[i]=-1;

Status[i]=-1;

Stack[i]=-1;

}

Status[0]=0;

Stack[0]=8;

p1=&LeftSymStr[0];

p2=&Status[0];

p3=&Stack[0];

}

GrammerAnalysis:

:

~GrammerAnalysis()

{

}

voidGrammerAnalysis:

:

Error()

{

cout<<"\nError!

"<

}

voidGrammerAnalysis:

:

InputWords()

{

charch;

inti=0;

cout<<"请输入待测句子:

";

while((ch=cin.get())!

='\n')

{

LeftSymStr[i]=ch-48;//输入的字符转换为数字

i++;

}

cout<<"步骤"<<""<<"状态"<<"\t"<<"栈中符号"<<"\t"<<"余留符号串"\

<<"分析动作"<<"下一状态"<

}

voidGrammerAnalysis:

:

PopStack(inta)

{

inti=a;

do

{

*p3=-1;

i--;

if(i==0)

break;

p3--;

}while(i>=0);

}

voidGrammerAnalysis:

:

PopStatus(inta)

{

inti=a;

do

{

*p2=-1;

i--;

if(i==0)

break;

p2--;

}while(i>=0);

}

intGrammerAnalysis:

:

ConcludeSwitch(inta)//归约时调用

{

inta1;

switch(a)

{

case1:

case2:

case3:

a1=9;

break;

case4:

case5:

case6:

a1=10;

break;

case7:

case8:

a1=11;

break;

default:

break;

}

returna1;

}

intGrammerAnalysis:

:

ETFtoNum(inta)

{

inta1;

switch(a)

{

case9:

a1=0;

break;

case10:

a1=1;

break;

case11:

a1=2;

break;

default:

break;

}

returna1;

}

intGrammerAnalysis:

:

BackChNum(inta)

{

inta1;

switch(a)

{

case3:

case6:

case8:

a1=1;

break;

case1:

case2:

case4:

case5:

case7:

a1=3;

break;

default:

break;

}

returna1;

}

voidGrammerAnalysis:

:

PushStatus(inta)

{

p2++;

*p2=a;

}

voidGrammerAnalysis:

:

Advance(inta)

{*p3=a;}

voidGrammerAnalysis:

:

Analysis()

{

TopSat=0;

InpSym=*p1;

Output(p1,p2,p3);

while((SearchAction(TopSat,InpSym)/10)!

=3)

{

if((SearchAction(TopSat,InpSym)/10)==0)

{

Error();

break;

}

elseif((SearchAction(TopSat,InpSym)/10)==11)

{

p3++;

PushStatus(15);//状态号压栈

TopSat=15;

Advance(InpSym);//当前字符入分析栈

p1++;//p1指针后移

InpSym=*p1;//当前分析字符

Output(p1,p2,p3);

continue;

}

elseif((SearchAction(TopSat,InpSym)/10)==1)

{

p3++;

PushStatus(SearchAction(TopSat,InpSym)%10);//状态号压栈

TopSat=SearchAction(TopSat,InpSym)%10;

Advance(InpSym);//当前字符入分析栈

p1++;//p1指针后移

InpSym=*p1;//当前分析字符

Output(p1,p2,p3);

continue;

}

elseif((SearchAction(TopSat,InpSym)/10)==2)

{

PopStack(BackChNum(SearchAction(TopSat,InpSym)%10));//分析栈指针回退字符数等于用来归约的产生式右边符号数

Advance(ConcludeSwitch(SearchAction(TopSat,InpSym)%10));//将归约后的产生式左边符号压入分析栈

PopStatus(BackChNum(SearchAction(TopSat,InpSym)%10));//状态栈指针回退字符数等于用来归约的产生式右边符号数

p2--;//计算下一状态时需用的状态号

TopSat=SearchGoto(*p2,ETFtoNum(*p3));//归约后的状态

PushStatus(TopSat);//归约后的状态号压栈,p1指针保持不变

Output(p1,p2,p3);

continue;

}

}

if((SearchAction(TopSat,InpSym)/10)==0)

cout<

"<

else

cout<

"<

}

intmain()

{GrammerAnalysisGra;

Gra.InputWords();

Gra.Analysis();

return0;

}

#include

#include

usingnamespacestd;

#defineM101

/*

i1

+2

-3

*4

/5

(6

)7

#8

E9

T10

F11

S移近操作1【S115例外】

R归约操作2

acc3识别成功

*///ACTON表

intACTION[16][8]={

{15,0,0,0,0,14,0,0},{0,16,17,0,0,0,0,30},{0,23,23,18,19,0,23,23},{0,26,26,26,26,0,26,26},

{15,0,0,0,0,14,0,0},{0,28,28,28,28,0,28,28},{15,0,0,0,0,14,0,0},{15,0,0,0,0,14,0,0},

{15,0,0,0,0,14,0,0},{15,0,0,0,0,14,0,0},{0,16,17,0,0,0,115,0},{0,21,21,18,19,0,21,21},

{0,22,22,18,19,0,22,22},{0,24,24,24,24,0,24,24},{0,25,25,25,25,0,25,25},{0,27,27,27,27,0,27,27}};//GOTO表

intGOTO[10][3]={{1,2,3},{0,0,0},{0,0,0},{0,0,0},{10,2,3},{0,0,0},{0,11,3},{0,12,3},{0,0,13},{0,0,14}};

classGrammerAnalysis

{

private:

intLeftSymStr[M],*p1;//定义余留符号串和指向它的指针

intStatus[M],*p2;//定义状态和指向它的指针

intStack[M],*p3;//定义分析栈和指向它的指针

intTopSat,InpSym;//栈顶状态,当前输入单词

public:

GrammerAnalysis();

~GrammerAnalysis();

intConcludeSwitch(inta);////用来归约的产生式号,返回ETF,9,10,11

intETFtoNum(inta);//查GOTO表用来转换

intSearchAction(inta,intb);//查询动作表

intSearchGoto(inta,intb);//查询状态转移表

intBackChNum(inta);//归约产生式回退字符个数

voidInputWords();//输入单词

voidPushStatus(inta);//状态号压栈

voidAdvance(inta);//将余留符号串的当前字符移入分析栈

voidPopStack(inta);//归约时分析栈回退字符

voidPopStatus(inta);//归约时状态栈栈回退字符

voidNumToChar(inta);//数字转换为字符

voidStaNumToStaCh(inta);//状态号大于10时转换为字符

voidOutput(int*p1,int*p2,int*p3);

voidAnalysis();

voidError();

};

intGrammerAnalysis:

:

SearchAction(inta,intb)

{

returnACTION[a][b-1];

}

intGrammerAnalysis:

:

SearchGoto(inta,intb)

{

returnGOTO[a][b];

}

voidGrammerAnalysis:

:

StaNumToStaCh(inta)

{

switch(a)

{

case10:

cout<<"A";

break;

case11:

cout<<"B";

break;

case12:

cout<<"C";

break;

case13:

cout<<"D";

break;

case14:

cout<<"E";

break;

case15:

cout<<"F";

break;

default:

break;

}

}

voidGrammerAnalysis:

:

NumToChar(inta)

{

switch(a)

{

case1:

cout<<"i";

break;

case2:

cout<<"+";

break;

case3:

cout<<"-";

break;

case4:

cout<<"*";

break;

case5:

cout<<"/";

break;

case6:

cout<<"(";

break;

case7:

cout<<")";

break;

case8:

cout<<"#";

break;

case9:

cout<<"E";

break;

case10:

cout<<"T";

break;

case11:

cout<<"F";

break;

default:

break;

}

}

voidGrammerAnalysis:

:

Output(int*p1,int*p2,int*p3)

{

intstatick=11;

cout<

int*p4;

p4=&Status[0];

while(p4<=p2)

{

if(*p4>=10)

StaNumToStaCh(*p4);

else

cout<<*p4;

p4++;

}

cout<<"\t"<<"";

int*p5;

p5=&Stack[0];

while(p5<=p3)

{

NumToChar(*p5);

p5++;

}

cout<<"\t";

int*p6;

p6=p1;

p6--;

do

{

p6++;

cout.setf(ios:

:

right);

NumToChar(*p6);

}while(*p6!

=8);

cout<<"";

cout<<"\t";

cout.setf(ios:

:

left);

if(SearchAction(*p2,*p1)/10==1)

{

cout<<"S"<

cout<<"\t";

intnextStatus=SearchAction(*p2,*p1)%10;//下一状态

if(nextStatus>=10)

StaNumToStaCh(nextStatus);

else

cout<

}

elseif(SearchAction(*p2,*p1)/10==2)

{

cout<<"R"<

cout<<"\t";

inta=BackChNum(SearchAction(*p2,*

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

当前位置:首页 > 经管营销

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

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