编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx
- 文档编号:28938251
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:33
- 大小:67.17KB
编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx
《编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx》由会员分享,可在线阅读,更多相关《编译原理 无符号数的算术四则运算LR语法分析器设计实现.docx(33页珍藏版)》请在冰豆网上搜索。
编译原理无符号数的算术四则运算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,*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 无符号数的算术四则运算LR语法分析器设计实现 编译 原理 符号 算术 四则运算 LR 语法 分析器 设计 实现