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

📄 dgxj.cpp

📁 编译原理:指定文法的递归下降子程序的分析过程.有些地方考虑得并不怎么周到还可以改进
💻 CPP
字号:
/************************************************************************************************
        
		  文法G:E->TE'
                E'->+E/ε
			    T->FT'
			    T'->T/ε
			    F->PF'
			    F'->*F'/ε
			    P->(E)/a/b/^

************************************************************************************************/
#include "stdio.h"
#include "string"
/***************************初始化非终结符子程序***********************************************/
void E();                 /*非终结符E的子程序*/
void Ee();              /*非终结符E'的子程序*/
void T();              /*非终结符T的子程序*/
void Tt();            /*非终结符T'的子程序*/
void F();             /*非终结符F的子程序*/
void Ff();           /*非终结符F'的子程序*/
void P();          /*非终结符P的子程序*/
/**********************************************************************************************/
char FIRST_T[5]="(ab^";
char FOLLOW_Ee[3]=")#";
char FIRST_F[5]="(ab^";
char FOLLOW_Tt[8]="(ab^+)#";
char FIRST_P[5]="(ab^";
char FOLLOW_Ff[9]="*(ab^+)#";
/**********************************************************************************************/
char ch;           /*存放当前的输入符号*/
char SS[50];
int length,count=0;
int sign; 

void E()             
{ 
   if(strchr(FIRST_T,SS[count]))                  /*FIRST_T为E->TE' 的右部的FIRST集合*/
   {
  
    printf("E->TE'\n");
	T();              
	Ee(); printf("E->TE'\n");
   }
   else
   {sign=0;printf("ERROR:无适合的E推出式'\n");}
}


void Ee()         
{
   if(SS[count]=='+') 
   {
	printf("E'->+E\n");
	count++;
	printf("剩余字符为:");
	for(int k=count;k<length;k++)
        printf("%c",SS[k]);
        printf("\n");
	E();
   }
   else if(strchr(FOLLOW_Ee,SS[count]))               /*产生式E'->ε FOLLOW_Ee为E'的FOLLOW集合*/
        printf("E'->ε\n"); 
   else
   {sign=0;printf("ERROR:无适合的E'推出式\n");}
}


void T()
{
     if(strchr(FIRST_F,SS[count]))                  /*FIRST_F为T->FT' 的右部的FIRST集合*/
	 {  
    	printf("T->FT'\n"); 
	    F();
		 
		Tt();
	 }
   else
   {sign=0;printf("ERROR:无适合的T推出式\n");}
}


void Tt()
{	
      if(strchr(FIRST_T,SS[count]))                 /*FIRST_T为产生式T'->T 的右部的FIRST集合*/
	  {
    	printf("T'->T\n");
	   
		 T();
	  }
      else  if(strchr(FOLLOW_Tt,SS[count]))             /*产生式T'->ε,FOLLOW_Tt为T'的FOLLOW集合*/
         printf("T'->ε\n");
	  else
   {sign=0;printf("ERROR:无适合的T'推出式\n");}
}


void F() 
{
     if(strchr(FIRST_P,SS[count]))            /*FIRST_P为F->PF' 的右部的FIRST集合*/ 
	 {  printf("F->PF'\n");
    	P();
      	Ff();
	 }
     else
   {sign=0;printf("ERROR:无适合的F推出式\n");}
}


void Ff()                    /*非终结符F'的子程序*/
{
      if(SS[count]=='*')                 /*   产生式F'->*F'  */
	  {
     	printf(" F'->*F'\n");
    	count++;
		printf("剩余字符为:");
	for(int k=count;k<length;k++)
        printf("%c",SS[k]);
        printf("\n");
		Ff();
	  }
      else if(strchr(FOLLOW_Ff,SS[count]))   /*产生式F'->ε FOLLOW_Ff为F'的FOLLOW集合*/
	  printf(" F'->ε\n");
	 else
   {sign=0;printf("ERROR:无适合的F'推出式\n");}
}


void P()
{
	if(SS[count]=='(')
	{
	 printf("P->(E)\n");
     count++;
	 printf("剩余字符为:");
	    for(int k=count;k<length;k++)
        printf("%c",SS[k]);
        printf("\n");
     E();
	 if(SS[count]==')')
	 { 
		printf("P->(E)\n");
	    count++;
		printf("剩余字符为:");
	    for(int k=count;k<length;k++)
        printf("%c",SS[k]);
        printf("\n");
	 }
	
	} 
    

    else if(SS[count]=='a')
	{ 
		printf("P->a\n");
	    count++;
		printf("剩余字符为:");
    	for(int k=count;k<length;k++)
        printf("%c",SS[k]);
        printf("\n");
	}

    else if(SS[count]=='b')
	{ 
		printf("P->b\n");
	    count++;
		printf("剩余字符为:");
    	for(int k=count;k<length;k++)
        printf("%c",SS[k]);
        printf("\n");
	}

    else if(SS[count]=='^')
	{ 
		printf("P->^\n");
	    count++;
		printf("剩余字符为:");
	    for(int k=count;k<length;k++)
        printf("%c",SS[k]);
        printf("\n");
	}
 else
   {sign=0;printf("ERROR:无适合的P推出式\n");}
}

void main()
{ 
     length=0;
		sign=1;
	printf("请输入要分析的字符串,并以#结束: \n");

       do{

              scanf("%c",&ch);

              SS[length]=ch;

              length++;

       }while(ch!='#');
    E();
	if(SS[count]==SS[length-1]&&sign)
    printf("分析成功\n");
	else
   printf("分析失败\n");
}

⌨️ 快捷键说明

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