- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验二:递归下降分析法
一、实验目的:
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。
二、实验要求:
1、程序输入/输出示例:
对下列文法,用递归下降分析法对任意输入的符号串进行分析:
(1)E-TG
(2)G-+TG|—TG
(3)G-ε
(4)T-FS
(5)S-*FS|/FS
(6)S-ε
(7)F-(E)
(8)F-i
2、输出的格式如下:
(1)递归下降分析程序,编制人:姓名,学号,班级
(2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#
(3)输出结果:i+i*i#为合法符号串
备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。
注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#;
2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);
3.对学有余力的同学,可以详细的输出推导的过程。
3、与读文件有关的函数:
FILE *fp;
????? if((fp=fopen(E:\\222.txt,r))==NULL)
{?? //读取文件内容,并返回文件指针,该指针指向文件的第一个字符
?fprintf(stderr,error opening.\n);
?????????? exit(1);
????? }
fgetc(fp) 从数据流中区下一个字符fopen? 文件打开函数,返回指向文件第一个字符的指针1、递归下降分析法的功能
词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。
2、递归下降分析法的前提
改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法,
3、递归下降分析法实验设计思想及算法
为G 的每个非终结符号U 构造一个递归过程,不妨命名为U。
U的产生式的右边指出这个过程的代码结构:
1) 若是终结符号,则和向前看符号对照,若匹配则向前进一个符号;否则出错。
2) 若是非终结符号,则调用与此非终结符对应的过程。当A 的右部有多个产生式时,可用选择结构实现,具体为:
对于每个非终结符号U-u1|u2|…|un 处理的方法如下:
U( ){
ch=当前符号;
if(ch 可能是u1 字的开头) 处理u1 的程序部分;
else if(ch 可能是u2 字的开头)处理u2 的程序部分;
………………
else error();
}
对于每个右部u1-x1x2…xn 的处理架构如下:
处理x1 的程序;
处理x2 的程序;
…
处理xn 的程序;
如果右部为空,则不处理。
对于右部中的每个符号xi
①如果xi 为终结符号:
if(xi= = 当前的符号){
NextChar();
return;
}else{出错处理}
②如果xi 为非终结符号,直接调用相应的过程xi()
说明: NextChar 为前进一个字符函数。
四、函数说明:
1、 非终结符函数E()
函数功能描述:根据以上文法要求E-TG,所以从主函数开始调入第一个非终结符函数
执行,显示调用产生式,依次嵌套调用非终结符函数T()和G(),进行递归向下分析。
void E(){
printf(E---TG..............%c\n,ch);
T();
G();}
2、 非终结符函数T()
函数功能描述:根据以上文法要求T-FS,首先显示算式匹配所用的显示调用的产生式,
依次嵌套调用非终结符函数F()和S(),进行递归向下分析。
void T(){
printf(T---FS..............%c\n,ch);
F();
S();}
3、 非终结符函数G()
函数功能描述:根据以上文法要求G-+TG|—TG ,G-ε,如果当前字符变量ch 为“+”,则显示调用产生式,首先嵌套调用test()函数判断是算式递归向下分析是否结束,若没有结束则继续依次嵌套调用非终结符函数T()和G();如果当前字符变量ch 为“-”,则显示调用产生式,从文件文档中读取下一个字符,让字符指针变量指向下一个字符,继续依次嵌套调用非终结符函数T()和G();如果当前字符变量ch 既不为“+” 也不为“-”,非终结符G 指向为空,函数只用于显示指向为空,找不到可以和文件中字符匹配的非终结符。
void G(){ if (ch==+){ printf(G---+TG..............%c\n,ch);
*p=ch;
p++;
ch=fgetc(fp);
T();
G(); }
else if(ch==-)
{ printf(G----TG..............%c\n,ch);
*p=ch;
p++;
ch=fgetc(fp);
T();
G();
文档评论(0)