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

📄 wawawa.c

📁 的语法非常容易使用EBNF进行重写
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		nul(l);printf("call ");
		getsym();
		if(strcmp(sym,"ident")==0)
		{
			printf("%s\n",id);
			getsym();
		}
		else error(14);//call后应为标识符.
	}
	nul(l);printf("过程调用语句结束 ");
	 
}

//读语句处理
//<读语句>::=READ'('<标识符>{,<标识符>}')'
void Read()
{
	nul(l);printf("读语句开始 ");
	if(strcmp(sym,"readsym")==0)
	{
		printf("read");
		getsym();
		if(strcmp(sym,"lparen")!=0)
			error(34);//read后应跟的是括号
		else
		{
			do
			{
				nul(l);printf("%s\n",sym);
				getsym();
				if(strcmp(sym,"ident")==0)
				{
					nul(l);printf("%s",id);
					getsym();
				}
			}while(strcmp(sym,"comma")==0);
		}

        if(strcmp(sym,"rparen")!=0)
			error(33);//读语句应以右括号结束
		else
		{	
			nul(l);printf("%s\n",sym);
			getsym();
		}
	}
    nul(l);printf("读语句结束 ");
}

//写语句处理
//<写语句>::=WRITE'('<表达式>{,<表达式>}')'
void Write()
{
	nul(l);printf("写语句开始 ");
	if(strcmp(sym,"writesym")==0)
	{
		nul(l);printf("%s\n",sym);
		getsym();
		if(strcmp(sym,"lparen")!=0)
           error(34);//write后应是左括号
		else
		{
			do
			{
				nul(l);printf("%s",sym);
				getsym();
				expression();
			}while(strcmp(sym,"comma")==0);
		}
		if(strcmp(sym,"rparen")!=0)
			error(33);//写语句应以右括号结束
		else
		{
            nul(l);printf("%s\n",sym);
			getsym();
			
		}
	}
	nul(l);printf("写语句结束 ");
}

//复合语句处理
//<复合语句>::=BEGIN<语句>{;<语句>}END
void FuHe()
{
	void statement();
	

	if(strcmp(sym,"beginsym")==0)
	{
		nul(l);printf("%s复合语句开始\n",sym);
		getsym();
		statement();
	    while(strcmp(sym,"semicolon")==0||strcmp(sym,"beginsym")==0||strcmp(sym,"callsym")==0||strcmp(sym,"ifsym")==0||strcmp(sym,"whilesym")==0)
		{
		  if(strcmp(sym,"semicolon")==0)
		  { 
		 	  nul(l);printf("%s\n",sym);
			  getsym();
		  }
		  else error(10);//语句之间漏了';'.
		  statement();
		}
		
	    if(strcmp(sym,"endsym")==0)
		{
		    nul(l);printf("%s",sym);
		    getsym();
		}
	   else error(17);//丢了'end'或';'
	}

	printf("复合语句结束\n");
}

//语句处理
//<语句>::=<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空>
void statement()
{
//	nul(l);printf("语句开始!");
	if(strcmp(sym,"ident")==0)
		FuZhi();//赋值语句处理
	else if(strcmp(sym,"ifsym")==0)
	{
		TiaoJian();//条件语句处理
	}
	else if(strcmp(sym,"whilesym")==0)
		DangXingXunHuan();//当型循环语句处理
	else if(strcmp(sym,"callsym")==0)
		GuoChengDiaoYong();//过程调用语句处理
	else if(strcmp(sym,"readsym")==0)
		Read();//读语句处理
	else if(strcmp(sym,"writesym")==0)
		Write();//写语句处理
	else if(strcmp(sym,"beginsym")==0)
		FuHe();//复合语句处理
	//else getsym();//空语句处理
	//nul(l);printf("%s\n",sym);
//    nul(l);printf("语句结束!");
}

//常量说明部分处理
//<常量说明部分>::=CONST<常量定义>{,<常量定义>};
//<常量定义>::=<标识符>=<无符号整数>
void constdeclaration()
{
	//nul(l);printf("常量说明部分开始\n");
	if(strcmp(sym,"ident")==0)
	{
		nul(l);printf(" %s ",id);
		getsym();
		if(strcmp(sym,"eql")==0||strcmp(sym,"becomes")==0)
		{
			if(strcmp(sym,"becomes")==0)
				error(1);
			else 
			{
				nul(l);printf(" %s ",sym);
				getsym();
			}
			if(strcmp(sym,"number")==0)
			{
				nul(l);printf("%d ",num);
				nul(l);printf("(进入符号表)\n");
				getsym();
			}
			else error(2);
		}
		else error(3);
	}
	else error(4);
	//nul(l);printf("常量说明部分结束\n");
}

