第一范文网 - 专业文章范例文档资料分享平台

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

来源:用户分享 时间:2025/6/7 16:23:26 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

编译原理实验报告

实验名称:语法分析器设计

专业:计算机科学与技术 姓名:田莉莉 学号:201117906

语法分析—算符优先分析程序

一.实验要求

⑴ 选择最有代表性的语法分析方法,如算符优先法、递归子程序法或LR分析法

⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。

⑶ 实习时间为6学时。

二.实验内容及要求

(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表 输出到屏幕或者输出到文件);

(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) 利用算符优先分析表进行归约:根据教材所给算法,并对其进行实现在

屏幕上输出归约过程。

实现步骤:

1、为程序各变量设计存储形式,具体设计如下所示:

CString m_strTElem[T_LEN]; CString m_strNTElem[NT_LEN]; CMapStringToPtr m_mapProdu;

//终结符 //非终结符 //存放产生式

CMapStringToPtr m_mapProduEX; CString m_strFristVT[NT_LEN]; CString m_strLastVT[NT_LEN]; int m_nPriSheet[T_LEN+1][T_LEN+1]; Find m_F[STACK_LEN]; CStrack m_stack;

//存放扩展产生式 //fristVT集 //lastVT集

//优先表;无穷大表示空白,-1表示小于,0表示相等,1表示大于 //bool数组 //堆栈

2、为程序设计各个过程,具体设计如下所示:

void CreateFristVT(Find* F); //为每一个非终结符创建FristVT集 void CreateLastVT(Find* F); //为每一个非终结符/创建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、对各个过程进行实现;

4、调试运行并检验实验结果,结果如图2.1和2.2所示:

图2.1 分析成功图

图2.2 分析失败图

四.程序源码

产生式初始化:

//产生式

CString* str = new CString; *str = _T(\

m_mapProdu.SetAt(_T(\ CString* str1 = new CString; *str1 = _T(\

m_mapProdu.SetAt(_T(\CString* str2 = new CString ; *str2 = _T(\

m_mapProdu.SetAt(_T(\CString* str3 = new CString;

*str3 = _T(\ m_mapProduEX.SetAt(_T(\CString* str4 = new CString; *str4 = _T(\

m_mapProduEX.SetAt(_T(\CString* str5 = new CString ; *str5 = _T(\

m_mapProduEX.SetAt(_T(\

程序主要代码:

void CGrammarAnalysisDlg::InitFind(void) {

int i,j; int k = 0;

while(k

{

for(i=0;i

for(j=0;j

m_F[k].m_strNTerm = m_strNTElem[i];

搜索更多关于: 实验二 语法分析(算符优先)(2) 的文档
实验二 语法分析(算符优先)(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c6e6lf7z31z9acj39pwbi_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top