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

📄 scan.cpp

📁 内含源代码和编译实验报告
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				currentToken=ERROR;
				break;							//处理第三类记号(需后续状态),
		}
	}
	return;
};

/******************************************************
** 遇上ID型记号,有可能为保留字,在保留字数组
** m_ReservedWords进行搜索,若没有找到,则为普通ID。
******************************************************/	
TokenType CScaner::reservedLookup(char *ps_pwords){
	int i;
	for(i=0;i<MAXRESERVED;i++)
		if(!strcmp(ps_pwords, m_ReservedWords[i].m_chwords))
			return m_ReservedWords[i].m_Enwords;
	return ID;
}

/***********************************************
**   以下十个函数为第三类记号的后续处理函数。
************************************************/
/******************************************************************处理函数起始处**********/   
void CScaner::OnInassigh(void){														      //	
	m_chGetchar=getNextChar();															  //
	if(m_chGetchar=='=')	currentToken=EQ;		//一个'='后还是'=',则为等于号。	  //
	else{																				  //
		currentToken=ASSIGH;						//否则为赋值号。					  //
		ungetNextChar();							//为赋值号,则后续符号无需保存。	  //
		m_isave=FALSE;																	  //
	}																					  //
	m_Enstate=DONE;																		  //
};																						  //
																						  //
void CScaner::OnIncomment(void){														  //
	m_chGetchar=getNextChar();															  //
	char chLasttwo[2];																	  //
	if(m_chGetchar!='*'){																  //
		m_isave=TRUE;																	  //
		ungetNextChar();																  //
		ungetNextChar();																  //
		m_chGetchar=getNextChar();														  //
		currentToken=OVER;																  //
		m_Enstate=DONE;																	  //
	}																					  //
	else{																				  //
		do{																				  //
			chLasttwo[0]=getNextChar();													  //
			chLasttwo[1]=getNextChar();													  //
			ungetNextChar();															  //
		}while(chLasttwo[0]!='*' || chLasttwo[1]!='/');		//注释内容则完全跳过。		  //
		getNextChar();																	  //
		m_isave=FALSE;																	  //
		m_Enstate=START;																  //
	}																					  //
}   																					  //
																						  //
void CScaner::OnInnum(void){															  //
	m_chGetchar=getNextChar();															  //
	if(!isdigit(m_chGetchar) && m_chGetchar!='.'){										  //
		ungetNextChar();																  //
		m_Enstate=DONE;																	  //
		currentToken = NUM;																  //
		m_isave=FALSE;																	  //
	}																					  //
};																						  //
																						  //
void CScaner::OnInchar(void){															  //
	static int iflag=0;																	  //
	m_chGetchar=getNextChar();															  //
	if(iflag==0){																		  //
		iflag=1;																		  //
		return;}																		  //
	else if(iflag==1){																	  //
		iflag=0;																		  //
		m_Enstate=DONE;																	  //
		if(m_chGetchar!='\'')															  //
			currentToken = ERROR;														  //
		else	currentToken =CCHAR;													  //
		m_isave=FALSE;																	  //
		return;																			  //
	}																					  //
}																						  //
																						  //
void CScaner::OnInid(void){																  //
	m_chGetchar=getNextChar();															  //
	if(!isalpha(m_chGetchar) && !isdigit(m_chGetchar) && m_chGetchar!='_'){				  //
		ungetNextChar();																  //
		m_Enstate=DONE;																	  //
		currentToken = ID;																  //
		m_isave=FALSE;																	  //
	}																					  //
};																						  //
																						  //
void CScaner::OnInneq(void){															  //
	m_chGetchar=getNextChar();															  //
	if(m_chGetchar!='='){																  //
		ungetNextChar();															      //	
		currentToken = NOT;																  //
		m_isave=FALSE;																	  //
	}																					  //
	else																				  //
		currentToken = NEQ;																  //
	m_Enstate=DONE;																		  //
}																						  //
																						  //
