ImageVerifierCode 换一换
格式:DOC , 页数:11 ,大小:148.50KB ,
资源ID:6867129      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/6867129.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(实验二语法分析(算符优先) (2).doc)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

实验二语法分析(算符优先) (2).doc

1、 编译原理实验报告 实验名称:语法分析器设计 专业:计算机科学与技术 姓名:田莉莉 学号:201117906 语法分析—算符优先分析程序 一.实验要求 ⑴ 选择最有代表性的语法分析方法,如算符优先法、递归子程序法或LR分析法 ⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。 ⑶ 实习时间为6学时。 二.实验内容及要求 (1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表 输出到屏幕或者输出到文件); (2)根

2、据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程) (3)给定表达式文法为: G(E’): E’→#E# E→E+T | T T→T*F |F F→(E)|i (4)分析的句子为: (i+i)*i和i+i)*i 三.程序设计思想及实现步骤 程序的设计思想: 按照编译原理教材提供的算法,本程序的设计主要实现三个主要的过程: (1) 求解FristVT集和LastVT集:利用CString数组存放VT集,利用数组下标对应非终结符关系; (2) 输出算符优先分析表:利用MFC中的ClistCtrl控件输出显

3、示算符表,比利用二维数组对应其在内存中的关系。 (3) 利用算符优先分析表进行归约:根据教材所给算法,并对其进行实现在屏幕上输出归约过程。 实现步骤: 1、为程序各变量设计存储形式,具体设计如下所示: CString m_strTElem[T_LEN]; //终结符 CString m_strNTElem[NT_LEN]; //非终结符 CMapStringToPtr m_mapProdu; //存放产生式 CMapStringToPtr m_mapProduEX; //存放扩展产生式 CString m_strFristVT[NT_LEN]

4、 //fristVT集 CString m_strLastVT[NT_LEN]; //lastVT集 int m_nPriSheet[T_LEN+1][T_LEN+1]; //优先表;无穷大表示空白,-1表示小于,0表示相等,1表示大于 Find m_F[STACK_LEN]; //bool数组 CStrack m_stack; //堆栈 2、为程序设计各个过程,具体设计如下所示: void CreateFristVT(Find* F); //为每一个非终结符创建FristVT集 void CreateLastVT(Find* F)

5、 //为每一个非终结符/创建LastVT集 void SearchPForFirtVT(Find& f); //搜索形如P->a….或P->Qa…. 的产生式 void SearchQForFristVT(void); //搜索形如P->....Q的产生式 void SearchPForLastVT(Find& f); //搜索形如P->...aQ或P->...a的产生式 void SearchQForLastVT(void); //搜索形如P->....Q的产生式 OnBnClickedBtnAnasysic(); //点击按钮启动分析 3、对各个

6、过程进行实现; 4、调试运行并检验实验结果,结果如图2.1和2.2所示: 图2.1 分析成功图 图2.2 分析失败图 四.程序源码 产生式初始化: //产生式 CString* str = new CString; *str = _T("|E+T|T|"); m_mapProdu.SetAt(_T("E"),(void*)str); CString* str1 = new CString; *str1 = _T("|T*F|F|"); m_mapProdu.SetAt(_T("T"),(voi

7、d*)str1); CString* str2 = new CString ; *str2 = _T("|(E)|i|"); m_mapProdu.SetAt(_T("F"),(void*)str2); CString* str3 = new CString; *str3 = _T("|E+T|F+F|F*F|E+F|T|F|"); m_mapProduEX.SetAt(_T("E"),(void*)str3); CString* str4 = new CString; *str4 = _T("|T*F|F|"); m_mapProduEX.SetAt(_T("T"

8、),(void*)str4); CString* str5 = new CString ; *str5 = _T("|(E)|i|(F)|"); m_mapProduEX.SetAt(_T("F"),(void*)str5); 程序主要代码: void CGrammarAnalysisDlg::InitFind(void) { int i,j; int k = 0; while(k

9、rm = m_strNTElem[i]; m_F[k].m_strTerm = m_strTElem[j]; m_F[k].m_bIsVT = FALSE; k++; } } } //查找 P->a... 和 P->Qa... void CGrammarAnalysisDlg::SearchPForFirtVT(Find& f) { CString* str; m_mapProdu.Lookup(f.m_strNTerm,(void*&)str); int nFrist = 0; int nLen = 0; while

