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

📄 scpascal.cpp

📁 pascal编译器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
							newerrorptr->next = errorptr;
				
							errorptr = nullptr;
							
							return errorptr;
						}
						break;
					case rw_real:
					case rw_integer:
					case rw_boolean:
						{
							if ((errorptr->label_type == rw_function)||(errorptr->label_type == rw_procedure)||(errorptr->label_type == rw_begin))
								if ((topoferror(1) == rw_of)||(topoferror(1) == colon)){
									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;
					case id:
						{
							if ((errorptr->label_type == rw_real)||(errorptr->label_type == rw_integer)||(errorptr->label_type == rw_boolean)){
								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 = colon;
								newerrorptr->next = errorptr;
				
								errorptr = nullptr;
							
								return errorptr;
							}
								
						}
					
					default:
						{
							struct label_stream *nullptr = new struct label_stream;
							nullptr = errorptr;
							errorptr = errorptr->next;
							while(topoferror(0) != program_head){
								pop(1);
								poperrorelement(1);
							}
							while((errorptr->label_type != rw_begin)&&(errorptr->label_type != rw_function)||(errorptr->label_type != rw_procedure)){
								errorptr=errorptr->next;
								nullptr = nullptr->next;
							}
							
							return nullptr;
						}
				}
		}
			break;
		case 3:{//接受function或procedure,进入子程序的申明状态
			cout<<"subproc decalration parameter error!"<<endl;
			int i=0;
			while((topoferror(i)!=rw_function)&&(topoferror(i)!=rw_procedure)){
				
				i=i+1;
				cout<<topoferror(i)<<endl;
			}
			
			switch(topoferror(i)){
				case rw_function:{
					cout<<"auto recovery this function parameter!"<<endl;
					while(topoferror(0) != rw_function){
						pop(1);
						poperrorelement(1);
					}
					while((errorptr->label_type!=rw_var)&&(errorptr->label_type != rw_begin)){
						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 *nullptr = new struct label_stream;

					newerrorptr1->label_type = id;
					newerrorptr2->label_type = colon;
					newerrorptr3->label_type = rw_integer;
					newerrorptr4->label_type = sem;

					newerrorptr4->next=errorptr;
					newerrorptr3->next=newerrorptr4;
					newerrorptr2->next=newerrorptr3;
					newerrorptr1->next=newerrorptr2;
					
					nullptr->next=newerrorptr1;
					
					errorptr = nullptr;
					
					return errorptr;
				}
				break;
				case rw_procedure:{
					cout<<"auto recovery this procedure parameter!"<<endl;
					while(topoferror(0) != rw_procedure){
						pop(1);
						poperrorelement(1);
					}
					while((errorptr->label_type!=rw_var)&&(errorptr->label_type != rw_begin)){
						errorptr=errorptr->next;
					}
					
					struct label_stream *newerrorptr1 = new struct label_stream;
					struct label_stream *newerrorptr2 = new struct label_stream;
					struct label_stream *nullptr = new struct label_stream;
					newerrorptr1->label_type = id;
					newerrorptr2->label_type = sem;					
					
					newerrorptr2->next=errorptr;
					newerrorptr1->next=newerrorptr2;
					nullptr->next=newerrorptr1;
					
					errorptr = nullptr;
					
					return errorptr;
				}
				break;
				default:{
					cout<<"auto funorpro recovery!!"<<endl;
					
					while((topoferror(0) != subproc_declarations)&&(topoferror(0) != declarations)){
						pop(1);
						poperrorelement(1);
					}
					while((errorptr->label_type!=rw_var)&&(errorptr->label_type != rw_begin)){
						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 *nullptr = new struct label_stream;
					newerrorptr1->label_type = rw_procedure;
					newerrorptr2->label_type = id;
					newerrorptr3->label_type = sem;					
					
					newerrorptr3->next=errorptr;
					newerrorptr2->next=newerrorptr3;
					newerrorptr1->next=newerrorptr2;
					nullptr->next=newerrorptr1;
					
					errorptr = nullptr;
					
					return errorptr;
				}
				break;
			}
		}
			break;
		case 4:{//子程序接受var后的状态,申明状态
			cout<<"subproc 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;
							newerrorptr->next = errorptr;
				
							errorptr = nullptr;
							
							return errorptr;
						}
						break;
					case rw_real:
					case rw_integer:
					case rw_boolean:
						{
							if ((errorptr->label_type == rw_function)||(errorptr->label_type == rw_procedure)||(errorptr->label_type == rw_begin))
								if ((topoferror(1) == rw_of)||(topoferror(1) == colon)){
									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;
					case id:
						{
							if ((errorptr->label_type == rw_real)||(errorptr->label_type == rw_integer)||(errorptr->label_type == rw_boolean)){
								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 = colon;
								newerrorptr->next = errorptr;
				
								errorptr = nullptr;
							
								return errorptr;
							}
								
						}
					
					default:
						{
							struct label_stream *nullptr = new struct label_stream;
							nullptr = errorptr;
							errorptr = errorptr->next;
							while(topoferror(0) != subproc_head){
								pop(1);
								poperrorelement(1);
							}
							while(errorptr->label_type != rw_begin){
								errorptr=errorptr->next;
								nullptr = nullptr->next;
							}
							
							return nullptr;
						}
				}
		}
			break;
		case 5:{//子程序开始进入begin状态
			cout<<"subproc have a ERROR!"<<endl;
			if ((topoferror(0)==sem)&&(errorptr->label_type==rw_end)){//程序end前语句有分号
				pop(1);
				poperrorelement(1);
				struct label_stream *nullptr = new struct label_stream;
				nullptr->next=errorptr;
				errorptr=nullptr;
				cout<<"before end have error ';'"<<endl;
				return errorptr;
			}
			
			while((topoferror(0) != sem)&&(topoferror(0)!= rw_begin)){
				pop(1);
				poperrorelement(1);
			}
			while((errorptr->label_type != sem)&&(errorptr->label_type != rw_end)){
				errorptr=errorptr->next;
			}
			struct label_stream *nullptr = new struct label_stream;
			
			nullptr->next=errorptr;
			errorptr=nullptr;
			cout<<"auto recovery statement error"<<endl;
			return errorptr;
			
			
		}
			break;
		case 6:{//子程序已经接受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;
			newerrorptr->next = errorptr;
			
			errorptr = nullptr;
				
			return errorptr;
		}
			break;
		case 7:{//子程序已经完成,但未规约完成
			while(topoferror(0)!=rw_program){
				pop(1);
				poperrorelement(1);
			}
			while(errorptr->label_type!=DOLLAR){
				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 *nullptr = new struct label_stream;
			newerrorptr1->label_type = id;
			newerrorptr2->label_type = sem;					
			newerrorptr3->label_type = rw_begin;
			newerrorptr4->label_type = rw_end;
					
			newerrorptr4->next=errorptr;
			newerrorptr3->next=newerrorptr4;
			newerrorptr2->next=newerrorptr3;
			newerrorptr1->next=newerrorptr2;
			nullptr->next=newerrorptr1;
			
			errorptr = nullptr;
					
			return errorptr;
		}
			break;
		case 8:{//主程序接受begin,正在主程序中
			cout<<"main program have a ERROR!"<<endl;
			if ((topoferror(0)==sem)&&(errorptr->label_type==rw_end)){//程序end前语句有分号
				pop(1);
				poperrorelement(1);
				struct label_stream *nullptr = new struct label_stream;
				nullptr->next=errorptr;
				errorptr=nullptr;
				cout<<"before end have error ';'"<<endl;
				return errorptr;
			}
			
			while((topoferror(0) != sem)&&(topoferror(0)!= rw_begin)){
				pop(1);
				poperrorelement(1);
			}
			while((errorptr->label_type != sem)&&(errorptr->label_type != rw_end)){
				errorptr=errorptr->next;
			}
			if(errorptr->label_type == sem) errorptr=errorptr->next;
			struct label_stream *nullptr = new struct label_stream;
			
			nullptr->next=errorptr;
			errorptr=nullptr;
			cout<<"auto recovery error statement!"<<endl;
			return errorptr;
			
		}
			break;
		case 9:{//得到end没有得到'.'
			if(errorptr->label_type==DOLLAR){
				cout<<"end without '.'"<<endl;
				struct label_stream *nullptr = new struct label_stream;
				struct label_stream *newerrorptr = new struct label_stream;
				
				newerrorptr->next = errorptr;
				newerrorptr->label_type = node;
				nullptr->next=newerrorptr;
				errorptr=nullptr;
			}else{
				while(errorptr->label_type!=DOLLAR){
					errorptr=errorptr->next;
				}
				cout<<":'.' expect after end!"<<endl;
				struct label_stream *nullptr = new struct label_stream;
				nullptr->next=errorptr;
				errorptr=nullptr;
			}
			return errorptr;
			
		}
			break;
		case 10:{//得到.程序完成
			while(topoferror(0)!=subproc_declarations){
				pop(1);
				poperrorelement(1);
			}
			while(errorptr->label_type==DOLLAR){
				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 *nullptr = new struct label_stream;
			newerrorptr1->label_type = rw_begin;
			newerrorptr2->label_type = id;					
			newerrorptr3->label_type = rw_end;
			newerrorptr4->label_type = node;
					
			newerrorptr4->next=errorptr;
			newerrorptr3->next=newerrorptr4;
			newerrorptr2->next=newerrorptr3;
			newerrorptr1->next=newerrorptr2;
			nullptr->next=newerrorptr1;
					
			errorptr = nullptr;
					
			return errorptr;
		}
			break;
		default:{
			cout<<"ERROR of your input!"<<endl;
			while(topoferror(0)!=rw_program){
				pop(1);
				poperrorelement(1);
			}
			while(errorptr->label_type!=DOLLAR){
				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 *nullptr = new struct label_stream;
			newerrorptr1->label_type = id;
			newerrorptr2->label_type = sem;					
			newerrorptr3->label_type = rw_begin;
			newerrorptr4->label_type = rw_end;
					
			newerrorptr4->next=errorptr;
			newerrorptr3->next=newerrorptr4;
			newerrorptr2->next=newerrorptr3;
			newerrorptr1->next=newerrorptr2;
			nullptr->next=newerrorptr1;
			
			errorptr = nullptr;
					
			return errorptr;
		}
			break;
	}
	
	
}


void InitErrRecovery(){
	InitErrorstack();			//初始化错误栈;
}
//语法分析器的构造
void main(){
	InitLex();				//初始化词法分析
	InitTable();			//初始化LR1分析表
	InitErrRecovery();		//初始化错误恢复表
	//testTable();

	//记号流的获得
	currentPtr = Lhead;			//记录记号流头指针
	property = NULL;
	//
	InitTranslate();			//初始化翻译状态
	parse();					//语法分析
	closeTranslate();			//结束翻译
  
}

⌨️ 快捷键说明

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