一、实验目的:根据某语法编写调试递归下降分析程序,分析任意输入的符号串。 这次实验的目的主要是加深对递归下降分析法的理解。
二、实验预习提示1、递归下降分析法功能
词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的结构过程。
2、递归下降分析法前提
改造语法:去除二义性,去除左递归,提取左因子,判断是否为ll(1)语法,
3、递归下降分析法的实验设计思想与算法
也可以为g的末尾以外的每个符号u构建递归过程,并命名为u。
的生成表达式的右侧显示了此过程的代码结构。
(1)终端符号时,对照向前符号,
如果一致,则前进到前一个符号; 否则会出错。
(2)如果是非终结符,调用与该非终结符对应的程序。 当a的右部分有多个生成式时,可以通过选择结构来实现。
具体而言:
(1)按终端符号UX1| X2|…| Xn处理的方法如下。
u () ) )
{
读取(ch ); //当前符号
ifchinfirst(X1 )调用x1子程序;
elseifchinfirst(X2 )调用x2子程序;
.
else error () )
}
)2)右部X1Y1 Y 2…Y n的处理体系结构如下。
调用Y1的子程序
调用Y 2子程序;
.
调用Y n的子程序
)3)右部空时,不处理。
)4)关于右部的各符号Yi
yi为终端符号时:
if(yi==当前符号() ) ) ) ) ) )。
{
读取(ch ); //
返回;
}
else error () )
Yi为非终结符号时,直接调用相应的子过程yi ()
三、实验过程和指导:(一)准备:
1 .阅读教科书的相关章节,
2 .仔细考虑设计方案
3 .设计模块结构、测试数据,初步编制程序。
(二)程序要求:
程序的输入输出示例:
针对以下语法,使用递归下降分析法分析任意输入的符号串。
(1) e至TG
)2) G TG|-TG
(3) G
)4) TFS
(5) S*FS|/FS
(6)从s到
(7) f(e ) )。
(8) f至I
的形式如下。
)1)递归下降分析程序,作者:姓名、学号、班级
输入以(2)结尾的符号串((/)包括i# )在此位置输入符号串) I )
(3)输出结果) i i*i#是合法的符号串
备注:输入i i*#等符号串时,必须作为“错误的符号串”输出。
注意:1.在表达式中,运算符(-*/)、分隔符)、字符I和终止符);
2 .在遇到错误的表达式的情况下,输出错误消息(该信息越详细越好);
3 .有学习能力的学生可以详细列举推导过程,即每一步使用的生成公式。
(三)程序思路(仅供参考) :
0 .定义部分:定义常量、变量、数据结构。
1 .初始化:从文件向字符缓冲区输入输入符号串。
2 .采用递归下降分析法,为每个非终结符号创建函数,在主函数中调用语法起始符号的函数。
(四)练习本实验的目的和思路:
程序开始复杂,需要用到编程语言的知识和大量的编程技巧,递归下降分析法是一种实用的分析法,通过这个练习可以大大提高软件开发能力。 通过练习,掌握函数之间的相互调用方法。
)二)为了设计好程序,应注意:
1 .模块化设计:将程序分为多个合理的模块(函数),每个模块具体做相同的事情。
2 .编写(绘制)设计方案的模块关系示意图、流程图、全局变量、函数接口等。
3 .注意编程风格:空行的使用、注释的使用、缩进的使用等。
四.实验过程的实验代码
# include stdio.h # include stdlib.h # include string.h # define len 255 bool flag=true; char src[LEN]; int i; void E (; void T (; void G (; void F (; void S (; int main () { printf ) )作者:任性小笼包,20161209719,计科1601(n ) ); 请输入printf (以'字符串'结尾) : ) ); scanf('%s ',src ); i=0; e (); if(src[I]=='#'flag==true ) ) { printf ) (语句法); (else ) printf ) )不合法); }返回0; }void E () ) printf ) ' e=TG ); t (); g (; }void T () printf ) ) t=fs ); f (; s (; }void G () if ) src[I]==' ' ) I; 打印机(g-TG ); t (); g (; }elseif(src[I]=='-' ) printf ) ' g--TG ' ); I; t (); g (; } }void F () if ) src[I]==' ) ) I; e (); if(src[I]==') ' ) I; printf(f-(e ) ); } else flag=false; }elseif(src[I]=='I ' ) printf(f-I ' ); I; } else flag=false; }void S () if ) src[I]=='* ' ) I; f (; s (; }elseif(src[I]=='/' ) I; f (; s (; }注:文件的后缀为. cpp
五.实验结果