




免费预览已结束,剩余4页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验三 编译原理综合实验报告(LR(0)语法分析的实现) 一、实验名称:LR(0)语法分析的实现二、仪器、设备:计算机三、参考资料:编译原理教程习题解析与上机指导(西安电子科技大 胡元义等)四、实验目的:综合运用所学知识,集成词法分析、符号表管理等程序的成果,编程实现LR(0)算法,能根据预先定义的文法规则生成LR(0)分析表,并对输入串进行语法分析。具体即要实现:录入合法的LR(0)文法,将输出LR(0)分析表,并可以对输入的句子进行语法分析输出相应语法树。五、实验内容:(实验步骤) 按实习目的和要求,用C或者C+语言编写一个LR(0)的语法分析程序,同时考虑相应的数据结构。 调试 调试例子应包括符合文法规则的LR(0)文法,以及分析程序能够判别的若干错例。作为纠错部分的功能体现 。 输出 对于所输入的LR(0)文法,不论对错,都应有明确的信息告诉外界。对于符合规则的LR(0)文法,将输出LR(0)分析表,并可以对输入的句子进行语法分析输出相应语法树。 扩充 有余力的同学,可适当扩大分析算法。譬如: SLR(1)分析方法的实现 LR(1)分析方法的实现六、实验原理、数据(程序)记录(一)实验原理: 利用LR(k)类分析算法的四个步骤,分别实现“移进”、“归约”、“成功”、“报错”的分析能力。同时采用相应的数据结构实现分析表的描述。(二)程序框架: #include stdafx.h#include GoData.hGoData:GoData()iFrom = -1;cChar = 0;iTo = -1;GoData:GoData()/ AnalyzeDlg.cpp : implementation file/#include stdafx.h#include LR0ForWin.h#include AnalyzeDlg.h#include #include #include Pair.husing namespace std;#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAnalyzeDlg dialogCAnalyzeDlg:CAnalyzeDlg(CWnd* pParent /*=NULL*/): CResizingDialog(CAnalyzeDlg:IDD, pParent)/AFX_DATA_INIT(CAnalyzeDlg)m_input = _T();/AFX_DATA_INITm_strTempFilename = ;m_pTree = new CTreeDlg;m_pTree-Create(IDD_DIALOG3, this);m_pTree-SetControlInfo(IDC_TREE1, RESIZE_BOTH);m_pTree-SetControlInfo(IDOK, ANCHORE_BOTTOM | ANCHORE_RIGHT);CAnalyzeDlg:CAnalyzeDlg()m_pTree-DestroyWindow();delete m_pTree;void CAnalyzeDlg:DoDataExchange(CDataExchange* pDX)CResizingDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAnalyzeDlg)DDX_Control(pDX, IDC_EDIT1, m_edit1);DDX_Control(pDX, IDC_EXPLORER1, m_web);DDX_Text(pDX, IDC_EDIT1, m_input);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAnalyzeDlg, CResizingDialog)/AFX_MSG_MAP(CAnalyzeDlg)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_WM_ACTIVATE()/AFX_MSG_MAPEND_MESSAGE_MAP()/ CAnalyzeDlg message handlersvoid CAnalyzeDlg:OnOK() / TODO: Add extra validation here/CDialog:OnOK();void CAnalyzeDlg:OnCancel() / TODO: Add extra cleanup hereif (m_strTempFilename != )DeleteFile(m_strTempFilename.c_str();CResizingDialog:OnCancel();void CAnalyzeDlg:OnButton1() / TODO: Add your control notification handler code hereUpdateData(TRUE);m_pTree-m_tree.DeleteAllItems();for(int i = 0; i m_input.GetLength(); i +)if (!m_g.IsInVt(m_input.GetAt(i)MessageBox(输入的句子不全部由终结符组成, 错误, MB_OK | MB_ICONSTOP);return;assert(TreeStack.empty();m_input += #;char szTempPathMAX_PATH; char szTempNameMAX_PATH; if (m_strTempFilename != ):DeleteFile(m_strTempFilename.c_str();:GetTempPath(100,szTempPath);:GetTempFileName(szTempPath,LR0,0,szTempName);m_strTempFilename = szTempName;CStdioFile out;out.Open(szTempName, CFile:modeCreate | CFile:modeWrite);out.WriteString(n);out.WriteString(n);out.WriteString(Untitled Documentn);out.WriteString(n);out.WriteString(n);out.WriteString(n);out.WriteString(n);out.WriteString(n 步骤 n 状态栈n 符号栈 n 输入串 n ACTION n GOTO n n);vector Status;vector Symbol;int iStep = 1;int iPos = 0;Status.push_back(0);Symbol.push_back(#);Pair ToDo;bool bErrorFlag = false;bool bGoOn = true;while (bGoOn) & (!bErrorFlag)assert(iPos m_input.GetLength();assert(Status.size() = Symbol.size();ToDo = m_g.GetAction(Status.back(), m_input.GetAt(iPos);int i, j;switch (ToDo.one)case S:out.WriteString(GetStepInfo(iStep, Status, Symbol, m_input.Right(m_input.GetLength() - iPos), ToDo, -1);Symbol.push_back(m_input.GetAt(iPos);Status.push_back(ToDo.two);iPos+;break;case R:j = m_g.GetGoTo(StatusStatus.size()-m_g.GetPrecept(ToDo.two).GetRight().length()-1, m_g.GetPrecept(ToDo.two).GetLeft()0);assert(j != -1);out.WriteString(GetStepInfo(iStep, Status, Symbol, m_input.Right(m_input.GetLength() - iPos), ToDo, j);for(i = 0; i m_g.GetPrecept(ToDo.two).GetRight().length(); i+)Status.pop_back();Symbol.pop_back();Symbol.push_back(m_g.GetPrecept(ToDo.two).GetLeft()0);Status.push_back(j);TreeStack.push(ToDo.two);break;case a:if (m_input.GetAt(iPos) = #)out.WriteString(GetStepInfo(iStep, Status, Symbol, m_input.Right(m_input.GetLength() - iPos), ToDo, -1);bGoOn = false;elsebErrorFlag = true;break;case 0:bErrorFlag = true;break;default:assert(false);iStep+;out.WriteString();if (bErrorFlag)out.WriteString(分析失败,输入的字符串是不符合预定文法的!n);/m_pTree-m_tree.DeleteAllItems();while(!TreeStack.empty()TreeStack.pop();elseout.WriteString(分析完成,输入的字符串是预定文法的句子n);/HTREEITEM h = m_pTree-m_tree.GetRootItem();/ExpandTree(h);MakeTree();out.WriteString(n);out.Close();m_web.Navigate(szTempName,NULL,NULL,NULL,NULL);m_edit1.SetFocus();m_edit1.SetSel(0, -1);BOOL CAnalyzeDlg:OnInitDialog() CResizingDialog:OnInitDialog();SetIcon(LoadIcon(:AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME),FALSE);/ TODO: Add extra initialization herem_web.Navigate(about:blank,NULL,NULL,NULL,NULL);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSEvoid CAnalyzeDlg:SetGrammar(const Grammar & g)m_g = g;CString CAnalyzeDlg:GetStepInfo(int iStep, const vector & Status, const vector & Symbol, CString sInput, Pair Action, int Goto)CString rtn;rtn.Format( %d n,iStep);CString t2 = ;CString t;int nCount = 0;for (int i = 0; i Status.size(); i+)if (nCount % 2)t.Format(%d, Statusi);elset.Format(%d, Statusi);t2 += t;nCount+;rtn = rtn + + t2 + n t2 = ;for(i = 0; i Symbol.size(); i+)t.Format(%c, Symboli);t2 += t;rtn = rtn + t2 + n;rtn = rtn + + sInput + n;if (Action.one != a)t2.Format(%c%d, Action.one, Action.two);elset2 = acc;rtn = rtn + + t2 + n;if (Goto = -1)rtn += n;elset2.Format( %d n, Goto);rtn += t2;rtn += n;return rtn;void CAnalyzeDlg:MakeTree()HTREEITEM hRoot = m_pTree-m_tree.InsertItem(CString(m_g.GetStart();CString temp;HTREEITEM hItem = hRoot;stack s;s.push(hItem);while (!TreeStack.empty()temp = m_g.GetPrecept(TreeStack.top().GetRight().c_str();hItem = s.top();s.pop();TreeStack.pop();for(int i = 0; i m_tree.InsertItem(CString(temp.GetAt(i), hItem);if(m_g.IsInVn(temp.GetAt(i)s.push(hItem2);m_pTree-m_tree.Expand(hItem, TVE_EXPAND);assert(s.empty();assert(TreeStack.empty();void CAnalyzeDlg:OnButton2() / TODO: Add your control notification handler
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 客运驾驶员管理制度
- 家俱定制厂管理制度
- 家政保洁员管理制度
- 当家塘长效管理制度
- 影视后期部管理制度
- 德克士员工管理制度
- 心电图院感管理制度
- 快递存放点管理制度
- 怎样制作群管理制度
- 总承包施工管理制度
- 临商银行股份有限公司招聘笔试真题2024
- 近代史第三章试题及答案
- 地理●甘肃卷丨2024年甘肃省普通高中学业水平等级性考试高考地理真题试卷及答案
- 2025年中考英语考前冲刺押题模拟试卷 3套(含答案)
- 吊装-运输方案(3篇)
- 静脉留置针大赛理论考核考试试题及答案
- 【8道期末】安徽省芜湖市无为市2023-2024学年八年级下学期期末道德与法治试题(含解析)
- 2025年钢丝材料项目市场调查研究报告
- 叙事护理分享课件
- 2025国家开放大学《员工劳动关系管理》形考任务1234答案
- 湖南省湘乡市中考各科试卷及答案
评论
0/150
提交评论