10、nLen+1 < str->GetLength())// P->a... P和 P->Qa... { nFrist = nLen; nLen = str->Find('|',nFrist+1); CString strProduce = str->Mid(nFrist+1,nLen-nFrist-1); if(IsNT(strProduce,0) && IsT(strProduce,1)) { if(strProduce.GetAt(1) == f.m_strTerm) { if(!f.m_bIsVT) { f

11、m_bIsVT = TRUE; //CreateFristVT(f); m_stack.PushStack(f); } } } if(IsT(strProduce,0)) { if(strProduce.GetAt(0) == f.m_strTerm) { if(!f.m_bIsVT) { f.m_bIsVT = TRUE; //CreateFristVT(f); m_stack.PushStack(f); } } } } }

12、 //判断产生式第nLocat位置的字符是否是非终结符 BOOL CGrammarAnalysisDlg::IsNT(CString strProduc,int nLocat) { for(int i=0;i

13、 { for(int i=0;iQ void CGrammarAnalysisDlg::SearchQForFristVT(void) { Find Q; CString strNT; CString* str; while(m_stack.m_nTo

14、p != 0) { m_stack.PopStack(Q); POSITION pos = m_mapProdu.GetStartPosition(); while(pos) { m_mapProdu.GetNextAssoc(pos,strNT,(void*&)str); int nFrist = 0; int nLen = 0; while(nLen+1 < str->GetLength()) { nFrist = nLen; nLen = str->Find('|',nFrist+1);

15、 CString strProduce = str->Mid(nFrist+1,nLen-nFrist-1); if(IsNT(strProduce,0)) { if(strProduce.GetAt(0) == Q.m_strNTerm) { //Q.m_bIsVT = TRUE; for(int i=0;i

16、 { if(!m_F[i].m_bIsVT) { m_F[i].m_bIsVT = TRUE; m_stack.PushStack(m_F[i]); break; } } } } } } } } } // //P->...aQ或P->...a void CGrammarAnalysisDlg::SearchPForLastVT(Find& f) { CString* str;

17、 m_mapProdu.Lookup(f.m_strNTerm,(void*&)str); int nFrist = 0; int nLen = 0; while(nLen+1 < str->GetLength())// P->a... P和 P->Qa... { nFrist = nLen; nLen = str->Find('|',nFrist+1); CString strProduce = str->Mid(nFrist+1,nLen-nFrist-1); int nLocat = strProduce.GetLength(); if

18、nLocat-2>0) { if(IsNT(strProduce,nLocat-1) && IsT(strProduce,nLocat-2)) { if(strProduce.GetAt(nLocat-2) == f.m_strTerm) { if(!f.m_bIsVT) { f.m_bIsVT = TRUE; m_stack.PushStack(f); } } } } if(IsT(strProduce,nLocat-1)) { i

19、f(strProduce.GetAt(nLocat-1) == f.m_strTerm) { if(!f.m_bIsVT) { f.m_bIsVT = TRUE; m_stack.PushStack(f); } } } } } // //P->....Q void CGrammarAnalysisDlg::SearchQForLastVT(void) { Find Q; CString strNT; CString* str; while(m_stack.m_nTop != 0)

