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

📄 scpascal.cpp

📁 pascal编译器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
						head=head->next;
					}
				head->nodes->id_type=temp_element1->type_num;
				head->nodes->id_type_type=temp_element1->type_type;
				head->nodes->function_type=0;
				type_pop();
				break;

			case 25:
				temp_element1=type_pop();
				
				para_head=new struct para_list;
				para_head->nodes=head;
				para_head->next=NULL;

				while (!(head->next==NULL))
					{
						head->nodes->id_type=temp_element1->type_num;
						head->nodes->id_type_type=temp_element1->type_type;
						head->nodes->function_type=0;
						head=head->next;
					}
				head->nodes->id_type=temp_element1->type_num;
				head->nodes->id_type_type=temp_element1->type_type;
				head->nodes->function_type=0;
						
				type_pop();
				break;	
////////////////////////////////////////////////////////////////////////////////////////////////			
			case 31:
				temp_element1=type_pop();
				temp_element2=type_pop();
				if ((temp_element1->type_num==1)&&(temp_element2->type_num==2))
				{
					temp_element2->type_nodes->enter->id_type=2;
				}else if  (temp_element1->type_num!=temp_element2->type_num)
				{
					printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
				}
				break;

			case 34:
				temp_element1=type_pop();
				if (temp_element1->type_num!=3)
				{
					printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
				}
				break;

			case 35:
				temp_element1=type_pop();
				if (temp_element1->type_num!=3)
				{
					printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
				}
				break;

			case 36:
				type_pop();
				break;

			case 37:
				type_pop();
				break;
///////////////////////////////////////////////////////////////////////////////////////
			case 39:
				temp_element1=type_pop();
				temp_element2=type_pop();	
				if (temp_element1->type_num!=1)
				{
					printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
				}
				type_push(temp_element2);
				break;

			case 40:
				type_pop();
				break;

			case 41:
				type_pop();				
				temp_element1=type_pop();
				if (temp_element1->type_nodes->enter->function_para!=expr_list)
				{
					printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
				}
				break;

			case 42:
				temp_element1=type_pop();
				expr_num++;
				j=temp_element1->type_num;
				for (i=0;i<expr_num;i++)
				{
					j=j*10;
				}
				expr_list=expr_list+j;

				break;

			case 43:
				expr_num=0;
				temp_element1=type_pop();
				expr_list=temp_element1->type_num;				
				type_push(temp_element1);
				break;

			case 44:
				temp_element1=type_pop();
				temp_element2=type_pop();
				if	(((temp_element1->type_num==1) && (temp_element2->type_num==2))
					|| ((temp_element1->type_num==2) && (temp_element2->type_num==1))
					|| (temp_element1->type_num==temp_element2->type_num))
					{
						temp_element1->type_num=3;
						temp_element1->type_type=0;
						type_push(temp_element1);
					}
				else {
						if (temp_element2->type_nodes->enter!=NULL)
						{
							printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
						}else if (temp_element2->type_nodes->enter!=NULL)
						{
							printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
						}
						temp_element1->type_num=3;
						temp_element1->type_type=0;
						type_push(temp_element1);
					}
				break;

			case 48:
				temp_element1=type_pop();
				temp_element2=type_pop();
				if	((temp_element1->type_num==1) && (temp_element2->type_num==2))
					{
						type_push(temp_element2);
					}
				else if	((temp_element1->type_num==2) && (temp_element2->type_num==1))
					{
						type_push(temp_element1);
					}
				else if	((temp_element1->type_num==1) && (temp_element2->type_num==1))
					{
						type_push(temp_element1);
					}
				else if	((temp_element1->type_num==2) && (temp_element2->type_num==2))
					{
						type_push(temp_element1);
					}
				else {
						if (temp_element2->type_nodes->enter!=NULL)
						{
							printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
						}else if (temp_element2->type_nodes->enter!=NULL)
						{
							printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
						}
						temp_element1->type_num=1;
						type_push(temp_element1);
					}
				break;

			case 49:
				temp_element1=type_pop();
				temp_element2=type_pop();
				if	((temp_element1->type_num==1) && (temp_element2->type_num==2))
					{
						type_push(temp_element2);
					}
				else if	((temp_element1->type_num==2) && (temp_element2->type_num==1))
					{
						type_push(temp_element1);
					}
				else if	((temp_element1->type_num==1) && (temp_element2->type_num==1))
					{
						type_push(temp_element1);
					}
				else if	((temp_element1->type_num==2) && (temp_element2->type_num==2))
					{
						type_push(temp_element1);
					}
				else {
						if (temp_element2->type_nodes->enter!=NULL)
						{
							printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
						}else if (temp_element2->type_nodes->enter!=NULL)
						{
							printf("The type of expression has fault in line %d\n",temp_element1->type_nodes->lnum);
						}
						temp_element1->type_num=1;
						type_push(temp_element1);
					}
				break;

			case 52:
				temp_element1=type_pop();
				temp_element2=type_pop();
				
				if	(temp_element1->type_num!=1)
				{
					printf("The type of expression has fault in line %d\n",temp_element2->type_nodes->lnum);
				}

				type_push(temp_element2);
				break;
		}
	}
}








