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

📄 down.h

📁 编译原理课程设计 很珍贵的资源 快来下载吧
💻 H
字号:

#ifndef DOWN
#define DOWN
#include"include.h"
#include"PL.h"

struct
{	char vname[NLEN];//变量名
	int rnum;        //相对数
}VTable[VLEN];       //变量表

int Vptr=0;          //指针,指向变量表的最后一项


struct
{	char pname[NLEN];//过程名
	int parno;//参数个数
	int varno;//过程变量个数+参数个数
	int firstv;//第一个变量在VTable位置
	int first4;//四元式
}PTable[PLEN];//过程表
int Pptr=0;////指针,指向变量表的最后一项

int sym=0;//记录当前处理的单词编码
int P2=-1;//指向二元式表,在递归下降分析时使用

/***********************************************************************************
 *						   查当前字符GetWord()                                     *
 ***********************************************************************************/
 int GetWord()
 {
	 ++P2;
	 if(table[P2].no==SEMA||table[P2].no==BEGIN||table[P2].no==END)lines++;
	 return table[P2].no;
 }



/***********************************************************************************
 *						   递归下降分析主函数PROG()                                *
 ***********************************************************************************/
 void PROG()
 {
	sym=GetWord();

	if(sym==PROGRAM)
		sym=GetWord();
	else error(PROEXP);

	if(sym==IDENT)
	{
		enterp(table[P2].name,0,0,0,PC);
		sym=GetWord();
	}else
		error(IDERR);

	if(sym==SEMA)
	{   sym=GetWord();
		lines++;
	}
	else
		error(SEMAERR);

	PP();
	if((P2+1)==p)
	{	error(SUCCESS);
		return;}
	else
		error(EOFERR);

 }

 /***********************************************************************************
 *						   登记过程enterp()
 * a:参数个数
   b:变量个数
   c:第一个变量在VTable位置
   addr:第一个四元式地址
 ***********************************************************************************/
 void enterp(char name[NLEN],int a,int b,int c,int addr)
 {
	 for(int i=0;i<Vptr;i++)
	 {
		 if(!strcmp(name,PTable[i].pname)){
			error(PREDEFINE);
		 }
	 }
	strcpy(PTable[Pptr].pname,name);
	PTable[Pptr].parno=a;
	PTable[Pptr].varno=a+b;
	PTable[Pptr].firstv=0;
	PTable[Pptr].first4=addr;
	Pptr++;
 }

 void enterv(char *name,int no)
 {
	 for(int i=0;i<Vptr;i++)
	 {
		 if(!strcmp(name,VTable[i].vname)){
			error(VREDEFINE);
		 }
	 }

	strcpy(VTable[Vptr].vname,name);
	VTable[Vptr].rnum=no;
	Vptr++;

 }
int findv(char *c)
{
	//static i=0;
	//i++;
	//return i;
	int i;
		for(i=Vptr;strcmp(c,VTable[i].vname)&&i>0;i--);
	return i;
}

 void IDP()
 {	sym=GetWord();
	if(sym==IDENT){
		int i=1;
		PTable[Pptr].firstv=Vptr;
		do{
			enterv(table[P2].name,i);
			sym=GetWord();
			if(sym==DOU)sym=GetWord();
			i++;
		}while(sym==IDENT);
		if(sym==SEMA)
		{  PTable[Pptr].varno=i-1;
		   sym=GetWord();
		   return;
		}else
			error(SEMAERR);
	}else
		error(IDERR);
 }

 void PL()
 {
	// sym=GetWord();
	 PASER();
 }

void PRP()
{
	 if(sym==PROCEDURE)
		 sym=GetWord();
	 else 
		error(PROCEEXP);

	 if(sym==IDENT)
	 {
		enterp(table[P2].name,0,0,0,PC);
		sym=GetWord();
	 }else
		error(IDERR);

	if(sym==SEMA)
	{   sym=GetWord();
		lines++;
	}
	else
		error(SEMAERR);

	if (sym==VAR)IDP();
	if(sym==BEGIN)PL();
	else
		error(BEGINERR);

	if(sym==END){
		sym=GetWord();
		return;
	}else
		error(ENDERR);
}

 void PP()
 {

	if (sym=VAR)IDP();
	while(sym==PROCEDURE)	PRP();

/*	if(sym=END)
	{   sym=GetWord();
		return;
	}else
		error(ENDERR);*/
 }

#endif

⌨️ 快捷键说明

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