手动语法分析器
一、实验目的
设计、编制和调试一个典型的语法分析方法,进一步掌握常用的语法分析方法。
二、实验环境
装有Windows操作系统;
装有Microsoft Visual C++6.0
三、实验原理
语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在
结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC等工具自动生成。完成语法分析任务的程序称为语法分析器,或语法分析程序。按照源语言的语法规则,从词法分析的结果中识别出相应的语法范畴,同时进行语法检查。
语法分析器的功能是按照源语言的语法规则,从词法分析的结果中识别出相应的语法范畴,同时进行语法检查。
给定文法G和字符串( ∈VT*),检查、判定 ∈L(G)?即检查、判定是否是文法G所能产生的合法的句子,同时报告和处理语法错误。
语法分析方法有自上而下语法分析方法(本实验使用该方法)
自上而下语法分析方法,即给定文法G和源程序串r。从G的开始符号S出发,通过反复使用产生式对句型中的非终结符进行替换(推导),逐步推导出r 。
该方法是一种产生的方法,是一种面向目标的方法。
分析的主旨是选择产生式的合适的侯选式进行推导,逐步使推导结果与src匹配.
四、实验步骤及内容
分析:算法思想,主程序如下流程图所示
在主程序中输入一个等待处理的字符串,调用E()对数组src里面的元素进行分析,改实验的核心思想是循环的调用函数,直到分析出#时才结束分析。
在函数体E()中又接着调用其他的函数,不同的函数分析不同的符号和字母,做不同的功能,降低了耦合度,使得后期维护起来方便快捷。下面不同函数体的流程图如下
①、对函数E()语法分析流程图如下:
②、对函数T()语法分析流程图如下:
T()函数主要是输出T->FS,然后再调用F()和S()对下面的信息进行分析
③、对函数F()语法分析流程图如下:
判断src内容调用不同的函数对信息进行分析,并对标志位进行修改
④、对函数G()语法分析流程图如下:
类似F()函数的功能,同样还是对src数组内容进行分析,根据不同的信息做不同的处理,然后再调用其他函数继续分析
⑤、对函数S()语法分析流程图如下:
S()函数判断src中是否是*或者/,对相应不匹配到的字符做出相应的输出处理,比喻遇到+则输出G->+TG,输出完成后再调用F()和S()函数过程,对后面信息进行分析
对程序大致有了一个分析,让整个程序有了大体的框,最后就是实施部分了,后面将展示此次实验的代码,用C语言编写的一个简单的语法分析程序。
在代码之前先定义一个数组,和标志位,数组大小为255,,标志位初始为1;
2、本实验的主要相关代码如下:
主函数:
int main( ) {
printf("请输入字符串(以#结束):");
scanf("%s",&src);
i=0;
E();
if(src[i]=='#'&&flag==1){
printf("语句合法\n");
}else
{
printf("不合法");
}
return 0;
}
被调函数T():
void T(){
printf("T->FS");
F();
S();
}
被调函数E():
void E(){
printf("E->TG");
T();
G();
}
被调函数G():
void G(){
if(src[i]=='+'){
i++;
printf("G->+TG");
T();
G();
}else if(src[i]=='-'){
i++;
printf("G->-TG");
T();
G();
}
}
被调函数F():
void F(){
if(src[i]=='('){
i++;
E();
if(src[i]==')'){
i++;
printf("F->(E)");}
else flag=0;
}else if(src[i]=='i'){
printf("F->i");
i++;
}
else flag=0;
}
被调函数S():
void S(){
if(src[i]=='*'){
i++;
F();
S();
}else if(src[i]=='/'){
i++;
F();
S();
}
}
五、数据及结果分析
1.在程序中输入(i+i*i)#进行测试
经过分析得到程序输出了正确的结果,是我们需要的答案
2.当我们输入回车或者空格时,程序会一直等待我们输入如下:
光标一直闪烁,直到我们输入数据或者超过255个才会结束。
3.当我们输入不合法字符!时,会输出如下内容:
观察到输出的内容中有不合法,!不是一个合法的字符。
六、实验心得
该词法分析器功能虽然没有很完美,但是在不断努力的情况下也得到了一个简单的分析器,是一件很有成就感的事情,可以完成预定的简单要求。此次实验让我们了解了如何设计、编制并调试词法分析程序,并加深了我们对语法分析器原理的理解,为下面的一个实验词法语法综合分析提供了一个好的开始,此次实验让我们了解了直接构造词法分析器的方法和相关原理,并学会使用c语言直接编写词法分析器:同时更熟练的掌握用c语言编写程序。
通过这次实验,让我们把理论知识应用于实验中。也让我们重新熟悉了C语言的相关内容,加深了对C语言知识的深化和用途的理解。让我们在以前学的C语言课程得到饿了一个复习,温故知新是高效的学习。
通过这次语义分析的实验,让我们对高级语言的学习有了更深的认识,了解得更透彻。同时我了解了高级语言转化为目标代码或汇编指令的过程。加深了对编译原理的理解,掌握了编译程序的实现方法和技术。巩固了前面所学的知识。