实验四:语法分析实验
一、 实验目的
编制一个递归下降分析程序。
E→TE'
E'→(+T|-T)E'|ε
T→FT'
T'→(*F|/F)T'|ε
F→(E)|i
二、 实验内容和要求
输入:算术表达式;
判断:每遇到一个终结符,则判断当前读入的单词符号是否与该终结符相匹配,若匹配,则继续读取下一个单词符号,若不匹配,则进行错误处理。
每遇到一个非终结符,则调用相应的分析子程序
三、实验方法、步骤及结果测试
1.源程序名:递归下降分析.c
可执行程序名:递归下降分析.exe
#include<stdio.h>
#include<string.h>
void scaner();
error();
E();
E1();
T();
T1();
F();
char character[80];//存放所有输入的字符
char token[8];//单词自身字符串
char ch;//单个字符
int p,m=0,i,sum=0,syn;//sum:整型常数 row:记录新读入的字符行的行号,syn:单词种别码
char *keywords[6]={"begin","if","then","while","do","end"};
void main(){
p=0;
printf("请输入一串字符串:");
do
{
ch=getchar();
character[i++]=ch;
}while(ch!='#');//输入以#号键结束
p=0;
do
{
scaner();//识别单词
switch(syn)
{
case 11:printf("(%d,%d)\n",syn,sum);break;
case -1: printf("(%s,#)\n",token);break;
default:printf("(%d,%s)\n",syn,token);break;
}
}while(syn!=0);
p=0;
scaner();
E();
if(syn==0)
printf("success!\n");
else
printf("failure!\n");
}
//词法分析程序
void scaner()
{
for(i=0;i<8;i++)
token[i]=NULL;
ch=character[p++];
while(ch==' ')
{
ch=character[p];
p++;
}
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//标识符或者变量名
{
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
token[m++]=ch;
ch=character[p++];
}
token[m++]='\0';
p--;
syn=10;
for(i=0;i<6;i++) //将识别出来的字符和已定义的标示符作比较,
if(strcmp(token,keywords[i])==0)
{
syn=i+1;
break;
}
}
else if((ch>='0'&&ch<='9'))//数字
{
sum=0;
while((ch>='0'&&ch<='9'))
{
sum=sum*10+(ch-'0');
ch=character[p++];
}
syn=11;
p--;
}
else switch(ch)//其他字符
{
case'<':m=0;token[m++]=ch;
ch=character[p++];
if(ch=='=')
{
syn=21;
token[m++]=ch;
}
else if(ch=='>')
{
syn=22;
token[m++]=ch;
}
else
{
syn=23;
p--;
}
break;
case'>':m=0;token[m++]=ch;
ch=character[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=20;
p--;
}
break;
case':':m=0;token[m++]=ch;
ch=character[p++];
if(ch=='=')
{
syn=18;
token[m++]=ch;
}
else
{
syn=17;
p--;
}
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;
}
}
error()
{
printf("(%d,%s)failure! \n",syn, token);
}
E()
{
T();
E1();
}
E1()
{
if(syn==13||syn==14)
{
scaner();
T();
E1();
}
}
T()
{
F();
T1();
}
T1()
{
if(syn==15||syn==16)
{
scaner();
F();
T1();
}else if(syn!=28 && syn!=0 && syn!=13 && syn!=14)
error();
}
F()
{
if(syn==27)
{
scaner();
E();
if(syn==28)
scaner();
else error();
}
else if(syn==10||syn==11)
scaner();
}