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

📄 parser.cpp

📁 完整的编译器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//**********************************
//语法语义分析程序
//**********************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stack
{
	char name[20];
	int cod ;
	int addr;
} stack ;
typedef struct equ
{
	int op ;
	int op1;
	int op2;
	int result;
} equ;
typedef struct var 
{
	char name[20];
	int addr;
	int type;
	int value;
} var;
#define EXP_LEN 100
#define EQU_LEN 1024
#define ONE  11111
#define ZERO 10000
#define E_EXPR 7
#define IF 8
#define WHILE 9
#define FOR 10
#define REPEAT 11
#define B_EXP 12
FILE *TokenFin ;
FILE *SymbleFin;
FILE *EquFout ;

int code ;
int address;
int LineOfPro;
int LineOfEqu;
stack var_list[EXP_LEN];
stack expr[EXP_LEN];
equ Equ[EQU_LEN];
var TempList[EXP_LEN];
char ID[20];
int var_count ;
int len_count ;
int pos ;
int now_addr;
int temp_count;
int error_count;
int let_count ;
int E_Contrl;
int E_rtn;
int True_address;
int False_address;
int gen_pos;
int EquPush(int op,int a,int b ,int r);
void GetNext();
void Error(int num);
int Num(char cc);
int gen(int op,int a,int b ,int r);
void Declear();
void InitStack();
void Push(int code,int addr);
int NewTemp();
void BackPatch(int addr,int addr2);
//布尔**************************
int B_Analize();
void B_Init();
int B_OR();
int B1_OR(int a);
int L_AND();
int L1_AND(int a);
int M_NOT();
int K_END();
int K_CMP();

//算术**********************************
int E_Analize();
void E_Init();
int E_AddSub();
int E1_AddSub(int a);
int T_MulDiv();
int T1_MulDiv(int a);
int F_Number();
//语句分析**************************
void parser();
int S_Let(int a);
int S_If();
int S_While();
int S_Begin();
int L_Analize();

//*********************

void parser()
{
	int gen_pos=0;
	int Line ;
	int i;
	char ch1;
	pos=0;
	let_count=0;
	error_count=0;
	LineOfPro=0;
	address=0;
	LineOfEqu=0;
	temp_count=0;
	now_addr=0;
	len_count=0;
	InitStack();
	for(i=0;i<EXP_LEN-2;i++)
	{
		TempList[i].addr=0;
		TempList[i].addr-=i;
		TempList[i].name[0]='b';
		TempList[i].name[1]='x';
	}
	//建立四元式;
	EquFout=fopen("equ.txt","wt+");
	if((TokenFin=fopen("token.txt","rt"))==NULL)
	{
		printf("Cannot open the file token.txt strike any key exit!");
		exit(1);
	}
	printf("********************************************************\n");
	printf("*                     语法分析程序                     *\n");
	printf("*                                                      *\n");
	printf("*              作者: 李国元,夏开宏,毛夏飞           *\n");
	printf("********************************************************\n");
	
	GetNext();
	if(code==22)
	{
		GetNext();
		if(code==34)
		{
			GetNext();
			if(code==52) 
			{
				GetNext();LineOfPro++;
			}
			if(code ==31)
				Declear();//变量说明分析
			if(code ==3) //复合语句分析
			{
				S_Begin();
				if(code!=46)
					Error(49);
			}
			else 
				Error(50);			
		}
		else
			Error(2);
	}
	else
	Error(1);
	
	Line=LineOfEqu;
	LineOfEqu=0;
	while(gen_pos<Line)
	{
		gen(Equ[gen_pos].op,Equ[gen_pos].op1,Equ[gen_pos].op2,Equ[gen_pos].result);
		gen_pos++;
	}
	gen(0,0,0,0);
	if(error_count)
		printf("共计%6d个错误!",error_count);
	else
		printf("语法分析完毕");
	fclose(TokenFin);
	printf("产生四元式如下:\n");
	rewind(EquFout);
	ch1=fgetc(EquFout);
	while(ch1!=EOF)
	{
		printf("%c",ch1);
		ch1=fgetc(EquFout);
	}
	fclose(EquFout);
}

void GetNext()
{
	int d1,d2,d3;
	fscanf(TokenFin,"%d%s%d%d\n",&d1,ID,&d2,&d3);
	code =d2;
	address=d3;
}

