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


文档评论(0)