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

📄 parser.cpp

📁 c语言编写
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						Continue=1;
						for(int ExpPos=i+1;Continue&&Exp[Count_NTerm][Choice][ExpPos];ExpPos++)//生成First(Xi+1Xi+2……)
						{
							if(IsTerm(Exp[Count_NTerm][Choice][ExpPos]))//Xj是终结符
							{
									for(int j=0;TempFirst[j];j++)//依次检查TempFirst,如果没有存在就添加
										if(TempFirst[j]==Exp[Count_NTerm][Choice][ExpPos])
											break;
									TempFirst[j]=Exp[Count_NTerm][Choice][ExpPos];
									Continue=0;
							}
							else if(Exp[Count_NTerm][Choice][ExpPos]!=NullToken)
							{
								Continue=0;
								for(int FirstChoice=0;FirstChoice<12;FirstChoice++)//每一个First(Xj)中的元素
								{
									if(First[Exp[Count_NTerm][Choice][ExpPos]-OFFSET][FirstChoice][0])
									{
										if(InFirst(Exp[Count_NTerm][Choice][ExpPos]-OFFSET,FirstChoice,NullToken))//空字在first集合里
											Continue=1;
										for(int CurPos=0;First[Exp[Count_NTerm][Choice][ExpPos]-OFFSET][FirstChoice][CurPos];CurPos++)///当前X的所有first元素(except nulltoken)
										{
											if(First[Exp[Count_NTerm][Choice][ExpPos]-OFFSET][FirstChoice][CurPos]!=NullToken)
											{
												for(int j=0;TempFirst[j];j++)//依次检查TempFirst,如果没有存在就添加
													if(TempFirst[j]==First[Exp[Count_NTerm][Choice][ExpPos]-OFFSET][FirstChoice][CurPos])
														break;
												TempFirst[j]=First[Exp[Count_NTerm][Choice][ExpPos]-OFFSET][FirstChoice][CurPos];
											}
										}
									}
								}
							}
						}
						if(Continue)//还是生成TempFirst
						{
								for(int j=0;TempFirst[j];j++)//依次检查TempFirst,如果没有NullToken就添加
									if(TempFirst[j]==NullToken)
										break;
								TempFirst[j]=NullToken;
						}
						for(int CurPos=0;TempFirst[CurPos];CurPos++)
							if(!InFollow(Exp[Count_NTerm][Choice][i]-OFFSET,TempFirst[CurPos])&&TempFirst[CurPos]!=NullToken)
							{
								change=1;
								AddFollow(Exp[Count_NTerm][Choice][i]-OFFSET,TempFirst[CurPos]);
							}
						if(Have(TempFirst,NullToken,V_shop))
							for(CurPos=0;Follow[Count_NTerm][CurPos]!=NullToken;CurPos++)
								if(!InFollow(Exp[Count_NTerm][Choice][i]-OFFSET,Follow[Count_NTerm][CurPos]))
								{
									change=1;
									AddFollow(Exp[Count_NTerm][Choice][i]-OFFSET,Follow[Count_NTerm][CurPos]);
								}
						for(int i=0;i<30;i++)
							TempFirst[i]=0;
					}
				}
	}
}

void Parser::GenParsingTable()
{	
	for(int Count_NTerm=1;Count_NTerm<=NUM_NTERM;Count_NTerm++)//for every non-terminals
		for(int Choice=0;Exp[Count_NTerm][Choice][0];Choice++)//for every choice of each non-term
		{
			//CurToken=First[Count_NTerm][Choice][0];
			for(int CurPos=0;First[Count_NTerm][Choice][CurPos];CurPos++)//检查First 集合以0为结束;
				if(First[Count_NTerm][Choice][CurPos]!=NullToken)
					M[Count_NTerm][First[Count_NTerm][Choice][CurPos]]=Choice;//M[A][a]=Choice
			if(InFirst(Count_NTerm,Choice,NullToken))//如果空符在first集合中,则检查follow集合,以-1结束(因为$可在follow集合中)
			{
				for(int CurPos=0;Follow[Count_NTerm][CurPos]!=NullToken;CurPos++)//
					M[Count_NTerm][Follow[Count_NTerm][CurPos]]=Choice;
			}
		}
}
TreeNode* Parser::NewNode(int type)
{
//	int a;
	TreeNode* NewNode=new TreeNode;
	NewNode->Type=type;
	NewNode->child=NULL;
	NewNode->sibling=NULL;

	return NewNode;	
}


