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

📄 testparse.c

📁 编译原理语法分析
💻 C
字号:
#include <stdio.h>
#include<string.h>
#include <ctype.h>
#include <conio.h>
int TESTparse();
int program();
int compound_Stat();
int statement();
int expression_Stat();
int expression();
int do_stat();//*****************************
int bool_expr();
int additive_expr();
int term();
int factor();
int if_stat();
int while_stat();
int for_stat();
int write_stat();
int read_stat();
int declaration_stat();
int declaration_list();
int statement_list();
int compound_stat();
char token[20],token1[40];//token保存单词符号,token1保存单词值
extern char Scanout[300]; //保存词法分析输出文件名
FILE *fp; //用于指向输入输出文件的指针
//语法分析程序
int TESTparse()
{
	int es=0;
	if((fp=fopen("456.txt","r"))==NULL)
	{  
      printf("\n打开456.txt错误!\n!");
	  es=10;
	}
	
	if (es==0) es=program();
	printf("=====语法分析结果!======\n");
	switch(es)
	{
		case 0: printf("语法分析成功!\n");break;	
		case 10: printf("打开文件 %s失败!\n",Scanout);break;
		case 1: printf("缺少{!\n");break;
		case 2: printf("缺少}!\n");break;
		case 3: printf("缺少标识符!\n");break;
		case 4: printf("少分号!\n");break;
		case 5: printf("缺少(!\n");break;
		case 6: printf("缺少)!\n");break;
		case 7: printf("缺少操作数!\n");break;
		case 8: printf("缺少main!\n");break;
		
	}
	fclose(fp);
	return(es);
}
//<程序>::={<声明序列><语句序列>}
//program::={<declaration_list><statement_list>}
int program()
{ 
   int es=0;
   fscanf(fp,"%s %s\n",token,token1);
   printf("%s %s\n",token,token1);
   if(strcmp(token,"main")==0)
   {
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	if (strcmp(token,"(")) 	return(es=5);  //少左括号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	if (strcmp(token,")"))  return(es=6); //少右括号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
   }
   else 
   {
       es=8;
	   return(es);
   }
   if(strcmp(token,"{"))//判断是否'{'
   {
	   es=1;
	   return(es);
   }
   fscanf(fp,"%s %s\n",&token,&token1);
   printf("%s %s\n",token,token1);
   es=declaration_list();
   if (es>0) return(es);
   es=statement_list();
   if (es>0) return(es);
   if(strcmp(token,"}"))//判断是否'}'
   {
	   es=2;
	   return(es);
   }
   return(es);
}
//<声明序列>::=<声明序列><声明语句>|<声明语句>
//<declaration_list>::=
//<declaration_list><declaration_stat>|<declaration_stat>
//该成<declaration_list>::={<declaration_stat>}
int declaration_list()
{
	int es=0;
	while (strcmp(token,"int")==0)
	{
		es=declaration_stat();
		if (es>0) return(es);
	}
	return(es);
}
//<声明语句> ::=int <变量>|<变量>;
//<declaration_stat>::=int ID,{ID};
int declaration_stat()
{
	int es=0;      
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	if (strcmp(token,"ID"))	return(es=3);  //不是标识符
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
    while(strcmp(token,",")==0 )
	{
     fscanf(fp,"%s %s\n",&token,&token1);
	 printf("%s %s\n",token,token1);
	 if (strcmp(token,"ID"))	return(es=3);  //不是标识符
     fscanf(fp,"%s %s\n",&token,&token1);
	 printf("%s %s\n",token,token1);
	};
	if (strcmp(token,";") )	return(es=4);		
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	return(es);
}
//<语句序列>::=<语句序列><语句>|<语句>
//<statement_list>::=<statement_list><statement>|<statement>
//改成<statement_list>::={<statement>}
int statement_list()
{
	int es=0;
	while (strcmp(token,"}"))
	{
		es=statement();
		if (es>0) return(es);
	}
	return(es);
}
//<语句>::=<if语句>|<while语句>|<for语句>|<read语句>
//         |<write语句>|<复合语句>|<表达式语句>
//<statement>::= <if_stat>|<while_stat>|<for_stat>
//               |<compound_stat> |<expression_stat>