20、 { m_stack.PopStack(Q); POSITION pos = m_mapProdu.GetStartPosition(); while(pos) { m_mapProdu.GetNextAssoc(pos,strNT,(void*&)str); int nFrist = 0; int nLen = 0; while(nLen+1 < str->GetLength()) { nFrist = nLen; nLen = str->Find('|',nFrist+1); CSt

21、ring strProduce = str->Mid(nFrist+1,nLen-nFrist-1); int nLocat = strProduce.GetLength(); if(IsNT(strProduce,nLocat-1)) { if(strProduce.GetAt(nLocat-1) == Q.m_strNTerm) { //Q.m_bIsVT = TRUE; for(int i=0;i

22、 strNT && m_F[i].m_strTerm == Q.m_strTerm) { if(!m_F[i].m_bIsVT) { m_F[i].m_bIsVT = TRUE; m_stack.PushStack(m_F[i]); break; } } } } } } } } } void CGrammarAnalysisDlg::OnBnClickedBtnAn

23、sysic() { // TODO: 在此添加控件通知处理程序代码 //初始化列表控件 //m_lbResult.AddString(_T("kjl")); m_lst.SetExtendedStyle(LVS_EX_AUTOSIZECOLUMNS|LVS_EX_GRIDLINES); CRect rc; m_lst.GetClientRect(rc); int nWidth = rc.Width()/(T_LEN+2); int i = 0; m_lst.InsertColumn(i,_T(""),LVCFMT_CENTER,nWidth); f

24、or(i=1;i

25、T("E")); for(int i=0;i

26、g* str; POSITION pos =m_mapProdu.GetStartPosition(); CString strNT; int nColumn; int nItem; while(pos) { m_mapProdu.GetNextAssoc(pos,strNT,(void*&)str); int nFrist = 0; int nLen = 0; while(nLen+1 < str->GetLength()) { nFrist = nLen; nLen = str->Find('|',nFrist+1)

27、 CString strProduce = str->Mid(nFrist+1,nLen-nFrist-1); int nLocat = strProduce.GetLength(); for(int i=0;i

28、 m_nPriSheet[nItem][nColumn] = 0; m_lst.SetItemText(nItem,nColumn+1,_T("=")); } if(i<=nLocat-2 && IsT(strProduce,i) && IsT(strProduce,i+2) && IsNT(strProduce,i+1)) { nItem = FindTLocat(strProduce.GetAt(i)); nColumn = FindTLocat(strProduce.GetAt(i+2)); m_nPriShe

29、et[nItem][nColumn] = 0; m_lst.SetItemText(nItem,nColumn+1,_T("=")); } if(IsT(strProduce,i) && IsNT(strProduce,i+1)) { nItem = FindTLocat(strProduce.GetAt(i)); int nNTLocat = FindNTLocat(strProduce.GetAt(i+1)); int nVTLen = m_strFristVT[nNTLocat].GetLength();

30、 for(int j=0;j

31、ce.GetAt(i+1)); int nNTLocat = FindNTLocat(strProduce.GetAt(i)); int nVTLen = m_strLastVT[nNTLocat].GetLength(); for(int j=0;j

32、mn+1,_T(">")); } } } } } //处理‘#',,行 nItem = T_LEN; wchar_t ch = '('; for(int i=0;i

33、1,_T("<")); break; case 1: m_nPriSheet[nItem][i] = 1; m_lst.SetItemText(nItem,i+1,_T(">")); break; } } //处理‘#’,,列 nColumn = T_LEN; ch = ')'; for(int i=0;i

34、ase -1: m_nPriSheet[i][nColumn] = -1; m_lst.SetItemText(i,nColumn+1,_T("<")); break; case 1: m_nPriSheet[i][nColumn] = 1; m_lst.SetItemText(i,nColumn+1,_T(">")); break; } } //最后一角 nItem = T_LEN; nColumn = T_LEN; m_nPriSheet[nItem][nColumn] = 0; m_lst.SetItem