//变量说明部分处理
//<变量说明部分>::=VAR<标识符>{,<标识符>};
void vardeclaration()
{
	//nul(l);printf("变量说明部分开始\n");
	if(strcmp(sym,"ident")==0)
	{
		nul(l);printf("  %s",id);
		printf("(进入符号表)");
		getsym();
	}
	else error(4);
	//nul(l);printf("变量说明部分结束\n");
}

//过程说明部分处理
//<过程说明部分>::=<过程首部><分程序>{;<过程说明部分>};
//<过程首部>::=PROCEDURE<标识符>;
void procdeclaration()
{
	void block();
	//nul(l);printf("过程说明部分开始\n");
	while(strcmp(sym,"procsym")==0||strcmp(sym,"constsym")==0||strcmp(sym,"varsym")==0)
	{
		if(strcmp(sym,"procsym")==0) 
		{
			fengexian(20);
			nul(l);printf("(过程说明部分开始)%s ",sym);
		}
		getsym();
		if(strcmp(sym,"ident")==0)
		{
			printf("%s ",id);
			//nul(l);printf("(进入符号表)");
			getsym();
		}
		else error(4);
		if(strcmp(sym,"semicolon")==0)
		{
			printf(";\n");
			getsym();
		}
		else
		{
			nul(l);printf("aaa %s\n",sym);
			error(5);
		}
		block();
	    if(strcmp(sym,"semicolon")==0)
		{
			nul(l);printf("(过程说明部分结束)%s\n",sym);
			fengexian(20);
			getsym();
			procdeclaration();
		}
		else if(strcmp(sym,"period")==0)
		{;}
		else
		{
			nul(l);printf("ssss %s\n",sym);
			error(5);
		}
	
	}
	
}

//分程序处理
//<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
void block()
{
	
	printf("\n");
	nul(l);printf("%d层调用 分程序开始\n",l);
    l++;
	while(strcmp(sym,"procsym")==0||strcmp(sym,"constsym")==0||strcmp(sym,"varsym")==0)
	{
	     if(strcmp(sym,"constsym")==0)
		 {
			fengexian(10);
		    nul(l);printf("(常量说明部分开始)%s\n",sym);
		    getsym();
     	    constdeclaration();
		    while(strcmp(sym,"comma")==0)
			{
			    nul(l);printf(" %s(多个常量说明间的间隔符)\n",sym);
				getsym();
				constdeclaration();
			}
			if(strcmp(sym,"semicolon")==0)
			{
				nul(l);printf("(常量说明部分结束);\n");
				fengexian(10);
				getsym();
			}
			else error(5);
		
		 }
	     else if(strcmp(sym,"varsym")==0)
		 {
			fengexian(10);
	     	nul(l);printf("(变量说明部分开始)%s\n",sym);
		    getsym();
		    vardeclaration();
		    while(strcmp(sym,"comma")==0)
			{
			   printf(";");
			   getsym();
			   vardeclaration();
			}
		    if(strcmp(sym,"semicolon")==0)
			{
			  printf("\n");
			  nul(l);printf("(变量说明部分结束);\n");
			  fengexian(10);
			  getsym();
			}
		    else error(5);
		 }
	     else if(strcmp(sym,"procsym")==0)
		 {
		
	     	procdeclaration();
            //nul(l);printf("过程说明部分结束\n");
		 }
	}

	{statement();
    l=l-1;
    nul(l);printf("%d层调用 分程序结束\n",l);
	printf("\n");}
	
}



//程序处理
//<程序>::=<分程序>.
void main()
{  
	//char fname[20];
	char c[2];
    //int ifone;
	show();
	do
	{
    //ifone=1;
	printf("请输入您要进行语法分析的文件:");
    fp=openfile("r");
    //if(ifone)fp1=freopen("b.txt","w",stdout);
	//fp=fopen("a.txt","r");
    getsym();
	fengexian(45);
    printf("程序开始\n");
	block();
    if(strcmp(sym,"period")!=0)
		error(9);
	printf("程序结束\n");
	if(count!=0) printf("本程序中有错误\n");
	fengexian(45);
    //fclose(fp1);
	printf("您还要分析下一个文件吗?(y继续,其他退出):");
	scanf("%s",c);
	getchar();
	if(tolower(c[0])!='y')break;
	}while(1);
   fclose(fp);
}

⌨️ 快捷键说明

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