⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 语法分析.cpp

📁 用VC++编制的一个递归下降分析程序
💻 CPP
字号:
# include <string.h>    //引用字符串库函数
# include "iostream.h" //引用I/O所用的的某些库函数
char prog[80],token[80];   //prog[80]为源程序字符串,
                           //token[8]为存放的单词自身字符串
char ch;                   //ch为当前扫描到的字符
int syn,p,m,n,sum,kk;      //syn用来存放单词符号的种别码
                           //p是缓冲区prog[80]的指针
                           //m是token[8]的指针
                           //n是初始化token[8]的for循环变量
                           //sum用来存放整型单词
                           //kk是出错判定标志

char * rwtab[6]={"begin","if","then","while","do","end"};
                 //rwtab[6]为关键字数组
int fl(char x);   //判断是否字母
int fld(char x);  //判断是否字母或数字
void scaner();    //单词扫描函数,返回一个单词的syn
void lrparser();  //递归下降分析函数
void yucu();        //语句串分析函数
void statement();   //语句分析函数
void expression();  //表达式分析函数
void term();        //项分析函数
void factor();      //因子分析函数
void main()
{ 
	char s[80];  int i,k;
    cout<<"                             语法分析器"<<endl<<endl;
    k=1;            //用于循还标识
    while(k==1)
	{
		p=0;
        i=0;
	    kk=0;
        for(n=0;n<80;n++)
			s[n]=NULL;
	    for(n=0;n<80;n++)
			prog[n]=NULL;
	    cout<<"请输入源程序字符串:";
        cin.getline(s,80);
        do
		{
			prog[p++]=s[i];
            ch=s[i];
            i++;
		}while(ch!='#'&& ch!='\0');
        p=0;
        scaner();
        lrparser();
	    cout<<endl<<endl;
    	cout<<"继续进行语法分析请按按'1'"<<endl;
	    cout<<"如需退出程序请按其它键";
	    cin>>k;
	    cin.get();
	    cout<<"*******************************************";
	    cout<<endl<<endl;
	}
}

void scaner()
{  
	int j=0; char t[80]; sum=0;m=0;
    for(n=0;n<8;n++)token[n]=NULL;
    t[j]= prog[p];                
    ch= prog[p];
    p++;
    while(ch==' ')                 //读入下一个字符
	{ 
		j++;
	    t[j]=prog[p] ;
        ch= prog[p];
        p++;
    }
    if(fl(t[j]))                  //字符为字母读入下一个字符
    {  
		token[m++]=t[j];
	    j++;
	    t[j]=prog[p];
	    p++;
        while(fld(t[j]))          //字符为字母或数字读入下一个字符
		{   
			token[m++]=t[j];
            j++;
		    t[j]=prog[p];
	        p++;
        }
	    p--;                    //回退一个字符
        token[m++]='\0';          // 数组结束标志
        m--;
        syn=10;
	    //若token为关键字,给出种别码
        if(strcmp(token,rwtab[0])==0)
            syn=1; 
        if(strcmp(token,rwtab[1])==0)
            syn=2; 
        if(strcmp(token,rwtab[2])==0)
            syn=3; 
        if(strcmp(token,rwtab[3])==0)
            syn=4; 
        if(strcmp(token,rwtab[4])==0)
            syn=5; 
        if(strcmp(token,rwtab[5])==0)
            syn=6;  
	}
    else if(t[j]>=48 && t[j] <=57)   //如果字符为数字
    { 
		while(t[j]>=48 && t[j] <=57)
        { 
			sum=sum*10+t[j]-'0';     //转换为十进制数
		    j++;
	        t[j]=prog[p];
	        p++;
        }
		p--;                         //回退一个字符
        syn=11;
	}
    else 
       switch(t[j])
       {
           case'<' : m=0;token[m++]=t[j];
                    j++;
					t[j]=prog[p];
	                p++;
                    if(t[j]=='>')
                    {
                    syn=21;
                    token[m]=t[j];
                    }
                    else if(t[j]=='=')
                    {  syn=22;
                       token[m]=t[j];
                    }
                    else
                    { syn=20; p--;}
                    break;
           case'>' : m=0; token[m++]=t[j];
                      j++;
					  t[j]=prog[p];
	                  p++;
                      if(t[j]=='=')
                       {  syn=24;
                          token[m]=t[j];
                       } 
                       else
                       {  syn=23; p--;}
                        break;
            case ':' : m=0; token[m++]=t[j];
                        j++;
						t[j]=prog[p];
	                    p++;
                       if(t[j]=='=')
                         {  syn=18;
                            token[m]=t[j];
                          }
                         else
                         { syn=17; p--;}
                         break;
             case'+': syn=13;token[0]=t[j];break;  
             case'-': syn=14;token[0]=t[j];break;    
             case'*': syn=15;token[0]=t[j];break; 
             case'/': syn=16;token[0]=t[j];break; 
			 case'=': syn=25;token[0]=t[j];break;
             case';': syn=26;token[0]=t[j];break;
             case'(': syn=27;token[0]=t[j];break;
             case')': syn=28;token[0]=t[j];break;
             case'#': syn=0;token[0]=t[j];break; 
             default: syn=-1;             //否则令种别码为-1
	}
}

void lrparser()   //递归下降分析函数
{   
	if(syn==1)
    {  
		scaner(); //读入下一个单词
        yucu();
        if(syn==6)
          {   
			  scaner();
              if(syn==0 && (kk==0))
              cout<<"语法正确";
              if(syn==-1)
			  {
				   cout<<"缺'#'错误"; kk=1;
			  }

           }
		else if (syn==10)
		{
			cout<<"缺分号错误";kk=1;
		}
         else 
        {
			 if(kk!=1)  cout<<"缺end错误"; kk=1;
		 }
	}
    else{  cout<<"缺begin错误";  kk=1;}
    return;
}

void yucu()  //语句串分析函数
{  
	statement();
    while(syn==26) //是否为';'
	{  
		scaner();
        statement();
    }
	return;
}
void statement()
{   
	if(syn==10) //是否为标识符
    {  
		scaner();
        if(syn==18)
        {    
			scaner();
            expression();
        }
        else{  cout<<"赋值号错误"; kk=1;}
    }
   else if(syn==6)
    {
		cout<<"end前面多了分号";kk=1;
	}
   else{  cout<<"语句错误"; kk=1;}
   return;
}

void expression()
{  
	term();
    while(syn==13||syn==14) //字符是否为+或-
      {
         scaner();
         term();
      }
   return;
}
void term()
{   
	factor();
     while(syn==15||syn==16) //字符是否为*或/
     {
        scaner();
        factor();
     }
    return;
}

void factor()
{  
	if(syn==10||syn==11) //是否为标识符或整常数
       scaner();
    else if(syn==27)    //是否为'('
    {
		scaner();
        expression();
        if(syn==28)  //是否为')'
            scaner();
       else{  cout<<"缺少)错误" ;kk=1;}
    }
    else {  cout<<"表达式错误" ;  kk=1;}
    return;
}

int fl(char x)
{
	if(x>=65 && x<=90 ) return 1; 
	else if(x>=97 && x<=122) return 1;
	else return NULL;
}      
int fld(char x)
{
	if(x>=65 && x<=90 ) return 1; 
	else if(x>=97 && x<=122) return 1;
	else if(x>=48 && x<=57) return 1;
	else return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -