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

📄 语法分析.cpp

📁 采用递归下降语法分析方法进行语法分析
💻 CPP
字号:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include <iostream>
int row=1,col=0,num=0,numtest=0,done=1;
char token[20];
struct store
{
    int idnum;
    int rownum;
    int colnum;
    char idy[10];
};
struct table
{
		int id;
		char code[10];
};
struct store tablet[300];
struct table key[31] = {{1,"if"}};
int reserve(char* p)
{		int i=0;
        if(strcmp(p,key[i].code)==0)
				return(key[i].id);
        else
		   return(-1);
}
void scanner()
{
	char ch,p[100];
	int i=0,tn=0;
    printf("请输入程序片段:\n");
    gets(p); 
    //scanf("%[^#]",p);
    while((ch=p[tn])!='#')
    {
	//col++;
	if(isalpha(ch))//为字母时 
	{
		token[0]=ch;
		i=1;
		tn=tn+1;
		ch=p[tn];
		//col++;
		while(isalpha(ch)||isalnum(ch))
		{
			token[i]=ch;
			i++;
			tn=tn+1;
		    ch=p[tn];
			
		}
		//col++;
		//tn=tn-1;
		//col--;
		token[i]='\0';
		int c=reserve(token);
		if(c!=-1)
		{
		      //output(c,row,col,token);
		      
		      tablet[num].idnum=1;
		      tablet[num].rownum=row;
		      tablet[num].colnum=col;
		      int j=0;
		      while(token[j]!='\0')
		      {    
		      tablet[num].idy[j]=token[j];
		      j++;
		      }
              tablet[num].idy[j]='\0';    
		      //output1(token);
		      num++;
		  }    
		else
		{
		      //output(10,row,col,token);//变量 
		      //output1(token);
		      col++;
		      tablet[num].idnum=10;
		      tablet[num].rownum=row;
		      tablet[num].colnum=col;
		      int j=0;
		      while(token[j]!='\0')
		      {    
		      tablet[num].idy[j]=token[j];
		      j++;
		      }
              tablet[num].idy[j]='\0';
              num++;
          }
          //tn=tn+1;    
	}
	else if(isdigit(ch)) //为数字时 
	     {
		token[0]=ch;
		tn=tn+1;
		ch=p[tn];
		//col++;
		i=1;
		while(isdigit(ch))
		{
			token[i]=ch;
			i++;
			tn=tn+1;
		    ch=p[tn];
			
		}
		token[i]='\0';
		//fseek(fp,-1,1);
		//tn=tn-1;
		//output(11,row,col,token);//数字 
		col++;
        tablet[num].idnum=11;
        tablet[num].rownum=row;
        tablet[num].colnum=col;
        int j=0;
        while(token[j]!='\0')
        {
            tablet[num].idy[j]=token[j];
            j++;
        }
        tablet[num].idy[j]='\0';
        num++;
		//output1(token);
  }
  else
		switch(ch)
		{
			case'=':tn=tn+1;
		        ch=p[tn];
			    //col++;
				if(ch=='=')
				{
					//output(39,row,col,"==");
					col++;
					tablet[num].idnum=40;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]='=';
		            tablet[num].idy[1]='=';
		            num++;
		            tn=tn+1;
		        }    
					//output1("==");
				else
				{
				//fseek(fp,-1,1);//回指针 
				//tn=tn-1;
				//output(21,row,col,"=");
				col++;
				tablet[num].idnum=21;
                tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]='=';
		            num++;
				//output1("=");
				}
				break;
			case'+'://output(22,row,col,"+");
                    //output1("+");
                    col++;
                    tablet[num].idnum=22;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]='+';
		            num++;
		            tn=tn+1;
                    break;
			case'-'://output(23,row,col,"-");
                    //output1("-");
                    col++;
                    tn=tn+1;
                    tablet[num].idnum=23;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]='-';
		            num++;
                    break;
			case'*'://output(24,row,col,"*");
			        col++;
			        tn=tn+1;
			        tablet[num].idnum=24;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]='*';
		            num++;
                    //output1("*");
                    break;
			case'/'://output(25,row,col,"/");
			        col++;
			        tn=tn+1;
                    tablet[num].idnum=25;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]='/';
		            num++;
                    //output1("/");
                    break;
			case'('://output(26,row,col,"(");
                    //output1("(");
                    col++;
                    tn=tn+1;
                    tablet[num].idnum=26;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]='(';
		            num++;
                    break;
			case')'://output(27,row,col,")");
                    //output1(")");
                    col++;
                    tn=tn+1;
                    tablet[num].idnum=27;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]=')';
		            num++;
                    break;
			/*case'['://output(28,row,col,"[");
                    //output1("[");
                    col++;
                    tablet[num].idnum=28;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]='[';
		            num++;
                    break;
			case']':output(29,row,col,"]");
                    //output1("]");
                    tablet[num].idnum=29;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]=']';
		            num++;
                    break;*/
			case'{'://output(30,row,col,"{");
                    //output1("{");
                    col++;
                    tn=tn+1;
                    tablet[num].idnum=30;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]='{';
		            num++;
                    break;
			case'}'://output(31,row,col,"}");
                    //output1("}");
                    col++;
                    tn=tn+1;
                    tablet[num].idnum=31;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]='}';
		            num++;
                    break;
			/*case',':output(32,row,col,",");
			        tablet[num].idnum=32;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]=',';
		            num++;
                    //output1(",");
                    break;
			case':':output(33,row,col,":");
                    //output1(":");
                    tablet[num].idnum=39;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]=':';
		            num++;
                    break;*/
			case';'://output(34,row,col,";");
                    //output1(";");
                    col++;
                    tn=tn+1;
                    tablet[num].idnum=39;
		            tablet[num].rownum=row;
		            tablet[num].colnum=col;
		            tablet[num].idy[0]=';';
		            num++;
                    break;
	       case '\n':row++;
		           col=0;
		           break;
                //
		}

    }
}
int if_PA1()
{
    if(tablet[numtest].idnum==10||tablet[numtest].idnum==11)
        numtest++;
    else
    {
        printf("Error!缺少id|num 应添加在第%d单词后\n",tablet[numtest].colnum);
        done=0;
        return 0;
    }    
}
int if_PA()
{
    if(tablet[numtest].idnum==10)
    {
        numtest++;
        if(tablet[numtest].idnum==40)
        {
            numtest++;
            if_PA1();
        }
        else
        {
            printf("Error!缺少== 应添加在第%d单词后\n",tablet[numtest].colnum);
            done=0;
            return 0;
        }    
    }
    else
    {
        printf("Error!缺少id应添加在第%d单词后\n",tablet[numtest].colnum);
        done=0;
        return 0;
    }    
}        
        

