编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx
《编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx》由会员分享,可在线阅读,更多相关《编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx(33页珍藏版)》请在冰豆网上搜索。
![编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx](https://file1.bdocx.com/fileroot1/2023-7/17/135339f3-3378-4eb0-bb96-5e574e9304a2/135339f3-3378-4eb0-bb96-5e574e9304a21.gif)
编译原理无符号数的算术四则运算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,*