- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
語法分析器作业
编译原理实验报告
——实验三语法分析器
实验目的
熟悉并掌握语法分析器的工作原理和一般设计方法。通过本实验,进一步提高实际问题分析与解决的能力,以及程序设计能力。
实验要求:
简单语言的语法规则如下:
① S → i := E ;
② S → if C then S
③ S → while C do S
④ C → E E
⑤ C → E = E
以C语言系统为工具,用递归子程序法设计并实现上述简单语言的语法分析器,实现以下功能:
对于给定的简单语言的“句子”,经语法分析,能输出分析过程产生的“产生式”序列(或“语法树”)。能调用“词法分析器”识别出简单语言源程序中的一个个单词符号。
对如上简单语言设计测试用例,使用“简单语言语法分析器”,对该测试用例进行语法分析,给出测试用例的语法分析结果。
实验模块
(1)词法分析,识别单词符号
单词符号的转换图
(2)语法分析器 能识别由加+ 减- 乘* 除/ 乘方^ 括号()操作数所组成的算术表达式,其文法如下:
①S → i := E ;
② S → if C then S
③ S → while C do S
④ C → E E
⑤ C → E = E
使用的算法可以是:预测分析法;
5.实验结果截屏
测试用例为while (a+15)0 do if x2 = 7 then i= z;
6.实验总结
通过这次实验,我对词法分析器有了进一步的了解,把理论知识应用于实验中。也让我重新熟悉了C和C++语言的相关内容,加深了对C、C++语言知识的深化和用途的理解。通过这次语义分析的实验, 我对高级语言的学习有了更深的认识 ,了解得更透彻。
我了解了高级语言转化为目标代码或汇编指令的过程,。对今后的学习将起很大的作用,对以后的编程有很大的帮助. 并且通过此次实验,我了解了LR语法分析的实质和过程。实验虽然只是完成了一个简单的程序,并且程序的主要框架课本上有给出,但在组织程序结构和深入了确上学到了很多,加深对编译原理的理解,掌握编译程序的实现方法和技术。巩固了前面所学的知识。
7.程序源代码
词法分析器
#include stdafx.h
#include Word.h
//构造函数,对数据成员初始化,并将关键字以及运算符读入
Word::Word()
{//打开关键字文件
fstream keywordfile(keyword.txt);
if(!keywordfile)
{
couterror ! cant open keywordfile!endl;
system(pause);
exit(1);
}
//设置临时变量将关键字、符号文件中的内容存储
string tempword;
int tempencode;
string tempre;
int tempvalue;
//开始读关键字文件
while(!(keywordfile.eof()))
{ keywordfiletempwordtempencodetempretempvalue;
keywordlist.push_back(tempword);
keywordencode.push_back(tempencode);
keywordre.push_back(tempre);
keywordcodevalue.push_back(tempvalue);
}
//关闭关键字文件
keywordfile.close();
for(int i=0;ikeywordlist.size();i++)
{coutsetw(16)keywordlist[i]setw(16)keywordencode[i]setw(12)keywordre[i]setw(12)keywordcodevalue[i]endl;
}
fstream signwordfile(signword.txt);
if(!signwordfile)
{ couterror ! cant open signwordfile!endl;
system(pause);
exit(1);
}
//开始读符号文件
while(!(signwordfile.eof()))
{
signwordfiletempwordtempencodetempretempvalue;
signlist.push_back(tempword);
si
文档评论(0)