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

📄 编译程序.cpp

📁 编程实现一个小语言的词法/语法分析器程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>



#define ACC -2
//===while if 语法===
#define sy_if		0
#define sy_then		1
#define sy_else		2
#define sy_while	3
#define sy_begin	4
#define sy_do		5
#define sy_end		6
#define a			7
#define semicolon	8
#define e			9
#define jinghao		10
#define S			11
#define L			12

#define tempsy		15
#define EA			18
#define EO			19
//===布尔运算===
#define plus		34
#define times		36
#define becomes		38
#define op_and		39
#define op_or		40
#define op_not		41
#define rop			42

#define lparent		48
#define rparent		49
#define ident		56
#define intconst	57

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

char ch='\0';//当前字符
int count=0;
static char spelling[10]={""};//存放识别的字
static char line[81]={""};//一行字符缓冲区
char *pline;//字符缓冲区指针
static char ntab1[100][10];//存放识别的标识符

struct ntab
{
	int tc;
	int fc;
};
struct ntab ntab2[200];
int label=0;//存放临时变量的表的定义
//===存放文件的结构===
struct rwords
{
	char sp[10];
	int sy;
} ; 
struct rwords reswords[10]=
{{"if",sy_if},{"do",sy_do},{"else",sy_else},{"while",sy_while},{"then",sy_then},{"begin",sy_begin},
{"end",sy_end},{"and",op_and},{"of",op_or},{"not",op_not}};

struct aa
{
	int sy1;
	int pos;
};
struct aa buf[1000];	//词法分析缓冲区
struct aa n;	//当前字符
struct aa n1;	//当前表达式中的字符
struct aa E;	//非终结符
struct aa sstack[100];	//符号栈
struct aa ibuf[100];	
struct aa stack[1000];
struct aa oth;
//===四元式结构===
struct fourexp
{
	char op[10];
	struct aa arg1;
	struct aa arg2;
	int result;
};
struct fourexp fexp[200];

int ssp=0;
struct aa *pbuf=buf;
int nlength=0;
int lnum=0;
int tt1=0;
FILE *cfile;
FILE *mfile;
//*****************************
int newt=0;
int nxq=100;
int lr;
int lr1;
int sp=0;
int stack1[100];
int sp1=0;
int num=0;
struct ll
{
	int nxq1;
	int tc1;
	int fc1;
};
struct ll labelmark[10];
int labeltemp[10];
int pointmark=-1;
int pointtemp=-1;
int sign=0;
//***************************