int if_ps()
{
    if(tablet[numtest].idnum==26)//if
    {
        numtest++;
        if_PA();
        //numtest++;
        if(tablet[numtest].idnum==27)
            numtest++;
        else
        {
            printf("Error!缺少)应添加在第%d单词后\n",tablet[numtest].colnum);
            done=0;
            return 0;
        }    
    }
    else
    {
        printf("Error!缺少(应添加在第%d单词后\n",tablet[numtest].colnum);
        done=0;
        return 0;
    }    
}        
            
   /* }
    else if(tablet[numtest].idnum==10)//ID
    {
        numtest++;
        pid();
    }
    else
        printf("ERROR!不能以数字开头");
}*/

int id_PA1()
{
    if(tablet[numtest].idnum==11||tablet[numtest].idnum==10)
    {    numtest++;
        //printf("%d\n",numtest);
    }    
    else
    {
        printf("Error!运算错误!不是num|id 应添加在第%d单词后\n",tablet[numtest].colnum);
        done=0;
        return 0;
    }    
}    

int id_PA()
{
    if(tablet[numtest].idnum==21)
    {
        numtest++;
        id_PA1();
        if(tablet[numtest].idnum==22||tablet[numtest].idnum==23||tablet[numtest].idnum==24||tablet[numtest].idnum==25)
        {
            numtest++;
            id_PA1();
        }
        else
        {
            printf("Error!运算错误!缺少操作符应添加在第%d单词后\n",tablet[numtest].colnum);
            done=0;
            return 0;
        }    
    }
    else
    { 
        printf("Error!缺少= 应添加在第%d单词后\n",tablet[numtest].colnum);
        done=0;
        return 0;
    }    
    /*if(tablet[numtest].idnum==10) 
    {
        numtest++;
        if(tablet[numtest].idnum==21||tablet[numtest].idnum==22||tablet[numtest].idnum==23||tablet[numtest].idnum==24)
        {
            numtest++;
            id_PA1();
        }
        else
        {
            printf("Error!运算错误!2缺少操作符");
            return;
        }    
    }
    else
    {
        printf("Error!运算错误!3不是数字|id"); 
        return;
    } */    
}
                
int id_ps()
{
    if(tablet[numtest].idnum==10)
    {
        numtest++;
        id_PA();
        //if(tablet[numtest].idnum==10||tablet[numtest].idnum==11)
        //numtest++;
        //numtest++;
        if(tablet[numtest].idnum==39)
            numtest++;
        else
        {
            printf("Error!缺少 ;应添加在第%d单词后\n",tablet[numtest].colnum);
            done=0;
            return 0;
        }    
    }    
}           
        


    

int ps()
{
    if(tablet[numtest].idnum==1)
    {
        numtest++;
        if_ps();
        if(tablet[numtest].idnum==30)
        {
            numtest++;
            id_ps();
            numtest++;
        }
        else
        {  
            printf("Error! 缺少{应添加在第%d单词后\n",tablet[numtest].colnum);
            done=0;
            return 0;
        }    
        if(tablet[numtest-1].idnum!=31)
        {
            printf("Error! 缺少}应添加在第%d单词后\n",tablet[numtest].colnum);
            done=0;
            return 0;
        }    
    }    
    else if(tablet[numtest].idnum==10)
    {
        id_ps();
    } 
}
int main()
{
    scanner();
    //printf("词法成功");
    numtest=0;
    //printf("%d\n",num);
    //for(int i=0;i<num;i++)
    //{
       // printf("%d\n",tablet[i].idnum);
    //}    
    while(numtest<num)
    {
      ps();
      if(done==1)
         printf("语法分析成功!");
    }    
    while(1);
    return 0;
}                   

            
                                             
                        
                                
                                        
                                                        
              

⌨️ 快捷键说明

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