35、Text(nItem,nColumn+1,_T("=")); } void CGrammarAnalysisDlg::CreateFristVT(Find* F) { for(int i=0;i

36、 } } } void CGrammarAnalysisDlg::CreateLastVT(Find* F) { for(int i=0;i

37、mmarAnalysisDlg::FindTLocat(wchar_t strT) { for(int i=0;i

38、 return 0; } void CGrammarAnalysisDlg::OnBnClickedBtnAnasysic() { // TODO: 在此添加控件通知处理程序代码 //清空列表控件 int nCount = m_lbResult.GetCount(); for(int i=0;i

39、k.m_Ch[k] = (_T("#")); // //int nLen = m_strSen.GetLength(); m_strSen += _T("#"); int i = -1; do { i++; if(IsT(m_stack.m_Ch[k],0)) j = k; else j = k-1; int nItem = FindTLocat(m_stack.m_Ch[j].GetAt(0)); int nColumn = FindTLocat(m_strSen[i]); while(m_nPriSheet[nI

40、tem][nColumn] == 1) { int nItem1,nColumn1; do { Q = m_stack.m_Ch[j]; if(IsT(m_stack.m_Ch[j-1],0)) j = j-1; else j= j-2; nItem1 = FindTLocat(m_stack.m_Ch[j].GetAt(0)); nColumn1 = FindTLocat(Q.GetAt(0)); } while (m_nPriSheet[nItem1][nColumn1] != -1)

41、 CString strToProduce; for(int m = j+1;m<=k;m++) { strToProduce += m_stack.m_Ch[m]; } //输出产生式 POSITION pos = m_mapProduEX.GetStartPosition(); CString strNT; CString* str; while(pos) { m_mapProduEX.GetNextAssoc(pos,strNT,(void*&)str); int n

42、Frist = 0; int nLen = 0; while(nLen+1 < str->GetLength()) { nFrist = nLen; nLen = str->Find('|',nFrist+1); CString strProduce = str->Mid(nFrist+1,nLen-nFrist-1); if(strProduce == strToProduce) { CString strResult; strResult = strNT; s

43、trResult += _T("->"); strResult += strToProduce; m_lbResult.AddString(strResult); k = j+1; m_stack.m_Ch[k] = strNT; break; } } } nItem = FindTLocat(m_stack.m_Ch[j].GetAt(0)); nColumn = FindTLocat(m_strSen[i]); // } nItem = FindTLoca

44、t(m_stack.m_Ch[j].GetAt(0)); nColumn = FindTLocat(m_strSen[i]); if(m_nPriSheet[nItem][nColumn] == -1 || m_nPriSheet[nItem][nColumn] == 0) { k += 1; m_stack.m_Ch[k] = m_strSen[i]; } else { MessageBox(_T("错误!")); return; } }while(m_strSen[i] != '#'); Messag

45、eBox(_T("成功!")); } 五.结果分析及试验心得: 本次实验做起来有点复杂,我认为重点在对教材所给算法的理解及个变量存储形式的设计。好的存储形式不仅可简化对数据的操作,也可以精简程序的设计过程。 下面是我的有关变量存储形式的设计: (1) 产生式:通过分析对已知的产生式进行了扩展,将产生式放入CMapStringToPtr的类型变量中存储,利用‘|’将统一非终结符的产生式隔开。使用时对CString的变量遍历,每次输出一个产生式; (2) 终结符和非终结符:采用数组的形式存储,利用下标对应每一个字符; (3) FristVT和LastVT:利CStr

46、ing类型的数组存放,每个位置的元素 对应了一个非终结符; (4) 算符优先表:利用二维数组存放其中无穷大表示空白,-1表示小于,0表示相等,1表示大于。 虽然在有些结构的设计上还不是太合理,但在实验中这种结构的设计给我完成实验提供了不上的便利。 关于程序的一点思考: 对于算符优先分析我们知道最大的便利就是可以跳过许多单非产生式,但是在程序的实现起来却是不太好处理,一般可采用两种方法:(1)通过每次输入的产生式,寻找扩展文法,在归约是利用扩展文法;这种方法增加了存储空间,但加快了归约过程的时间。(2)在归约过程中对每一产生式进行处理,这样节省了存储空间,但在时间效率上没有第一种的好。本次试验我采用的是第一种方法,但是个人觉得第二种方法更利于实现。 本次实验虽然做完了,但是程序的功能在很多方面还不完善,如不能自动输入产生式、输出的结果不直观等。这些都还需要在以后继续改进!

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服