static int action[19][13]=
/*0*/		{{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,1,-1},
/*1*/		{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,-1},
/*2*/		{-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1},
/*3*/		{-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1},
/*4*/		{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,8},
/*5*/		{-1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1},
/*6*/		{-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
/*7*/		{-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1},
/*8*/		{-1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1},
/*9*/		{-1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1},
/*10*/		{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1},
/*11*/		{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,15,-1},
/*12*/		{-1,-1,103,-1,-1,-1,103,-1,103,-1,103,-1,-1},
/*13*/		{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,16},
/*14*/		{-1,-1,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
/*15*/		{-1,-1,102,-1,-1,-1,102,-1,102,-1,102,-1,-1},
/*16*/		{-1,-1,-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1},
/*17*/		{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,18,-1},
/*18*/		{-1,-1,101,-1,-1,-1,101,-1,101,-1,101,-1,-1}};

static int action1[10][7]=
/*0*/		{{3,-1,-1,2,-1,-1,1},
/*1*/		{-1,4,5,-1,-1,ACC,-1},
/*2*/		{3,-1,-1,2,-1,-1,6},
/*3*/		{-1,104,104,-1,104,104,-1},
/*4*/		{3,-1,-1,2,-1,-1,7},
/*5*/		{3,-1,-1,2,-1,-1,8},
/*6*/		{-1,4,5,-1,9,-1,-1},
/*7*/		{-1,101,5,-1,101,101,-1},
/*8*/		{-1,102,102,-1,102,102,-1},
/*9*/		{-1,103,103,-1,103,103,-1}};

static int action2[16][11]=
/*0*/		{{1,-1,4,-1,5,-1,-1,-1,13,7,8},
/*1*/		{-1,2,-1,101,-1,101,101,101,-1,-1,-1},
/*2*/		{3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
/*3*/		{-1,-1,-1,102,-1,102,102,102,-1,-1,-1},
/*4*/		{1,-1,4,-1,5,-1,-1,-1,11,7,8},
/*5*/		{1,-1,4,-1,5,-1,-1,-1,6,7,8},
/*6*/		{-1,-1,-1,104,-1,9,10,104,-1,-1,-1},
/*7*/		{1,-1,4,-1,5,-1,-1,-1,14,7,8},
/*8*/		{1,-1,4,-1,5,-1,-1,-1,15,7,8},
/*9*/		{105,-1,105,-1,105,-1,-1,-1,-1,-1,-1},
/*10*/		{107,-1,107,-1,107,-1,-1,-1,-1,-1,-1},
/*11*/		{-1,-1,-1,12,-1,9,10,-1,-1,-1,-1},
/*12*/		{-1,-1,-1,103,-1,103,103,103,-1,-1,-1},
/*13*/		{-1,-1,-1,-1,-1,9,10,ACC,-1,-1,-1},
/*14*/		{-1,-1,-1,106,-1,9,10,106,-1,-1,-1},
/*15*/		{-1,-1,-1,108,-1,9,10,108,-1,-1,-1}};

//*********************************************************
//===从文件读一行到缓冲区===
void readline()
{
	char ch1;
	pline=line;
	ch1=getc(cfile);
	while(ch1!='\n')
	{
		*pline=ch1;
		pline++;
		ch1=getc(cfile);
	}
	*pline='\0';
	pline=line;
}
//===从缓冲区读一个字符===
void readch()
{
	if(ch=='\0')
	{
		readline();
		lnum++;
	}
	ch=*pline;
	pline++;
}
//===标志符和关键字的识别===
int find(char spel[])
{
	int ss1=0;
	int ii=0;
	while((ss1==0)&&(ii<nlength))
	{
		if(!strcmp(spel,ntab1[ii]))
			ss1=1;
		ii++;
	}
	if(ss1==1) return ii-1;
	else return -1;
}
void identifier()
{
	int iii=0,j,k;
	int ss=0;
	k=0;
	do
	{
		spelling[k]=ch;
		k++;
		readch();
	}while(((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9')));
	pline--;
	spelling[k]='\0';
	while((ss==0)&&(iii<10))
	{
		if(!strcmp(spelling,reswords[iii].sp))
			ss=1;
		iii++;
	}	
	if(ss==1)
	{
		buf[count].sy1=reswords[iii-1].sy;
	}
	else
	{
		buf[count].sy1=ident;
		j=find(spelling);
		if(j==-1)
		{
			buf[count].pos=tt1;
			strcpy(ntab1[tt1],spelling);
			tt1++;
			nlength++;
		}
		else buf[count].pos=j;
	}
	count++;
	for(k=0;k<10;k++)
		spelling[k]=' ';
}
//===数字的识别===
void number()
{
	int ivalue=0;
	int digit;
	do
	{
		digit=ch-'0';
		ivalue=ivalue*10+digit;
		readch();
	}while((ch>='0')&&(ch<='9'));
	buf[count].sy1=intconst;
	buf[count].pos=ivalue;
	count++;
	pline--;
}
//===扫描主函数===
void scan()
{	
	while(ch!='~')
	{
		if((ch>='a')&&(ch<='z'))
			identifier();
		else if((ch>='0')&&(ch<='9'))
			number();
		else if(ch=='<')
		{
			readch();
			if(ch=='=')
			{
				buf[count].pos=0;
			}
			else
			{
				if(ch=='>')
					buf[count].pos=4;
				else
				{
					buf[count].pos=1;
					pline--;
				}
			}		
			buf[count].sy1=rop;
			count++;
		}
		else if(ch=='>')
		{
			readch();
			if(ch=='=')
			{
				buf[count].pos=2;
			}
			else
			{
				buf[count].pos=3;
				pline--;
			}
			buf[count].sy1=rop;
			count++;
		}
		else if(ch=='(')
		{
			buf[count].sy1=lparent;
			count++;
		}
		else if(ch==')')
		{
			buf[count].sy1=rparent;
			count++;
		}
		else if(ch=='#')
		{
			buf[count].sy1=jinghao;
			count++;
		}
		else if(ch=='+')
		{
			buf[count].sy1=plus;
			count++;
		}
		else if(ch=='*')
		{
			buf[count].sy1=times;
			count++;
		}
		else if(ch==';')
		{
			buf[count].sy1=semicolon;
			count++;
		}
		else if(ch=='=')
		{
			readch();
			if(ch=='=')
			{
				buf[count].sy1=rop;
				buf[count].pos=5;
			}
			else
			{
				buf[count].sy1=becomes;
				pline--;
			}
			count++;
		}
		else
		{
			//什么也不做
		}

		readch();
	}//循环结束
	buf[count].sy1=-1;
}
//*************************************************************

//===
void readnu()
{
	if(pbuf->sy1>=0)
	{
		n.sy1=pbuf->sy1;
		n.pos=pbuf->pos;
		pbuf++;
	}
}
int newtemp()//中间变量的生成
{
	newt++;
	return newt;
}
//===生成四元式===
int gen(char op1[],struct aa arg11,struct aa arg22,int result1)
{
	strcpy(fexp[nxq].op,op1);
	fexp[nxq].arg1.sy1=arg11.sy1;
	fexp[nxq].arg1.pos=arg11.pos;
	fexp[nxq].arg2.sy1=arg22.sy1;
	fexp[nxq].arg2.pos=arg22.pos;
	fexp[nxq].result=result1;
	nxq++;
	return nxq-1;
}
//===布尔表达式匹配===
int merge(int p1,int p2)
{
	int p;
	if(p2==0) return p1;
	else
	{
		p=p2;
		while(fexp[p].result!=0) p=fexp[p].result;
		fexp[p].result=p1;
		return p2;
	}
}
//===回填四元式表格===	
void backpatch(int p,int t)
{
	int tempq;
	int q;
	q=p;
	while(q!=0)
	{
		tempq=fexp[q].result;
		fexp[q].result=t;
		q=tempq;
	}
}
int change1(int chan)
{
	switch(chan)
	{
	case ident:
	case intconst:
		return 0;
	case plus:
		return 1;
	case times:
		return 2;
	case lparent:
		return 3;
	case rparent:
		return 4;
	case jinghao:
		return 5;
	case tempsy:
		return 6;
	}
}
change2(int chan)
{
	switch(chan)
	{
	case ident:
	case intconst:
		return 0;
	case rop:
		return 1;
	case lparent:
		return 2;
	case rparent:
		return 3;
	case op_not:
		return 4;
	case op_and:
		return 5;
	case op_or:
		return 6;
	case jinghao:
		return 7;
	case tempsy:
		return 8;
	case EA:
		return 9;
	case EO:
		return 10;
	}
}
//*******赋值语句分析********
void lrparse1(int num)
{
	lr1=action1[stack1[sp1]][change1(n1.sy1)];
	if(lr1==-1)
	{
		printf("\n算术表达式或赋值语句出错!\n");
		getch();
		exit(0);
	}
	if((lr1<10)&&(lr1>=0))
	{
		sp1++;
		stack1[sp1]=lr1;
		if(n1.sy1!=tempsy)
		{
			ssp++;
			num++;
			sstack[ssp].sy1=n1.sy1;
			sstack[ssp].pos=n1.pos;
		}

⌨️ 快捷键说明

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