(完整word版)编译原理算符优先分析C++源代码_第1页
(完整word版)编译原理算符优先分析C++源代码_第2页
免费预览已结束,剩余5页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、算符优先分析器源代码:#include #include#define MAX 100 using namespace std; struct Stack / 符号栈char dataMAX;int top;char Terminal6=;,(,),a,+,#; / 终结符集合 char Table66= / 算符优先关系表, , , ,IJJJJJJ J, , =, , , , , !, , , , , !, , , , , !, , !, , !, =;/判断是否为终结符,是返回其所在位置i,否则返回-1int Is_Vt(char ch,char Terminal6)int i; for

2、(i=0;i6;i+)if(ch=Terminali) / 输入符为终结符 return i;return -1;/ 读入输入串,返回其长度int Getchar(int length,char StringMAX)int i;coutlength;coutendl* 该输入串为: ;for(i=0;iStringi;return length;void PrintStack(Stack &st, int top) / 输出栈中的内容for(int i=0;i=top;i+)coutst.datai ; cout tt;int main()Stack st;int length=0,L

3、en,k;char StringMAX,ch;Len=Getchar(length,String); / 获得输入串 int j=0;ch=Stringj; / 指向第一个输入符 st.top=0;st.datast.top=#; / 将 #入栈coutendl*cout 符 号 栈 setw(15) 当 前 符 号 setw(15) 剩 余 输 入串 setw(20) 移进或归约 endl; / 输出格式while(st.top!=1 | ch!=#)if(Is_Vt(ch,Terminal)!=-1) / 输入符为终结符k=Is_Vt(ch,Terminal); / 获取分析表 Table

4、 的第二个下标 int m,t; /t 指向终结符在栈中的位置 if(Is_Vt(st.datast.top,Terminal)!=-1) / 栈顶为终结符m=Is_Vt(st.datast.top,Terminal);/ 获取分析表 Table 的第 一个下标t=st.top;else / 栈顶为非终结符,看 top-1m=Is_Vt(st.datast.top-1,Terminal);/ 获取分析表 Table 的第一个下标t=st.top-1;if(Tablemk= | Tablemk=) / 栈顶符号的优先级小 于等于endl;输入符号,压栈PrintStack(st,st.top);

5、 / 输出栈中内容 coutchsetw(10); /输出当前符号 for(int p=j+1;p=Len;p+) / 输出剩余输入串coutStringp;coutttt 移进 endl; / 输出下一步进行的操作st.top+;st.datast.top=ch; / 输入符移进栈中j+;ch=Stringj; / 指向下一输入符else if(Tablemk=!) / 两终结符的优先关系不确定coutendl* 分析出错 !*endl;return 0;else / 栈顶符号的优先级大于输入符,归约int q; / 表示分析表 Table 的行if(Is_Vt(st.datat-1,Ter

6、minal)!=-1) / 终结符相邻符号也是 终结符q=Is_Vt(st.datat-1,Terminal);/ 获得分析表 Table 的 行t=t-1; / 获得分析表 Table 的列else /t-1 位置是一个非终结符q=Is_Vt(st.datat-2,Terminal);t=t-2;while(Tableqm!=)m=q;if(Is_Vt(st.datat-1,Terminal)!=-1) / 终结符相邻符号 也是终结符q=Is_Vt(st.datat-1,Terminal);/ 获 得 分 析 表 Table 的行 t=t-1; / 获得分析表Table 的列else /t-

7、1 位置是一个非终结符q=Is_Vt(st.datat-2,Terminal);t=t-2;PrintStack(st,st.top); coutchsetw(10); for(intp=j+1;p=Len;p+) coutStringp;coutttt 归约 endl;st.top=t+1;st.datast.top=N;elsecoutendl* 该输入串不是文法的句子 !*endl; return 0;PrintStack(st,st.top);coutchsetw(10);for(int p=j+1;p=Len;p+)coutStringp;coutttt 接受 endl;couten

8、dl*分析成功:该输入串是文法的句子!*endl;return 0;运行结果:嬴H:编译原理调试程唐Debug、优先-eie亥输入串为:色吩祈成功:该输入串是文法的句子TPress an/ key to continuecontinye*1衰输 入串为:a;f翼X?(耳MENX耳耳KiOtE貫羔处算貝覽梵h寸彳旱NWJt XXJfME SOC Jt耳貝K址耳HiCiOtJfXK当前符号剩余输天串移a;att;att;aNCatt时号栈当前符号CaB a+ N+B N *BLB tt tt tk Ntt分析过程 剩余输天串a+att+a)ttaaHUtlKKKiMKKWK耳耳:ME員iMNaOCXiMJC耳耳6鳶移进或归约賢进哆进移进移进b归约NKJC江辽週量沌NKKXNJ(耳耳*该输入串为:a;#十分析成功:该输入串学文法的句子?十Press any key to continue进翁逬常进约翁约约K编译原理调试程序Debug优先exe;*输入字符串 的长度f X XX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论