///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/////weilei////////////////////////////////////////////////////////////////////////////////////////////////


void pusherrorelement(int);			//压入元素错误栈
int poperrorelement(int);			//错误栈弹出
struct label_stream* errorRecover(struct label_stream *);			//错误恢复函数
void shifthandle(L_ListNodePtr x);				//移进时将val_stack进栈
void translate(int);							//目标代码生成函数

int parse(){									//语法分析函数
	int parse_a,parse_A,parse_S;
	struct actionItem aItem;
	struct gotoItem gItem;
	union action_types Action_Type;
	parseState = ok;
	push(0);
	parse_a = getLabel();
	while(1){
		parse_S = stateStack[top(1)];
		aItem = actionTable[parse_S][parse_a];
		
		printf("%d %d\n",parse_S,parse_a);
		if (aItem.typ == shift){
			pusherrorelement(parse_a);
			push(aItem.ai.state);
			if (parseState == ok){
				shifthandle(currentPtr);
				Action_Type.shift_type=currentPtr;
				type_check(0,Action_Type);
			}
			parse_a = getLabel();
			printf("shift\n");
		}else if (aItem.typ == reduce){
			pop(aItem.ai.ri.length);
			poperrorelement(aItem.ai.ri.length);
			parse_S = stateStack[top(1)];
			parse_A = aItem.ai.ri.leftsym;
			gItem = gotoTable[parse_S][parse_A];
			if (gItem.typ == ok){
				pusherrorelement(parse_A);
				push(gItem.gi.state);
			}else{
				(*gItem.gi.p)();
				break;
			}
			if (parseState == ok){
				translate(aItem.ai.ri.formula);
				Action_Type.production_num=aItem.ai.ri.formula;
				type_check(1,Action_Type);
			}
			printf("reduce by %d\n",aItem.ai.ri.formula);
		}else if (aItem.typ == acc){
			printf("acc\n");
			return 1;
		}else if (aItem.typ == error){
			parseState = error;
			currentPtr = errorRecover(currentPtr);
			parse_S = stateStack[top(1)];
			parse_a = getLabel();
		}
	}
	return 0;
}







//------------------------
void InitTranslate(){
//---------------------------------------------------------------------------------------------------/
//初始化
//新建并打开C语言的文件
	char name[]="c.c";          //name为文件名
    fp=fopen(name,"w");         //主程序中打开文件
//-------------------------------------------------------------------------------------------------/
}
void closeTranslate(){
//关闭C语言的文件
	fclose(fp);                 //主程序中关闭文件
//------------------------------------------------------------------------------------------------

}


//错误处理
int * errorstack;
int errortop;
void InitErrorstack(){				//初始化错误栈
	errorstack = new int[ERRORSTACKNUMBER];
	errortop = -1;
}