int statement()
{
	int es=0;
	if (es==0 && strcmp(token,"if")==0) es=if_stat();//<IF语句>
	if (es==0 && strcmp(token,"while")==0) es=while_stat();//<while语句>
	if (es==0 && strcmp(token,"for")==0) es=for_stat();//<for语句>
    if (es==0 && strcmp(token,"do")==0) es=do_stat();//<do while 语句>
	if (es==0 && strcmp(token,"read")==0) es=read_stat();//<read语句>
	if (es==0 && strcmp(token,"write")==0) es=write_stat();//<write语句>
	if (es==0 && strcmp(token,"{")==0) es=compound_stat();//<复合语句>
	if (es==0 && (strcmp(token,"ID")==0||strcmp(token,"NUM")==0)) es=expression_stat();//<表达式语句>
	return(es);
}
//<IF 语句>::= if (<表达式>) <语句 > [else <语句 >]
//<IF_stat>::= if (<expr>) <statement > [else < statement >]

int if_stat(){
	int es=0;  //if
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	if (strcmp(token,"(")) 	return(es=5);  //少左括号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	es=expression();
	if (es>0) return(es);
	if (strcmp(token,")"))  return(es=6); //少右括号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	es=statement(); 
	if (es>0) return(es);
	if (strcmp(token,"else")==0)//else部分处理
	{  
		fscanf(fp,"%s %s\n",&token,&token1);
		printf("%s %s\n",token,token1);
		es=statement(); 
	    if (es>0) return(es);
	}
	return(es);
}
//<do while 语句>::=do{语句} while(<表达式>)
//<do_stat>::=do<语句>while<表达式>
int do_stat()
{
    int es=0; //do 部分         
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
    es=statement();
    if (es>0) return(es);
    fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	if(strcmp(token,"while")==0)//while 部分
	{
	   fscanf(fp,"%s %s\n",&token,&token1);
	   printf("%s %s\n",token,token1);
       if(strcmp(token,"("))  return(es=5);//少左括号
	   fscanf(fp,"%s %s\n",&token,&token1);
	   printf("%s %s\n",token,token1);
	   es=expression();
       if(es>0) return(es);
		if(strcmp(token,")")) return(es=6);//少右括号
       fscanf(fp,"%s %s\n",&token,&token1);
	   printf("%s %s\n",token,token1);
	}
    else es=3;
	return(es);
}


//<while语句>::=while(<表达式>) <语句>
//<while_stat>::= while (<expr >) < statement >
int while_stat()
{
	int es=0;  
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	if (strcmp(token,"("))  return(es=5);  //少左括号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	es=expression();
	if (es>0) return(es);
	if (strcmp(token,")"))  return(es=6); //少右括号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	es=statement();
	return(es);
}

//<for语句>::=for(<表达式>;<表达式>;<表达式>) <语句 >
//<for_stat>::= for(<expr>,<expr>,<expr>)<statement>
int for_stat()
{
	int es=0;  
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	if (strcmp(token,"("))  return(es=5);  //少左括号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	es=expression();
	if (es>0) return(es);
	if (strcmp(token,";")) 	return(es=4);  //少分号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	es=expression();
	if (es>0) return(es);
	if (strcmp(token,";"))  return(es=4);  //少分号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	es=expression();
	if (es>0) return(es);
	if (strcmp(token,")"))  return(es=6); //少右括号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	es=statement();
	return(es);
	
}
//<write_语句>::=write <表达式>;
//<write_stat>::=write <expression>;
int write_stat()
{
	int es=0;
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	es=expression();
	if (es>0) return(es);
	if (strcmp(token,";"))  return(es=4);  //少分号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	return(es);
}
//<read_语句>::=read <变量>;
//<read_stat>::=read ID;
int read_stat()
{
	int es=0;
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	if (strcmp(token,"ID"))  return(es=3);  //少标识符
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	if (strcmp(token,";"))  return(es=4);  //少分号
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	return(es);
}
//<复合语句>::={<语句序列>} 
//<compound_stat>::={<statement_list>} 
int compound_stat(){   //复合语句函数
	int es=0;
	fscanf(fp,"%s %s\n",&token,&token1);
	printf("%s %s\n",token,token1);
	es=statement_list();
	return(es);
}