void Error(int k)
{
	switch(k)
	{
		case 1: printf("格式出错:第一行少'program'\n");break;
		case 2: printf("格式出错:第一行少程序名\n ");break;
		case 3: printf("第%4d行,说明语句出错 \n",LineOfPro); break;
		case 4: printf("第%4d行,赋值语句出错,不匹配或其它错误 \n",LineOfPro);break;
		case 5: printf("第%4d行,'end'不匹配\n",LineOfPro );break;
		case 6: printf("第%4d行,语句出错 \n",LineOfPro );break;
		case 7: printf("第%4d行,表达式语句出错 \n",LineOfPro);break;
		case 8: printf("第%4d行,if 语句出错 \n",LineOfPro );break;
		case 9: printf("第%4d行,while 语句出错 \n",LineOfPro);break;
		case 10: printf("第%4d行,for 语句出错 \n",LineOfPro);break;
		case 11: printf("第%4d行,repeat 语句出错 \n",LineOfPro);break;
		case 12 : printf("第%4d行,布尔表达式语句出错 \n",LineOfPro);break;
		case 49 : printf("程序缺少.号出错.\n");break;
		case 50: printf("未写任何语句!\n");printf("\n");break;
		case 51: printf("第%4d行,缺少':'\n",LineOfPro);break;
		default :printf("未知错误!\n");printf("\n");break;
	}
	error_count++;
	return;
}

int gen(int op,int a,int b,int r)
{
	LineOfEqu++;
	switch(op)
	{
		case 0: fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('0',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
		case 1: fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc(':',EquFout);
				fputc('=',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
		case 2: fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('+',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
		case 3: fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('-',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
		case 4: fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('*',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
																				
		case 5: fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('/',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
				
		case 6: fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('j',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
				
		case 7: fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('j',EquFout);
				fputc('<',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
		case 8: fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('j',EquFout);
				fputc('=',EquFout);
				fputc(' ',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
			break;
		case 9: fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('j',EquFout);
				fputc('>',EquFout);
				fputc('=',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
		case 10:fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('j',EquFout);
				fputc('<',EquFout);
				fputc('=',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
		case 11:fprintf(EquFout,"%5d",LineOfEqu);
				fputc(' ',EquFout);
				fputc('(',EquFout);
				fputc(' ',EquFout);
				fputc('j',EquFout);
				fputc('<',EquFout);
				fputc('>',EquFout);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",a);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",b);
				fputc(' ',EquFout);
				fprintf(EquFout,"%5d",r);
				fputc(' ',EquFout);
				fputc(')',EquFout);
				fputc('\n',EquFout);
				break;
		default:break;
	}
		return LineOfEqu;
}

/********************说明变量语句分析*******************/
void Declear()
{
	int a=1,i=0,j=0;
	int df;
	InitStack();
	i=0;
	if(code==31)
	{	
		GetNext();
		if(code==3){Error(3);return;}
		while(code!=3)
		{	Push(code,address);
			GetNext();
		}
		i=0;
		var_count=0;
		while(pos>0)
		{	if(expr[i].cod==34)
			{	i++;
				var_count++;
				pos--;
			}
			else
			{	if(expr[i].cod==50)
				{	i++;
					pos--;
					df=expr[i].cod;
					if((df!=4)&&(df!=7)&&(df!=16)&&(df!=24))
					{	Error(3);
						return;
					}
					else
					{	i++;
						pos--;
						if(expr[i].cod==52) {i++;pos--;LineOfPro++;}
						else  {Error(51);LineOfPro++;}
					}
				}
				else 
				{
					if(expr[i].cod==44){i++;pos--;}
					else {Error(3);return;}
				}
			}
		}
/*************修改符号表*************/
	for(i=0;i<EXP_LEN;i++)	
	{	var_list[i].addr=0;
		var_list[i].cod=0;
		for(j=0;j<30;j++)
			var_list[i].name[j]='\0';
	}
	if((SymbleFin=fopen("symble.txt","rt"))==NULL)
	{
		printf("cann't open file symble.txt. strick any key exit");
		exit(1);
	}

	i=0;
	while(1)
	{	fscanf(SymbleFin,"%d%d%s\n",&var_list[i].addr,&var_list[i].cod,var_list[i].name);
		if(var_list[i].addr==0) break;
		i++;
	}
	fclose(SymbleFin);
	if((SymbleFin=fopen("symble.txt","wt"))==NULL)
	{
		printf("cann't open file symble.txt. strick any key exit");
		exit(1);
	}
	a=0;
	fprintf(SymbleFin,"%3d   0   0\n",var_count);
	while(a<i)
	{
		fprintf(SymbleFin,"%3d  %3d  %s\n",var_list[a].addr,var_list[a].cod,var_list[a].name);
		a++;

⌨️ 快捷键说明

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