- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
语法分析器文档
测试过程:(实验中出现的问题、错误、解决方法)
实验总结:
通过这次实验,了解语法分析是如何根据语法规则逐一分析词法分析时得到的属性字,检查语法错误。掌握语法分析过程,加深对语法分析的理解。
签名:
年 月 日 评语与成绩:
教师签名:
年 月 日 洛阳师范学院信息技术学院
软件实验报告
实验名称 语法分析实验 实验类型 验证型 实验时间 实验环境 Windows Xp,vc++ 实验目的与要求:1.了解语法分析是如何根据语法规则逐一分析词法分析时得到的属性字,检查语法错误。
2.掌握语法分析过程,加深对语法分析的理解。 实验内容:
语法分析程序一般具有如下功能: 对单词符号串进行语法分析(根据语义规则进行推导和规约),识别出程序中的各类语法单位,最终判断输入串是否构成语法上正确的“程序”。
这里我们采用递归下降分析方法:直接以程序的方式模拟产生式产生语言的过程。它的基本设计思想是:为每一个非终结符构造一个子程序,每一个子程序的过程体中按该产生式的候选项分情况展开,遇到终结符直接匹配,而遇到非终结符就调用相应非终结符的子程序。该分析从调用文法开始符号的子程序开始,直到所有非终结符都展开为终结符并得到匹配为止。若分析过程中达到这一步则表明分析成功,否则表明输入中有语法错误。递归下降分析对文法的限制是不能有公共左因子和左递归。由于文法是递归定义的,因此子程序也是递归的。
对于规模比较小的语言,递归下降子程序方法是很有效的方法,它简单灵活,容易构造,其缺点是程序与文法直接相关,对文法的任何改变均需对程序进行相应的修改。
这里给出词法分析程序大概的设计方法:
??? ???????? 1、根据要求写出语法分析的上下文无关文法G;
??? ???????? 2、消除上下文无关文法G的二义性;
??? ???????? 3、消除上下文无关文法G的(直接)左递归,并提取左因子;
??? ???????? 4、构造文法的状态转换图并且简化;
5、将转换图转化为EBNF表示;
6、从EBNF构造递归下降子程序;
实验步骤:(算法描述、源程序、操作步骤和方法)
①总体结构与模块划分
语法分析器模块(parser.h parser.cpp)
绘图语言解释器入口
递归子程序集
先序遍历并打印表达式的语法树
出错处理模块
词法分析器模块(scanner.h scanner.cpp)
?
初使化词法分析器
识别出具有独立意义的最小语法单位
辅助性模块
②重要数据结构
·语法树节点类型
struct ExprNode {????? ????? ???????????????????????????????????// 语法树节点类型
???? enum Token_Type OpCode;
???? union {
???????? struct {
????????????? ExprNode *Left, *Right;
???????? } CaseOperator;
???????? struct {
????????????? ExprNode *Child;
????????????? FuncPtr MathFuncPtr;
???????? } CaseFunc;
???????? double CaseConst;
???????? double *CaseParmPtr;
} Content;
};
③关键思想与算法
·改写二义文法为非二义文法的方法:通过引入新的非终结符,使原来分辨不清的结构受到约束,从而使得对任何一个句子,仅能构造一棵分析树。
·消除直接左递归算法
输入:文法G中所有的A产生成
输出:等价的不含直接左递归的文法G’
方法:首先,整理A产生式为如下形式:
?????? A?Aa1|Aa2|…|Aam|p1|p2|…|pn
??????????? 其中,ai非空,pj均不以A开始,然后用下述产生式代替A产生式:
????? ??A?p1A’| p2A’|…|pnA’
?????? A’? a1A’| a2A’|…|amA’|?
·消除左递归算法
输入:无回路文法G
输出:无左递归的等价文法G’
方法:将非终结符合理排序:A1,A2,…,An,然后运用下述过程:
for i in 2..n
loop for j in 1..i-1
loop 用Aj?Q1|Q2|…|Qk的右部替换每个形如Ai?Aj产生式中的Aj,得到新产生式:
???? Ai?Q1r|Q2r|…|Qkr;
???? 消除Ai产生式中的直接左递归;
end loop;
end loop;
·提取文法左因子算法:
输入:文法G
输出:等价的无左因子文法G’
方法:为每个产生
原创力文档


文档评论(0)