递归下降分析-实验报告
实验四:语法分析实验
一、 实验目的
编制一个递归下降分析程序。
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();
}

 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号