- 1、本文档共22页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
PAGE/NUMPAGES
编译原理第二次上机实验报告
姓名:李x
班级:软工140x班
学号:U2025172xx
实验二设计实现简单语言的语法分析器
1、实验目的
通过该实验,熟练应用编译原理关于语法分析的基本理论和方法;学会用C/C++高级程序设计语言设计一个语法分析器;加深对编译原理理论的分析理解,提高实际操作和解决具体问题的能力。
2、实验条件
计算机上安装C/C++编译处理软件。
3、实验内容及要求
对下述单词表与语法定义的语言设计编制一个语法分析器。单词符号及种别表、语法及语法分析器功能、基本要求如下:
(1)单词符号及种别表
单词符号
种别编码
单词值
main
1
int
2
float
3
double
4
char
5
if
6
else
7
do
8
while
9
l(l|d)*
10
内部字符串
(+|-|ε)dd*(.dd*|ε)(e(+|-|ε)dd*|ε)
20
二进制数值表示
=
21
+
22
-
23
*
24
/
25
(
26
)
27
{
28
}
29
,
30
;
31
32
=
33
34
=
35
==
36
!=
37
#
0
(2)语法结构定义
表达式::=项{+项|-项}
项::=因子{*因子|/因子}
因子::=ID|num|(表达式)
num::=(+|-|ε)数字数字*(.数字数字*|ε)(e(+|-|ε)数字数字*|ε)
ID::=字母(字母|数字)*
字母::=a|b|c…|z|A|B|C…|Z
数字::=0|1|2…|9
(3)语法分析器功能及基本要求
处理用户提交的符合上述文法的源代码序列,进行语法分析,并给出语法是否正确的结论。
(1)总体设计思想
利用自上而下的分析方法;本实验所采用的是LL(1)分析法即预测分析法;每次通过词法分析模块读入一个完整的单词,在语法分析中判断正确性,最终将结果输出。
(2)详细算法设计
语法分析
表达式::=项{+项|-项}
项::=因子{*因子|/因子}
因子::=ID|num|(表达式)
num::=(+|-|ε)数字数字*(.数字数字*|ε)(e(+|-|ε)数字数字*|ε)
ID::=字母(字母|数字)*
字母::=a|b|c…|z|A|B|C…|Z
数字::=0|1|2…|9
用字母替代后写成如下:
E→T{+T|-T}
T→F{*F|/F}
F→i|n|(E)
将该扩充文法还原
E?E+T|E-T|T
T?T*F|T/F|F
F?(E)|i|n
消除非终结符E、T的直接左递归后,文法变为
E?TE’
E’?+TE’|-TE’|ε
T?FT’
T’?*FT’|/FT’|ε
F?(E)|i|n
此文法是LL(1)文法
求出该文法的预测分析表
i
n
+
-
*
/
(
)
$
E
E?TE’
E?TE’
E?TE’
E’(e)
E’?+TE’
E’?TE’
E’?ε
E’?ε
T
T?FT’
T?FT’
T?F’
T’(t)
T’?ε
T’?ε
T’?*FT’
T’?/FT’
T’?ε
T’?ε
F
F?i
F?n
F?(E)
根据预测分析表、分析栈和一个总控程序来判断一个语句是否正确;
(3)流程框图
(4)函数相关说明
charinput[300];//存放输入的字符串
chartoken[20];//存放符合C语言词法规则的单词
charch;//单个字符
charprevious;//ch的前一个字符
charlatter;//ch的后一个字符
charch1,ch2;//当处理注释的时候使用
inttypenum;//表示单词的种别码
intp,m,n,cx;
doubledecimal;//记录小数
doublesum;//存放数字
intindex;//存放指数
intisNum;//是否是数字
intisDecimal;//记录是否为小数
intisExp;//记录是否为指数
intisNegative;//是否带负号(对于指数)
intisNegative1;//是否为负数
charX,a;
charstack[200];
voidscanner();
char*rwtab[11]={main,int,float,double,char,if,else,while,do,end};
//记录预测分析表,0表示没有产生
文档评论(0)