洛阳理工学院计算机与信息工程系
实验报告日期:2011年5月10日
学号
课程
实验名称B08050423班级编译原理语法分析器B080504姓名实验陈志福
一实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
二实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
待分析的简单语言的语法:
用扩充的BNF表示如下:
<程序>::=begin<语言串>end
<语言串>::=<语句>{;<语句>}
<语句>::=<赋值语句>
<赋值语句>::=ID:=<表达式>
<表达式>::=<项>{+<项>|-<项>}
<项>::=<因子>{*<因子>|/<因子>}
<因子>::=ID|NUM|(<表达式>)
实验要求说明:
输入单词串,以”#”结束,如果是正确的文法句子,则输出成功信息,打印“success”,否则输出“error”。
三实验内容
代码如下:
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#defineMAX150//词法分析表的最大容量
#defineMAXBUF255//缓冲区的最大缓冲量
voidterm();
voidlrparser();
voidstatement();
voidyucu();
voidexpression();
voidfactor();
charprog[MAXBUF],token[MAX];
charch;
intsyn,p,m,n,sum,kk;
char*rwtab[6]={"begin","if","then","while","do","end"};
voidscaner()
{
for(m=0;m<MAX;m++)
token[m]=NULL;
m=0;sum=0;
ch=prog[p++];
while(ch=='')
ch=prog[p++];//读取下一个字符;
if(ch>=65&&ch<=122/*是字母字符*/)
{
while(ch>=65&&ch<=122||ch>=48&&ch<=57)/*为字母字符或数字字
符*/
{
token[m++]=ch;
ch=prog[p++];//读取下一个字符;
}
token[m++]='\0';
p=p-1;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;//给出syn值;
break;
}
}
elseif(ch>=48&&ch<=57/*ch为数字字符*/)
{
while(ch>=48&&ch<=57/*ch为数字字符*/)
{
sum=sum*10+ch-'0';
ch=prog[p++];//读取下一个字符;
}
p=p-1;//回退一个字符;
syn=11;
}
elseswitch(ch)
{
case'<':m=0;token[m++]=ch;
ch=prog[p++];//读取下一个字符;
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
elseif(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=20;
p=p-1;//回退一个字符;
}
break;
case'>':token[m++]=ch;;
ch=prog[p++];//读取下一个字符;
if(ch=='=')
{
syn=24;//将>=的中别码=>syn;
token[m++]=ch;;
}
else
{
syn=23;
p=p-1;//回退一个字符;
}
break;
case':':token[m++]=ch;;
ch=prog[p++];//读取下一个字符;
if(ch=='=')
{
syn=18;
token[m++]=ch;;
}
else
{
syn=17;
p=p-1;//回退一个字符;
}
break;
case'+':syn=13;token[0]=ch;
break;
case'-':syn=14;token[0]=ch;
break;
case'*':syn=15;token[0]=ch;
break;
case'/':syn=16;token[0]=ch;
break;
case'=':syn=25;token[0]=ch;
break;
case';':syn=26;token[0]=ch;
break;
case'(':syn=27;token[0]=ch;
break;
case')':syn=28;token[0]=ch;
break;
case'#':syn=0;token[0]=ch;
break;
default:syn=-1;
break;
}
}
voidstatement()
{
if(syn==10)
{
scaner();//读下一个单词符号;
if(syn==18)
{
scaner();//读下一个单词符号;
expression();//调用expression函数;
}
else
{
cout<<"赋值符号错误!"<<endl;
kk=1;
}
}
else
{
cout<<"语句错误!"<<endl;
kk=1;
}
return;
}
voidyucu()
{
statement();//调用statement();
while(syn==26)
{
scaner();//读下一个单词符号;
statement();//调用statement()函数;
}
return;
}
voidexpression()
{
term();//调用term函数;
while(syn==13||syn==14)
{scaner();//读下一个单词符号;
term();//调用term函数}
return;
}
voidterm()
{
factor();//调用factor函数;
while(syn==15||syn==16)
{
scaner();//读下一个单词符号;
factor();//调用factor函数;
}
return;
}
voidfactor()
{
if(syn==10||syn==11)
scaner();//读下一个单词符号;
elseif(syn==27)
{
scaner();//读下一个单词符号;
expression();//调用expression()函数;
if(syn==28)
scaner();//读下一个单词符号;
else
{
cout<<"输出')'错误"<<endl;
kk=1;
}
}
else
{
cout<<"输出表达示错误"<<endl;
kk=1;
}
return;
}
voidlrparser()
{
scaner();//读下一个单词符号;
if(syn==1)
{
scaner();//读下一个单词符号;
yucu();//调用yucu函数;
if(syn==6)
{
scaner();//读下一个单词符号;
if(syn==0&&(kk==0))
cout<<"Success"<<endl;
}
else
{
if(kk!=1)
cout<<"缺end'错误!"<<endl;
kk=1;
}
}
else
{