一.前言
又到了一周一度的编译原理实验课,一次实验课上完了,又是大学生必备技能—写实验报告。行了,废话不多说,我直接展现,如何实现编译原理中词法分析的递归下降分析法实例–能被5整除的二进制数的思路。作为信奉“
less is more
”的人来说,说明能简单就简单啦!!大家凑合着看看。
二.实验要求/题目说明
一、授课内容:
(一) 授课科目:编译原理
(二) 授课内容:实验二 递归下降分析程序设计
(三) 授课类型:实 验
二、教学目的要求:
1.目的:通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。
2.要求:
(1) 选择最有代表性的语法分析方法,算符优先法、递归子程序法和状态矩阵法之一进行实验。
(2) 选择对各种常见的程序语言都通用的语法结构,如赋值语句(尤其指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。
三、教学设想:
1.教学方法设想:先以例子讲解,然后学生动手实验,实验为主。
2.教具运用设想:多媒体。
四、教学过程:
题目
编写一个递归下降子程序,实现能被5整除的二进制数的判断。若能整除则输出yes,否则输出no。
试采用具有递归功能的高级语言编制递归下降法的语法分析程序。分析过程不嵌入任何语义动作。
三.理论分析
为了省事,我直接附图。展现DFA和文法。((> <)有点小糊,大家凑合着看吧)
四.用代码实现
功能列表:
(1)输入二进制数,能判断是或否二进制数。是,输出YES; 否,输出NO。
(2)当输入不是0或1或#结束标志位的话,报错,并表明出错位置,由于哪一个字符产生的错误。
(3)#结束程序
效果图:
代码:
#include <stdio.h>
#include<string.h>
int p,tz,i;//tz标志位,1表示YES,O表示NO
char st[80];//字符串
char ch;//每次取的字符
char sym()//取下一个字符
{
return st[p];
}
void error(int n)//报错
{
printf("输入非法字符!!\n",n);
}
void S();
void A();
void B();
void C();
void D();
void S(){
if(ch=='0'){
p++;
ch=sym();
S();
}
else if(ch=='1'){
p++;
ch=sym();
A();
}
else if(ch=='#'){//出口
tz=1;
return ;
}
else{
return ;//直接返回,到时候报错
}
}
void A(){
if(ch=='0'){
p++;
ch=sym();
B();
}
else if(ch=='1'){
p++;
ch=sym();
C();
}
else {//非法字符
return ;
}
}
void B(){
if(ch=='0'){
p++;
ch=sym();
D();
}
else if(ch=='1'){
p++;
ch=sym();
S();
}
else {//非法字符
return ;
}
}
void C(){
if(ch=='0'){
p++;
ch=sym();
A();
}
else if(ch=='1'){
p++;
ch=sym();
B();
}
else {//非法字符
return ;
}
}
void D(){
if(ch=='0'){
p++;
ch=sym();
C();
}
else if(ch=='1'){
p++;
ch=sym();
D();
}
else {//非法字符
return ;
}
}
void main()
{
printf("please input expression(end with #):");
gets(st);
strcat(st,"#");
p=0;
ch=sym();
/* if(ch=='#')
{
printf("finished\n");
//exit();
return ;
}*/
while(ch!='#')//循环,以#结束程序
{
S();
if(ch!='#'||tz==1)
{
if(ch!='#'){
printf("%d号位错误 ,被%c字符引起错误!!,again\n",p+1,ch);
}
else{
printf("YES!!\n");
}
tz=0;
}
else{
printf("NO!!\n");
}
printf("please input expression (end with #):");
fflush(stdin);
gets(st);
strcat(st,"#");
p=0;
ch=sym();
}
printf("finished\n");
}