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

📄 语义分析-main.c

📁 用c语言编写的关于pascal语言语法分析,词法分析,语义分析(输出有点问题)
💻 C
字号:
#include "stdio.h"
#include "string.h"
#include "malloc.h"
#include "scaner.h"
#include "stack.h"             //利用栈将10进制数转化为字符型,存入字符数组中。
int kk=0;       //输出错误的标志 错误时,kk=1;
int ll=0;       //控制临时变量的下标
void yucu();         //语句串分析程序
void statement();     //语句分析程序
char *expression();     //表达式分析程序
char *term();           //项分析程序
char *factor();         //因子分析程序
char *newtemp();    //回送一个新的临时变量名,且产生的顺序为t1,t2,.....
		
//回送一个新的临时变量名,且产生的顺序为t1,t2,.....
char *newtemp()
{
	char *q;
	q=(char *)malloc(8);
	*q='t';
	ll++;
	if(ll<=9)
		*(q+1)=(char)(ll+'0');
	else
        d_c(ll,(q+1));
	return q;
}

//语法分析程序
void irparser()          //begin<语句串>end
{
	if(syn==1)      //是否以begin 开头
	{
		scaner();   
		yucu();     //是,则分析语句串
		if(syn==6)      //是否以end结束
		{
			scaner();    //找到'#'
			if(syn==0&&kk==0)    //若以'#'结束,则syn=0
				printf("success!!!!");
		}
		else         //语句串输入没有错,则只是end输入错误
		{
			if(kk!=1)
				printf("\n没有'end',输入错误");
			kk=1;
		}
	}
	else          //不是以begin开头
	{
		printf("\n没有以'begin'开头,或输入'begin'错误");
		kk=1;
	}
}


//语句串分析程序
void yucu()          //<语句>(;<语句>)
{
	statement();    //第一个语句
	while(syn==26)    //识别;
	{
		scaner();
		statement();  //下一个语句
	}
}


//语句分析程序
void statement()      //赋值语句->标识符=表达式
{
	char tt[8],eplace[8];   //tt:存放输入串中结果标识符,eplace每个语句计算的最终结果
	/*strcpy(tt,"");
	strcpy(eplace,"");*/
	if(syn==10)      //标识符
	{
		strcpy(tt,token);  //token当前标识符
		scaner();
		if(syn==18)    //:=
		{
			scaner();
			strcpy(eplace,expression());    //expression();   //表达式
			/*printf("\n");
			puts(tt);
			putchar('=');
			puts(eplace);*/
			printf("\n%s=%s %s %s",tt,eplace);
		}
		else
		{
			printf("\n输入'='错误");  //:=没有输入正确
			kk=1;
		}
	}
}



//表达式分析程序
char *expression()     //<项>(+<项>|-<项>)
{
	char *tp,*ep2,*eplace,tt;   //tp:计算结果,ep2:第二项   ,eplace:项首   ,tt:操作符
	tp=(char *)malloc(12);
	ep2=(char *)malloc(12);
	eplace=(char *)malloc(12);
	/*strcpy(tp,"");
	strcpy(ep2,"");
	strcpy(eplace,"");*/
	strcpy(eplace,term());        //项首
	while(syn==13||syn==14)
	{
		if(syn==13)
		    tt='+';
		else
		    tt='-';
		scaner();
		strcpy(ep2,term());     //调用term分析表达式的第二项
		strcpy(tp,newtemp());    //调用newtemp存放临时变量
		/*printf("\n");
		puts(tp);
		putchar('=');
		puts(eplace);
		puts(tt);
		puts(ep2);*/
		printf("\n%s=%s%c%s",tp,eplace,tt,ep2);
		strcpy(eplace,tp);        //将临时变量作为下一次计算的第一项。
	}
	return eplace;
}



//项分析程序
char *term()          //<因子>(*<因子>|/<因子>)
{
	char *tp1,*ep1,*eplace1,tt1;   //tp1:计算结果,ep1:第二个因子   ,eplace1:首因子   ,tt1:操作符
	tp1=(char *)malloc(12);
	ep1=(char *)malloc(12);
	eplace1=(char *)malloc(12);
	/*strcpy(tp1,"");
	strcpy(ep1,"");
	strcpy(eplace1,"");*/
	strcpy(eplace1,factor());   	//factor();     //首因子
	while(syn==15||syn==16)   //*,/
	{
		if(syn==15)
			tt1='*';
		else
			tt1='/';
		scaner(); 
		strcpy(ep1,factor());    //下一个因子
		strcpy(tp1,newtemp());   
		/*printf("\n");
		puts(tp1);
		putchar('=');
		puts(eplace1);
		puts(tt1);
		puts(ep1);*/
		printf("\n%s=%s%c%s",tp1,eplace1,tt1,ep1);
		strcpy(eplace1,tp1);
	}
	return eplace1;
}


//因子分析程序
char *factor()      //标识符|数字|表达式
{
	char *fplace;
	fplace=(char *)malloc(12);
	strcpy(fplace,"");
	if(syn==10)   //标识符
	{
		strcpy(fplace,token);   //将标识符的值赋给fplace
	    scaner();
	}
	else if(syn==11)
	{
		//d_c(sum,fplace);
		*fplace=(char)(sum+'0');
		scaner();
	}
	else if(syn==27)      //(
	{
		scaner();
		fplace=expression();
		if(syn==28)        //)
			scaner();
		else
		{
			printf("\n输入')'时错误");
			kk=1;
		}
	}
	else
	{
		printf("\n表达式错误");
		kk=1;
	}
	return fplace;
}
void main()
{
	printf("\n please input string:\n");
	do                     //从键盘接收到prog
	{
		ch=getchar();
		prog[p++]=ch;
	}while(ch!='#');        //以#结束
	p=0;
	scaner(); //识别第一个单词,是否为begin
	irparser();
}

⌨️ 快捷键说明

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