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

📄 scpascal.cpp

📁 pascal编译器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		
		gofrom(i);
		i++;
	}
}

void InitparseTable(){				//初始化编译表
	int i,j;
	for (i = 0; i<MAXSTATES; i++){
		for (j = 0; j<NUMOFSYMBOLS; j++){
			actionTable[i][j].typ = error;
		}
	}
	for (i = 0; i<MAXSTATES; i++){
		for (j = 0; j<NUMOFSYMBOLS; j++){
			gotoTable[i][j].typ = error;
		}
	}
	//遍历goTable,此时actionTable和gotoTable已在gofrom(I)中被设置了一部分
}
void showLR1(){					//显示LR1分析表
	int i;
	transnodePtr p;
	for (i = 0; i<numofLR1; i++){
		printf("%d ",LR1[i].length);
		p = LR1[i].tp;
		while(p != NULL){
			printf("%d%d%d ",p->formula,p->dot,p->forward);
			p = p->next;
		}
		printf("\n");

	}
}


void showActionTable(){				//显示action表的动作
	int i,j;
	for (i = 0; i<numofLR1; i++){
		for (j = T1; j<=T2; j++){
			if (actionTable[i][j].typ == shift) {
				printf("s%d ",actionTable[i][j].ai.state);
			}else if(actionTable[i][j].typ== reduce){
				printf("r%d ",actionTable[i][j].ai.ri.formula);
			}else if(actionTable[i][j].typ == acc){
				printf("ac ");
			}else if (actionTable[i][j].typ == error){
				printf("   ");
			}
		}
		printf("\n");
	}
}
void showGotoTable(){				//显示goto表的动作
	int i,j;
	for (i = 0; i<numofLR1; i++){
		for (j = NT1; j<=NT2; j++){
			if(gotoTable[i][j].typ == ok){
				printf("%d ",gotoTable[i][j].gi.state);
			}else{
				printf("  ");
			}
		}
		printf("\n");
	}
}
void testTable(){			//打印goto表与action表
	printf("actionTable:\n");
	showActionTable();
	printf("gotoTable:\n");
	showGotoTable();

}
void InitTable(){			//初始化所有的表
	Init();
	InitparseTable();
	InitLR1();
}


//S_ListNodePtr label_property;
//L_ListNodePtr currentNode;
int isKeyword(int x){
	return 1;
}