void Parser::Parsing()
{
	int NullFlag=1;
	for(int i=0;i<=NUM_TERM;i++)
		if(M[1][i]!=NonOp)//分析表是否可以启动
			NullFlag=0;
	if(NullFlag)//分析表无效
		return ;
	TreeNode* CurNode;
	CStack s;//CString str;
	stack.Push(NewNode(V_shop));
	RootNode=NewNode(program);
	stack.Push(RootNode);
	int CurToken=getToken();  //读进第一个单词
	int flag = TRUE;
	while (flag)
	{
		if(!stack.Empty())//弹出栈顶符号
		{ 
			CurNode = stack.Pop(); 
		
		}  
		else
		{	
			CurToken=getToken();  
		}
		if (IsTerm(CurNode->Type))  //终结符
		{
			if (CurNode->Type == CurToken) 
			{
				switch(CurToken)
				{
				case NUM:
					CurNode->attr.val=atoi(tokenString);
					break;
				case ID:
				case IF:
				case ELSE:
				case INT:
				case RETURN:
				case WHILE:
				case VOID:
				//	a=1;
					CurNode->attr.name=copyString(tokenString);
					break;
				default:
					;
				}
				CurToken=getToken();
			}
			else{ 
				Err();
				return ;
			}
		}
		else if(CurNode->Type == V_shop)//V_shop为分析栈的结束符,ENDFILE为token队的终结
		{	
			if(CurToken==ENDFILE) 
				flag = FALSE;
			else{ 
				Err();
				return ;
			}
		}
		else if(M[CurNode->Type-OFFSET][CurToken]!=NonOp)//parsing table不空,替换
			/*
			 *	注意我们生成的M与课本不同,其内容是序号为CurNode->Type的
			 *	非终结符的表达式中第几个选项。
			 */
		{
			int i = 0;
			TreeNode* TempNode=CurNode;
			do{	
				if(Exp[CurNode->Type-OFFSET][M[CurNode->Type-OFFSET][CurToken]][i]!=NullToken)//空字不压栈
				{
				//	TempNode=NewNode(Exp[CurNode->Type-OFFSET][M[CurNode->Type-OFFSET][CurToken]][i]);
					
					if(!i)
					{
						TempNode->child=NewNode(Exp[CurNode->Type-OFFSET][M[CurNode->Type-OFFSET][CurToken]][i]);//第一个符号为原先节点的子节点
						TempNode=TempNode->child;
					}
					else
					{
						TempNode->sibling=NewNode(Exp[CurNode->Type-OFFSET][M[CurNode->Type-OFFSET][CurToken]][i]);;//其他添加为兄弟
						TempNode=TempNode->sibling;
					}
						
					if(!s.Push(TempNode))
					{
						printf("Stack Overflow");
						return ;
					}
					
				}
				i++;
			}while (Exp[CurNode->Type-OFFSET][M[CurNode->Type-OFFSET][CurToken]][i]!=0);//直至替换完成
			while(!s.Empty()) 
				if(!stack.Push(s.Pop()))
				{
					printf("Stack Overflow");
					return ;
				}
		}
		else{ 
				Err();//err
				return ;
			}
	}

}
void Parser::PrintTree(FILE* listing,TreeNode* Node)
{
	
	//TreeNode* CurNode;
	if(Node)
	{
	
		if(IsTerm(Node->Type))
				switch(Node->Type)
				{
					case IF:
					case ELSE:
					case INT:
					case RETURN:
					case WHILE:
					case VOID:
					//	fprintf(listing,"reserved word");
						fprintf(listing,"reserved word: %s",Node->attr.name);
						break;
					case ASSIGN:fprintf(listing,"=");break;
					case LT: fprintf(listing,"<");break;
					case LTOREQ: fprintf(listing,"<=");break;
					case BI: fprintf(listing,">");break;
					case BIOREQ: fprintf(listing,">=");break;
					case EQ: fprintf(listing,"==");break;
					case NEQ: fprintf(listing,"!=");break;
					case PLUS: fprintf(listing,"+");break;
					case MINUS: fprintf(listing,"-");break;
					case TIMES: fprintf(listing,"*");break;
					case OVER: fprintf(listing,"/");break;
					case SEMI: fprintf(listing,";");break;
					case COMA: fprintf(listing,"','");break;
					case LROUNDBRA: fprintf(listing,"'('");break;
					case RROUNDBRA: fprintf(listing,"')'");break;
					case LSQUARPAREN: fprintf(listing,"[");break;
					case RSQUARPAREN: fprintf(listing,"]");break;
					case LBRAC: fprintf(listing,"{");break;
					case RBRAC: fprintf(listing,"}");break;
					case LCOM: fprintf(listing,"/*");break;
					case RCOM: fprintf(listing,"*/");break;
					case ENDFILE:fprintf(listing,"EOF");break;
					case NUM:
						fprintf(listing,"NUM: %d\n",Node->attr.val);
						break;
					case ID:
						fprintf(listing,"ID: %s",Node->attr.name);
						break;
					case ERROR:
						fprintf(listing,"ERROR");
						break;
					default:
						fprintf(listing,"Unknown: %d",Node->Type);
			}
		else
		{
				switch(Node->Type)
				{
					case program:	fprintf(listing,"program");		break;
					case declaration_list:	fprintf(listing,"declaration_list");break;	
					case declaration:	fprintf(listing,"declaration");	break;		
					case var_declaration:fprintf(listing,"var_declaration");	break;	
					case type_specifier	:fprintf(listing,"type_specifier");		break;	
					case fun_declaration:fprintf(listing,"fun_declaration");	break;
					case params	:		    fprintf(listing,"params");	break;
					case param_list:		fprintf(listing,"param_list");break;	
					case param	:			fprintf(listing,"param");	break;
					case compound_stmt:		fprintf(listing,"compound_stmt");	break;
					case local_declarations	:fprintf(listing,"local_declarations");	break;
					case statement_list:	fprintf(listing,"statement_list");	break;
					case statement	:		fprintf(listing,"statement");	break;
					case expression_stmt:	fprintf(listing,"expression_stmt");	break;
					case selection_stmt	:	fprintf(listing,"selection_stmt");	break;
					case iteration_stmt:	fprintf(listing,"iteration_stmt");	break;
					case return_stmt:		fprintf(listing,"return_stmt");	break;
					case expression:		fprintf(listing,"expression");	break;
					case var:				fprintf(listing,"var");	break;
					case simple_expression:	fprintf(listing,"simple_expression");break;	
					case relop:				fprintf(listing,"relop");	break;
					case additive_expression:fprintf(listing,"additive_expression");break;	
					case addop:				fprintf(listing,"addop");	break;
					case term:				fprintf(listing,"term");	break;
					case mulop:				fprintf(listing,"mulop");	break;
					case factor:			fprintf(listing,"factor");	break;
					case call:				fprintf(listing,"call");	break;
					case args:				fprintf(listing,"args");	break;
					case args_list:			fprintf(listing,"args_list");	break;
					/*for left factoring*/
					case _declaration:		fprintf(listing,"_declaration");	break;
					case _param:			fprintf(listing,"_param");	break;
					case _selection_stmt:	fprintf(listing,"_selection_stmt");break;	
					case _return_stmt:		fprintf(listing,"_return_stmt");	break;
					case _var:				fprintf(listing,"_var");	break;
					case _simple_expression:fprintf(listing,"_simple_expression");break;	
					/*for left recursion removal*/
					case _declaration_list:	fprintf(listing,"_declaration_list");	break;
					case _param_list:		fprintf(listing,"_param_list");	break;
					case _local_declarations:fprintf(listing,"_local_declarations");break;	
					case _statement_list:	fprintf(listing,"_statement_list");	break;
					case _additive_expression:	fprintf(listing,"_additive_expression");break;	
					case _term	:			fprintf(listing,"_term");	break;
					case _args_list	:		fprintf(listing,"program");	break;
					case _val:				fprintf(listing,"_val");	break;
					case _op_but_assign:	fprintf(listing,"_op_but_assign");	break;
					case _expression_ID:  	fprintf(listing,"_expression_ID");	break;
					case _expression_var:	fprintf(listing,"_expression_var");		break;
					case _expression_call:	fprintf(listing,"_expression_call");	break;
				}
		
		}
		
		if(Node->child)
		{
			dep++;
			fprintf(listing,"\n");	
			for(int i=0;i<dep;i++)
				fprintf(listing,"    ");		
			fprintf(listing,"(");
			PrintTree(listing,Node->child);	
			fprintf(listing,"\n");
			for(int j=0;j<dep;j++)
				fprintf(listing,"    ");	
			fprintf(listing,")");	
	//		fprintf(listing,"\n");
			dep--;
		}
		if(Node->sibling)
		{
			fprintf(listing,",");
			fprintf(listing,"\n");
			for(int i=0;i<dep;i++)
				fprintf(listing,"    ");
			fprintf(listing," ");
			PrintTree(listing,Node->sibling);
		}
		
	
	}	
}

void Parser::PrintTree(FILE* listing)//按中序遍历输出分析树
{
	fprintf(listing,"按中序遍历输出分析树:\n");
	if(RootNode!=NULL)
	{
		dep=0;
		fprintf(listing,"(");
		//fprintf(listing,"\n");
		PrintTree(listing,RootNode);
		fprintf(listing,"\n");
		fprintf(listing,")");
	}
	else
		fprintf(listing,"Tree Empty!\n");
}

⌨️ 快捷键说明

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