//<表达式语句>::=<<表达式>;|;
//<expression_stat>::=<expression>;|;
int expression_stat()
{
	int es=0;
	if (strcmp(token,";")==0) 
	{
		fscanf(fp,"%s %s\n",&token,&token1);
		printf("%s %s\n",token,token1);
		return(es);
	}
	es=expression();
	if (es>0) return(es);
	if (es==0 && strcmp(token,";")==0) 
	{
		fscanf(fp,"%s %s\n",&token,&token1);
		printf("%s %s\n",token,token1);
		return(es);
	} else
	{
		es=4;
		return(es);//少分号
	}
}
//<表达式>::=<标识符>=<布尔表达式>|<布尔表达式>
//<expr>::=ID=<bool_expr>|<bool_expr>

int expression()
{
	int es=0,fileadd;
	char token2[20],token3[40];
	if (strcmp(token,"ID")==0)
	{   
		fileadd=ftell(fp);   //记住当前文件位置
		fscanf(fp,"%s %s\n", &token2,&token3);
		printf("%s %s\n",token2,token3);
		
		if (es>0) return(es);
		if (strcmp(token2,"=")==0)  //'='
		{
			fscanf(fp,"%s %s\n",&token,&token1);
			printf("%s %s\n",token,token1);
			es=bool_expr();
		} else 
		{
			fseek(fp,fileadd,0); //若非'='则文件指针回到'='前的标识符
			printf("%s %s\n",token,token1);
			es=bool_expr();
			if (es>0) return(es);
		}
	}
	
	return(es);
}

//<布尔表达式>::=<算术表达式>|<算术表达式>(>|<|>=|<=|==|!=)<算术表达式>
//<bool_expr>::=<additive_expr>
//           |< additive_expr >(>|<|>=|<=|==|!=)< additive_expr >

int bool_expr()
{
	int es=0;
	es=additive_expr();
	if(es>0) return(es);
	if (strcmp(token,">")==0 || strcmp(token,">=")==0
	   ||strcmp(token,"<")==0||strcmp(token,"<=")==0
	   ||strcmp(token,"==")==0||strcmp(token,"!=")==0)
	{
		fscanf(fp,"%s %s\n",&token,&token1);
		printf("%s %s\n",token,token1);
		es=additive_expr();
		if(es>0) return(es);
	}
	return(es);
}
//<算术表达式>::=<项>{(+|-)<项>}
//<additive_expr>::=<term>{(+|-)< term >} 
int additive_expr()
{
	int es=0;
	es=term();
	if(es>0) return(es);
	while (strcmp(token,"+")==0 || strcmp(token,"-")==0)
	{
		fscanf(fp,"%s %s\n",&token,&token1);
		printf("%s %s\n",token,token1);
		es=term();
		if(es>0) return(es);
	}
	return(es);
}
//<项>::=<因子>{(*|/)<因子>}
//< term >::=<factor>{(*| /)< factor >} 
int term()
{
	int es=0;
	es=factor();
	if(es>0) return(es);
	while (strcmp(token,"*")==0 || strcmp(token,"/")==0)
	{
		fscanf(fp,"%s %s\n",&token,&token1);
		printf("%s %s\n",token,token1);
		es=factor();
		if(es>0) return(es);
	}
	return(es);
}
//<因子>::=(<算术表达式>)|<标识符>|<无符号整数>
//< factor >::=(<additive_expr>)| ID|NUM

int factor()
{
	int es=0;
	
	if (strcmp(token,"(")==0)  
	{
		fscanf(fp,"%s %s\n",&token,&token1);
		printf("%s %s\n",token,token1);
		es=expression();
		if (es>0) return(es);
		if (strcmp(token,")"))  return(es=6); //少右括号
		fscanf(fp,"%s %s\n",&token,&token1);
		printf("%s %s\n",token,token1);
	} else
	{
		
		if (strcmp(token,"ID")==0||strcmp(token,"NUM")==0)
		{
			fscanf(fp,"%s %s\n",&token,&token1);
			printf("%s %s\n",token,token1);
			return(es);
		} else
		{
			es=7;//缺少操作数
			return(es);
		}
	}
	return(es);
}

⌨️ 快捷键说明

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