L_ListNodePtr currentPtr;
struct symbol_table* property;
int getLabel(){				//从记号流获取记号类型.
	currentPtr = currentPtr->next;
	property = currentPtr->enter;
	int x = currentPtr->label_type;
    switch (x)
	{
	case op_equ:
		{
			x = rw_relop;
			break;
		}
	case op_nequ:
		{
			x = rw_relop;
			break;
		}
	case op_ls:
		{
			x = rw_relop;
			break;
		}
	case op_le:
		{
			x = rw_relop;
			break;
		}
	case op_gr:
		{
			x = rw_relop;
			break;
		}
	case op_ge:
		{
			x = rw_relop;
			break;
		}
	case op_add:
		{
			x = rw_addop;
			break;
		}
	case op_sub:
		{
			x = rw_addop;
			break;
		}
	case rw_or:
		{
			x = rw_addop;
			break;
		}
	case op_mul:
		{
			x = rw_mulop;
			break;
		}
	case op_div:
		{
			x = rw_mulop;
			break;
		}
	case rw_divv:
		{
			x = rw_mulop;
			break;
		}
	case rw_mod:
		{
			x = rw_mulop;
			break;
		}
	case rw_and:
		{
			x = rw_mulop;
			break;
		}
	}
	return (x);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/////weilei////////////////////////////////////////////////////////////////////////////////////////////////

//移进归约共用体的定义
union	action_types
{
	struct	label_stream *shift_type;		//移进,记号流指针
	int     production_num;					//归约,产生式号
};

//id链表的定义
struct  id_list
{
	struct symbol_table *nodes;
	struct  id_list *next;
};

struct  id_list *head, *ps;

//parameter链表定义
struct para_list
{
	struct id_list *nodes;
	struct para_list *next;
};

struct  para_list *para_head,*para_ps;

//expression_list定义
int expr_list,expr_num;

//类型栈所保存的结构体定义
struct	type_stack_element{
			int		type_type;						//0基本类型,1复合类型(即数组类型)
			int		type_num;						//基本(或数组元素)类型号:1整型,2实型,3BOOL
			struct label_stream	*type_nodes;			//终结符的记号流指针
};
//类型栈的定义
struct type_stack_element *type_stack[MAX];
int type_point = 0;

int type_push(struct type_stack_element* x){			//压入类型栈
	if (type_point == MAX){
		return 0;
	}else{
		type_point++;
		type_stack[type_point] = x;
		return 1;
	}
}

struct type_stack_element* type_pop(){				//弹出类型栈
		type_point--;
		return type_stack[type_point+1];
}


void type_check(int action_type,union action_types action_director)   //action_type==0移进,==1归约
{					//类型检查函数
	int i,j;
	struct type_stack_element * temp_element1,* temp_element2;
	
	if	(action_type==0)													//移进
		{
		  switch (action_director.shift_type->label_type)
			{
			
			case 0:														//id
				temp_element1=new struct type_stack_element;
				temp_element1->type_nodes=action_director.shift_type;
				temp_element1->type_type=temp_element1->type_nodes->enter->id_type_type;	
				temp_element1->type_num=temp_element1->type_nodes->enter->id_type;								
				
				type_push(temp_element1);
				break;

			case 1:							//num
				temp_element1= new struct type_stack_element;
				temp_element1->type_nodes=action_director.shift_type;
				temp_element1->type_type=0;	
				temp_element1->type_nodes->enter->id_type_type=0;
				temp_element1->type_num=1;									//int
				temp_element1->type_nodes->enter->id_type=1;
				for(i=0;i<63;i++)
					{
						if (action_director.shift_type->enter->name[i]=='.')
						{
							temp_element1->type_num=2;						//real						
							temp_element1->type_nodes->enter->id_type=2;
						}
					}
				
				type_push(temp_element1);
				break;

			case 6:														//boolean
				temp_element1=new struct type_stack_element;
				temp_element1->type_type=0;	
				temp_element1->type_num=3;								//bool
				temp_element1->type_nodes=action_director.shift_type;
				
				type_push(temp_element1);
				break;

			case 10:													//false
				temp_element1=new struct type_stack_element;
				temp_element1->type_type=0;	
				temp_element1->type_num=3;								//bool
				temp_element1->type_nodes=action_director.shift_type;
				
				type_push(temp_element1);
				break;

			case 13:													//integer
				temp_element1=new struct type_stack_element;
				temp_element1->type_type=0;	
				temp_element1->type_num=1;								//int
				temp_element1->type_nodes=action_director.shift_type;
				
				type_push(temp_element1);
				break;

			case 20:													//real
				temp_element1=new struct type_stack_element;
				temp_element1->type_type=0;	
				temp_element1->type_num=2;								//real
				temp_element1->type_nodes=action_director.shift_type;
				
				type_push(temp_element1);
				break;

			case 23:													//true
				temp_element1=new struct type_stack_element;
				temp_element1->type_type=0;	
				temp_element1->type_num=3;								//bool
				temp_element1->type_nodes=action_director.shift_type;
				
				type_push(temp_element1);
				break;
			case 47:							//id
				temp_element1= new struct type_stack_element;
				temp_element1->type_nodes=action_director.shift_type;
				temp_element1->type_type=0;	
				temp_element1->type_nodes->enter->id_type_type=0;
				temp_element1->type_num=1;									//int
				temp_element1->type_nodes->enter->id_type=1;
				type_push(temp_element1);
				break;

			}
		}else															//归约
		{
		  switch  (action_director.production_num)
		  {
			case 2:
				type_pop();
				type_pop();
				break;

			case 4:
				temp_element1=type_pop();
				ps=head;
				head=new struct  id_list;
				head->next=ps;
				head->nodes=temp_element1->type_nodes->enter;
				
				
				break;

			case 5:
				temp_element1=type_pop();
				head=new struct  id_list;
				head->next=NULL;
				head->nodes=temp_element1->type_nodes->enter;

		//		para_head=new struct para_list;
		//		para_head->nodes=head;
		//		para_head->next=NULL;
				
				type_push(temp_element1);
				break;
			
			case 8:
				temp_element1=type_pop();
				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;
					} 
				if ((head->nodes->id_type==1)||(head->nodes->id_type==2)||(head->nodes->id_type==3))
				{printf("Redirection error!\n");} else {
				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 9:
				temp_element1=type_pop();
				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;
					} 
				if ((head->nodes->id_type==1)||(head->nodes->id_type==2)||(head->nodes->id_type==3))
				{printf("Redirection error!\n");} else {
				head->nodes->id_type=temp_element1->type_num;
				head->nodes->id_type_type=temp_element1->type_type;
				head->nodes->function_type=0;}
	//			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 11:
				temp_element1=type_pop();
				temp_element1->type_type=1;
				type_pop();
				type_pop();
				type_push(temp_element1);
				break;

			case 16:
				temp_element1=type_pop();
				type_pop();
				type_push(temp_element1);
				break;
/////////////////////////////////////////////////////////////////////////////////////////
			case 20:

				temp_element1=type_pop();
				temp_element2=type_pop();
				temp_element2->type_nodes->enter->id_type=temp_element1->type_num;
				temp_element2->type_nodes->enter->function_type=1;
				temp_element2->type_nodes->enter->function_para=0;
//////////////////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@			
				while (!(para_head==NULL))
				{
					while (!(para_head->nodes==NULL))
					{
						temp_element2->type_nodes->enter->function_para=
							temp_element2->type_nodes->enter->function_para*10+para_head->nodes->nodes->id_type;
						para_head->nodes=para_head->nodes->next;
					}
					para_head=para_head->next;
				}
//////////////////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
				
				break;

			case 21:
				temp_element2=type_pop();
				temp_element2->type_nodes->enter->id_type=0;
				temp_element2->type_nodes->enter->function_type=1;
				break;

			case 23:
				para_head=NULL;
				break;

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

				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;

⌨️ 快捷键说明

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