void CScaner::OnInand(void){															  //
	m_chGetchar=getNextChar();															  //
	if(m_chGetchar!='&'){																  //
		ungetNextChar();																  //
		currentToken = ERROR;															  //
		m_isave=FALSE;																	  //
	}																					  //
	else																				  //
		currentToken = AND;																  //
	m_Enstate=DONE;																	      //
}																						  //
																						  //
void CScaner::OnInor(void){																  //
	m_chGetchar=getNextChar();															  //
	if(m_chGetchar!='|'){																  //
		ungetNextChar();																  //
		currentToken = ERROR;															  //
		m_isave=FALSE;																	  //	
	}																					  //
	else																				  //
		currentToken = OR;																  //
	m_Enstate=DONE;																	      //	
}																						  //
																						  //
/*********************************************											  //	
** DONE为结束状态,无需任何附加处理(其实这个											  //		
**  函数根本不会被执行到,为便于理解而加入。											  //
*********************************************/											  //
void CScaner::OnDone(void){																  //
};																						  //
																						  //
void CScaner::OnInnlt(void){															  //
	m_chGetchar=getNextChar();															  //
	if(m_chGetchar!='='){																  //
		ungetNextChar();																  //
		currentToken = GT;																  //
		m_isave=FALSE;																	  //
	}																					  //
	else																				  //
		currentToken = NLT;																  //
	m_Enstate=DONE;																		  //
}																						  //
																						  //
void CScaner::OnInngt(void){															  //
	m_chGetchar=getNextChar();															  //
	if(m_chGetchar!='='){																  //
		ungetNextChar();																  //
		currentToken = LT;																  //
		m_isave=FALSE;																	  //
	}																					  //
	else																				  //
		currentToken = NGT;																  //
	m_Enstate=DONE;																		  //
}																						  //	
/***************************************************************************处理函数结束处*/
		
/*******************************************************
**   打印扫描结果,这个函数在只进行源文件扫描时被执行。
*********************************************************/
void CScaner::printToken(TokenType pa_currentToken, char* pa_tokenString){
	if(pa_currentToken>=IF && pa_currentToken<=FLOAT){
		cout<<"reserved word: "<<pa_tokenString<<endl;
		return;}
	switch(pa_currentToken){
		case ASSIGH:	cout<<"="<<endl;	break;
		case EQ:		cout<<"=="<<endl;	break;
		case NEQ:		cout<<"!="<<endl;	break;
		case LT:		cout<<"<"<<endl;	break;
		case GT:		cout<<">"<<endl;	break;
		case NLT:		cout<<">="<<endl;	break;
		case NGT:		cout<<"<="<<endl;	break;
		case AND:		cout<<"&&"<<endl;	break; 
		case OR:		cout<<"||"<<endl;	break;
		case NOT:		cout<<"!"<<endl;	break;
		case PLUS:		cout<<"+"<<endl;	break;
		case MINUS:		cout<<"-"<<endl;	break; 
		case TIMES:		cout<<"*"<<endl;	break;
		case OVER:		cout<<"/"<<endl;	break;
		case LLPAREN:	cout<<"("<<endl;	break;
		case RLPAREN:	cout<<")"<<endl;	break;
		case LGPAREN:	cout<<"{"<<endl;	break;
		case RGPAREN:	cout<<"}"<<endl;	break;
		case SEMI:		cout<<";"<<endl;	break;
		case COMMA:		cout<<","<<endl;	break;
		case COLON:		cout<<":"<<endl;    break;
		case ENDFILE:	cout<<"EOF"<<endl;  break;
		case NUM:
			cout<<"NUM, val="<<pa_tokenString<<endl;
			break;
		case ID:
			cout<<"ID, name="<<pa_tokenString<<endl;
			break;
		case CCHAR:
			cout<<"char, val="<<pa_tokenString<<endl;
			break;
		case ERROR:
			cout<<"ERROR:    "<<pa_tokenString<<endl;
			break;
		default:
			cout<<"Unknown token: "<<pa_currentToken<<endl;
	}
}


	

⌨️ 快捷键说明

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