- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验二语法分析(算符优先)
编译原理实验报告
实验名称:语法分析器设计
专业:计算机科学与技术
姓名:田莉莉
学号:201117906语法分析—算符优先分析程序
一.实验要求
⑴ 选择最有代表性的语法分析方法,如算符优先法、递归子程序法
⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。
⑶ 实习时间为
(3)给定表达式文法为:
G(E’): E’→#E#
E→E+T | T
T→T*F |F
F→(E)|i
(4)分析的句子为:
(i+i)*i和i+i)*i
三.程序设计思想及实现步骤
程序的设计思想:
按照编译原理教材提供的算法,本程序的设计主要实现三个主要的过程:
求解FristVT集和LastVT集:利用CString数组存放VT集,利用数组下标对应非终结符关系;
输出算符优先分析表:利用MFC中的ClistCtrl控件输出显示算符表,比利用二维数组对应其在内存中的关系。
利用算符优先分析表进行归约:根据教材所给算法,并对其进行实现在屏幕上输出归约过程。
实现步骤:
1、为程序各变量设计存储形式,具体设计如下所示:
CString m_strTElem[T_LEN]; //终结符
CString m_strNTElem[NT_LEN]; //非终结符
CMapStringToPtr m_mapProdu; //存放产生式
CMapStringToPtr m_mapProduEX; //存放扩展产生式
CString m_strFristVT[NT_LEN]; //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; //堆栈
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(|E+T|T|);
m_mapProdu.SetAt(_T(E),(void*)str);
CString* str1 = new CString;
*str1 = _T(|T*F|F|);
m_mapProdu.SetAt(_T(T),(void*)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),(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(kSTACK_LEN)
{
文档评论(0)