- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理 语法分析 实验报告
编译原理lowbar;语法分析lowbar;实验报告
《编译原理及实践》结课大作业
学生姓名 艾力娜·托里干
所属学院 信息工程学院
专 业 计算机科学与技术
一.LL(1)预测语法分析器
简单的算术表达式的LL(1)语法分析器
Microsoft Visual C++ 6.0,使用C/C++语言实现代码编程。
需求分析与概要设计:
编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。编译程序的语法规则可用上下文无关文法来刻画。
语法分析的方法分为两种:自上而下分析法和自下而上分析法。自上而下就是从文法的开始符号出发,向下推导,推出句子。而自下而上分析法采用的是移进归约法,基本思想是:用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分归约成该产生式的左邻符号。
详细的算法描述:
(1) 自顶向下带递归语法分析 (这个方法用的是老师给的文法)
1、首先对所以的生成式消除左递归、提取公共左因子
2、在源程序里建立一个字符串数组,将所有的生成式都存在这个数组中。
3、给每个非终结符写一个带递归的匹配函数,其中起始符的函数写在main函数里。这些函数对生成式右边从左向右扫描,若是终结符直接进行匹配,匹配失败,则调用出错函数。如果是非终结符则调用相应的非终结符函数。
4、对输入的符号串进行扫描,从起始符的生成式开始。如果匹配成功某个非终结符生成式右边的首个终结符,则将这个生成式输出。匹配过程中,应该出现的非终结符没有出现,则出错处理。
? 产生式 P :
E - E+T T - T/F
E - E-T T - F
E - T F - (E)
T - T*F F - i
提取左因子并消除左递归得
产生式 P :
(0) E→Te
(1) e→+Te
(2) e→-Te
(3) e→ε
(4) T→Ft
(5) t→*Ft
(6) t→/Ft
(7) t→ε
(8)F→(E)
(9) F→i /*表示id */
? 开始符号S: E
? 终结符集Vt: { E, e, T, t, F }
? 非终结符集Vn: { +, -, *, /, (, ), i }
[构造预测分析表]
? FIRST集:
first(E)= first(T)= first(F)={ ﹝, i }
first(e)={+, -, ε}
first(t)={*, /, ε}
? FOLLOW集:
follow(E)={$, ﹞}
follow(e)=follow(E)={$, }}
follow(T)={fitsr(e)- ε}+follow(e)={+, _ , ﹞, $}
follow(t)=follow(T)+follow(t)={+, _ , ﹞, $}
follow(F)={follow(t)- ε}+follow(T)+follow(t)={*, /, +, _ ,﹞, $}
[预测分析器模型]
图1-1非递归的预测语法分析器模型
#include
#include
#include
#define Vtn 8
#define Vnn 5
#define Pn 10
#define Pmaxlen 20
#define MaxStLength 50
#define MaxStackDepth 50
char Vn[Vnn]={E,e,T,t,F};
char Vt[Vtn]={i,+,-,*,/,(,),$};
char Pstr[Pn][Pmaxlen]={
E-Te,
e-+Te,
e--Te,
e-ε,
T-Ft,
t-*Ft,
t-/Ft,
t-ε,
F-(E),
int Prlen[Pn]={2,3,3,1,2,3,3,1,3,1};
int Pint[Pn][3]={
{102,101},
{
文档评论(0)