void pusherrorelement(int pushx){
	switch(NowState){

	case 0:if (pushx == rw_program) NowState=1;
			break;
		case 1:if((pushx == rw_var)||(pushx == declarations)) NowState=2;
			break;
		case 2:if((pushx == rw_function)||(pushx == rw_procedure)) NowState=3;
					else if(pushx == rw_begin) NowState=8;
			break;
		case 3:if((pushx == rw_var)||(pushx == declarations)) NowState=4;
			break;
		case 4:if(pushx == rw_begin) NowState=5;
			break;
		case 5:if(pushx == rw_end) NowState=6;
			break;
		case 6:if(pushx == sem) NowState=2;
					else if (pushx == rw_begin)NowState=5;
			break;
		case 7:if(pushx == subproc_declarations)NowState=2;
			break;
		case 8:if(pushx == rw_end)NowState=9;
			break;
		case 9:if(pushx == node)NowState=10;
					else if (pushx == rw_begin)NowState=8;
			break;
		case 10:
			break;
		default:cout<<"In ERROR STATE!!"<<endl;
			break;
	}
	errorstack[++errortop] = pushx;
}

int poperrorelement(int popnum){
	if (errortop-popnum>-1)
		errortop=errortop-popnum;
	return errorstack[errortop];
}

int topoferror(int topnum){			//查看从栈顶起第topnum个元素
	return errorstack[errortop-topnum];
}



struct label_stream * errorRecover(struct label_stream * errorptr){			//错误恢复函数
cout<<errorptr->lnum<<" Line have a Error"<<endl;
	switch (NowState){
		case 0:{//开始状态,没接受到programe
				cout<<": expect 'program' there!"<<endl;
				
				struct label_stream *newerrorptr = new struct label_stream;
				struct label_stream *nullptr = new struct label_stream;
				nullptr->next=newerrorptr;
				newerrorptr->label_type = rw_program;
				newerrorptr->next = errorptr;
				
				errorptr = nullptr;
							
				return errorptr;
		}
			break;
		case 1:{//主程序申明状态
				cout<<"main program declaration parameter ERROR!"<<endl;
				switch(topoferror(0)){
					case rpare:{
						if ((topoferror(1) == identifier_list)&&((errorptr->label_type == rw_var)||(errorptr->label_type == rw_begin)||(errorptr->label_type == rw_function)||(errorptr->label_type == rw_procedure))){
							cout<<": expect ';' there!"<<endl;
				
							struct label_stream *newerrorptr = new struct label_stream;
							struct label_stream *nullptr = new struct label_stream;
							nullptr->next=newerrorptr;
							newerrorptr->label_type = sem;
							newerrorptr->next = errorptr;
				
							errorptr = nullptr;
							
							return errorptr;
						}
						break;
					default:
						{
							cout<<"main declaration auto recovery!"<<endl;
							while(topoferror(0) != rw_program){
								pop(1);
								poperrorelement(1);
							}
							while((errorptr->label_type != rw_var)&&(errorptr->label_type != rw_begin)&&(errorptr->label_type != rw_function)&&(errorptr->label_type != rw_procedure)){
								errorptr=errorptr->next;
							}
							
							struct label_stream *newerrorptr1 = new struct label_stream;
							struct label_stream *newerrorptr2 = new struct label_stream;
							struct label_stream *newerrorptr3 = new struct label_stream;
							struct label_stream *newerrorptr4 = new struct label_stream;
							struct label_stream *newerrorptr5 = new struct label_stream;

							struct label_stream *nullptr = new struct label_stream;
							
							newerrorptr1->label_type = id;
							newerrorptr2->label_type = lpare;
							newerrorptr3->label_type = id;
							newerrorptr4->label_type = rpare;
							newerrorptr5->label_type = sem;

							newerrorptr5->next = errorptr;
							newerrorptr4->next = newerrorptr5;
							newerrorptr3->next = newerrorptr4;
							newerrorptr2->next = newerrorptr3;
							newerrorptr1->next = newerrorptr2;
							nullptr->next=newerrorptr1;
							
							errorptr=nullptr;
							
							return errorptr;
						}
						break;
						
					}
				}
				
		}
			break;
		case 2:{//var状态,即是申明状态
				cout<<"main declaration error!"<<endl;
				switch (topoferror(0)){//栈顶的符号
					case rw_end:
						{
							cout<<": expect ';' there! "<<endl;
							struct label_stream *newerrorptr = new struct label_stream;
							struct label_stream *nullptr = new struct label_stream;
							nullptr->next=newerrorptr;
							newerrorptr->label_type = sem;

⌨️ 快捷键说明

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