www.pudn.com > bianyi大作业.zip > AccidenceAnalysis.cpp


// AccidenceAnalysis.cpp:implementation of the CAccidenceAnalysis class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "MyFormulary.h" 
#include "AccidenceAnalysis.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CAccidenceAnalysis::CAccidenceAnalysis() 
{ 
 
} 
 
CAccidenceAnalysis::~CAccidenceAnalysis() 
{ 
 
} 
 
void CAccidenceAnalysis::GetTablePointer(CTable *pt) 
{ 
	m_pTable=pt; 
} 
 
int CAccidenceAnalysis::PreCheck(CString &source, CString &destination) 
{ 
	destination=_T(""); 
	STATUS Status=COMMON; 
	int nError=0; 
	int nCurrPos=0,nLength=source.GetLength(); 
	int nCount=0; 
 
	while(nCurrPosTablesInitialization(); 
	output.RemoveAll(); 
	destination=_T(""); 
 
	CTable::WORDTYPE Wordtype=CTable::UNKNOWN; 
	BYTE chCurrChar='\0'; 
	CString CurrString=_T(""); 
	CString Temp=_T(""); 
	WORD wNumber=0; 
	DWORD dwCurrNum=0; 
	double fCurrNum=0; 
	int nCount=0,nError=0; 
	int nIndex=0,nSize=0; 
	int nCurrPos=0,nLength=source.GetLength(); 
 
	while(nCurrPos='A' && chCurrChar<='Z') || (chCurrChar>='a' && chCurrChar<='z'))Wordtype=CTable::KEYWORD; 
		else if((chCurrChar>='0' && chCurrChar<='9') || (chCurrChar=='.' && nCurrPos+1='0' && source.GetAt(nCurrPos+1)<='9'))Wordtype=CTable::REAL; 
		else Wordtype=CTable::OPERATOR; 
 
		do 
			switch(Wordtype) 
			{ 
			case CTable::COMMAND: 
				CurrString=chCurrChar; 
				while(++nCurrPos='0' && chCurrChar<='9') || (chCurrChar>='A' && chCurrChar<='Z') || (chCurrChar>='a' && chCurrChar<='z'))CurrString+=chCurrChar; 
					else break; 
				} 
				nSize=m_pTable->m_CommandTable.GetSize(); 
				for(nIndex=0;nIndexm_CommandTable.GetAt(nIndex)) 
					{ 
						wNumber=CTable::COMMAND+nIndex; 
						Wordtype=CTable::UNKNOWN; 
						break; 
					} 
				if(Wordtype==CTable::COMMAND) 
				{ 
					nError++; 
					wNumber=CTable::ERRORCODE; 
					CurrString=_T("【错误:未知命令字 ")+CurrString+_T(" 】"); 
					Wordtype=CTable::UNKNOWN; 
				} 
				output.Add(wNumber); 
				Temp.Format("%.2d.命令字:",output.GetSize()); 
				destination+=Temp; 
				destination+=CurrString; 
				destination+=_T("\r\n"); 
				break; 
			case CTable::KEYWORD: 
				CurrString=chCurrChar; 
				while(++nCurrPos='0' && chCurrChar<='9') || (chCurrChar>='A' && chCurrChar<='Z') || (chCurrChar>='a' && chCurrChar<='z'))CurrString+=chCurrChar; 
					else break; 
				} 
				nSize=m_pTable->m_KeywordTable.GetSize(); 
				for(nIndex=0;nIndexm_KeywordTable.GetAt(nIndex)) 
					{ 
						wNumber=CTable::KEYWORD+nIndex; 
						Wordtype=CTable::UNKNOWN; 
						break; 
					} 
				if(Wordtype==CTable::KEYWORD)Wordtype=CTable::IDENTIFIER; 
				else 
				{ 
					output.Add(wNumber); 
					Temp.Format("%.2d.关键字:",output.GetSize()); 
					destination+=Temp; 
					destination+=CurrString; 
					destination+=_T("\r\n"); 
				} 
				break; 
			case CTable::IDENTIFIER: 
				nSize=m_pTable->m_IdentifierTable.GetSize(); 
				for(nIndex=0;nIndexm_IdentifierTable.GetAt(nIndex)) 
					{ 
						wNumber=CTable::IDENTIFIER+nIndex; 
						Wordtype=CTable::UNKNOWN; 
						break; 
					} 
				if(Wordtype==CTable::IDENTIFIER) 
				{ 
					m_pTable->m_IdentifierTable.Add(CurrString); 
					wNumber=CTable::IDENTIFIER+nSize; 
					Wordtype=CTable::UNKNOWN; 
				} 
				output.Add(wNumber); 
				Temp.Format("%.2d.标识符:",output.GetSize()); 
				destination+=Temp; 
				destination+=CurrString; 
				destination+=_T("\r\n"); 
				break; 
			case CTable::OPERATOR: 
				nSize=m_pTable->m_OperatorTable.GetSize(); 
				for(nIndex=0;nIndexm_OperatorTable.GetAt(nIndex); 
					if(CurrString==source.Mid(nCurrPos,CurrString.GetLength())) 
					{ 
						nCurrPos+=CurrString.GetLength(); 
						wNumber=CTable::OPERATOR+nIndex; 
						Wordtype=CTable::UNKNOWN; 
						break; 
					} 
				} 
				if(Wordtype==CTable::OPERATOR)Wordtype=CTable::SEPARATOR; 
				else 
				{ 
					output.Add(wNumber); 
					Temp.Format("%.2d.运算符:",output.GetSize()); 
					destination+=Temp; 
					destination+=CurrString; 
					destination+=_T("\r\n"); 
				} 
				break; 
			case CTable::SEPARATOR: 
				nSize=m_pTable->m_SeparatorTable.GetSize(); 
				for(nIndex=0;nIndexm_SeparatorTable.GetAt(nIndex); 
					if(CurrString==source.Mid(nCurrPos,CurrString.GetLength())) 
					{ 
						nCurrPos+=CurrString.GetLength(); 
						wNumber=CTable::SEPARATOR+nIndex; 
						Wordtype=CTable::UNKNOWN; 
						break; 
					} 
				} 
				if(Wordtype==CTable::SEPARATOR) 
				{ 
					nError++; 
					wNumber=CTable::ERRORCODE; 
					CurrString.Format("【错误:未知分隔符 %c 】",source.GetAt(nCurrPos)); 
					nCurrPos++; 
					Wordtype=CTable::UNKNOWN; 
				} 
				output.Add(wNumber); 
				Temp.Format("%.2d.分隔符:",output.GetSize()); 
				destination+=Temp; 
				destination+=CurrString; 
				destination+=_T("\r\n"); 
				break; 
			case CTable::CHARACTER: 
				CurrString=_T(""); 
				while((chCurrChar=source.GetAt(++nCurrPos))!='\'') 
				{ 
					CurrString+=chCurrChar; 
					if(chCurrChar=='\\')CurrString+=source.GetAt(++nCurrPos); 
				} 
				nCurrPos++; 
				nSize=m_pTable->m_CharacterTable.GetSize(); 
				for(nIndex=0;nIndexm_CharacterTable.GetAt(nIndex)) 
					{ 
						wNumber=CTable::CHARACTER+nIndex; 
						Wordtype=CTable::UNKNOWN; 
						break; 
					} 
				if(Wordtype==CTable::CHARACTER) 
				{ 
					m_pTable->m_CharacterTable.Add(CurrString); 
					wNumber=CTable::CHARACTER+nSize; 
					Wordtype=CTable::UNKNOWN; 
				} 
				output.Add(wNumber); 
				Temp.Format("%.2d.单字符:",output.GetSize()); 
				destination+=Temp; 
				destination+=('\''+CurrString+'\''); 
				destination+=_T("\r\n"); 
				break; 
			case CTable::STRING: 
				CurrString=_T(""); 
				while((chCurrChar=source.GetAt(++nCurrPos))!='\"') 
				{ 
					CurrString+=chCurrChar; 
					if(chCurrChar=='\\')CurrString+=source.GetAt(++nCurrPos); 
				} 
				nCurrPos++; 
				nSize=m_pTable->m_StringTable.GetSize(); 
				for(nIndex=0;nIndexm_StringTable.GetAt(nIndex)) 
					{ 
						wNumber=CTable::STRING+nIndex; 
						Wordtype=CTable::UNKNOWN; 
						break; 
					} 
				if(Wordtype==CTable::STRING) 
				{ 
					m_pTable->m_StringTable.Add(CurrString); 
					wNumber=CTable::STRING+nSize; 
					Wordtype=CTable::UNKNOWN; 
				} 
				output.Add(wNumber); 
				Temp.Format("%.2d.字符串:",output.GetSize()); 
				destination+=Temp; 
				destination+=('\"'+CurrString+'\"'); 
				destination+=_T("\r\n"); 
				break; 
			case CTable::INTEGER: 
				nCount=0; 
				if(chCurrChar=='\0') 
				{ 
					dwCurrNum=0; 
					if(CurrString.GetLength()>1) 
						if(CurrString.GetAt(1)=='x') 
							if((nSize=CurrString.GetLength())<3)nCount++; 
							else 
								for(nIndex=2;nIndex='0' && chCurrChar<='9')dwCurrNum+=(chCurrChar-'0'); 
									else if(chCurrChar>='A' && chCurrChar<='F')dwCurrNum+=(chCurrChar-'A'+10); 
									else if(chCurrChar>='a' && chCurrChar<='f')dwCurrNum+=(chCurrChar-'a'+10); 
									else 
									{ 
										nCount++; 
										break; 
									} 
								} 
						else 
						{ 
							nSize=CurrString.GetLength(); 
							for(nIndex=1;nIndex='0' && chCurrChar<='7')(dwCurrNum<<=3)+=(chCurrChar-'0'); 
								else 
								{ 
									nCount++; 
									break; 
								} 
							} 
						} 
				} 
				if(nCount) 
				{ 
					nError++; 
					wNumber=CTable::ERRORCODE; 
					CurrString=_T("【错误:未知的整型数 ")+CurrString+_T(" 】"); 
					Wordtype=CTable::UNKNOWN; 
				} 
				else 
				{ 
					nSize=m_pTable->m_IntegerTable.GetSize(); 
					for(nIndex=0;nIndexm_IntegerTable.GetAt(nIndex)) 
						{ 
							wNumber=CTable::INTEGER+nIndex; 
							Wordtype=CTable::UNKNOWN; 
							break; 
						} 
					if(Wordtype==CTable::INTEGER) 
					{ 
						m_pTable->m_IntegerTable.Add(dwCurrNum); 
						wNumber=CTable::INTEGER+nSize; 
						Wordtype=CTable::UNKNOWN; 
					} 
				} 
				output.Add(wNumber); 
				Temp.Format("%.2d.整型数:",output.GetSize()); 
				destination+=Temp; 
				destination+=CurrString; 
				destination+=_T("\r\n"); 
				break; 
			case CTable::REAL: 
				fCurrNum=0; 
				nCount=0; 
				if((CurrString=chCurrChar)==".")nCount++; 
				while(++nCurrPos='0' && chCurrChar<='9')CurrString+=chCurrChar; 
					else if(chCurrChar=='.') 
					{ 
						CurrString+=chCurrChar; 
						nCount++; 
					} 
					else if((chCurrChar>='A' && chCurrChar<='Z') || (chCurrChar>='a' && chCurrChar<='z')) 
					{ 
						CurrString+=chCurrChar; 
						nCount+=0x1000; 
					} 
					else break; 
				} 
				if(CurrString.GetAt(0)=='0' && (nCount&0x00FF)==0) 
				{ 
					Wordtype=CTable::INTEGER; 
					chCurrChar='\0'; 
					break; 
				} 
				if(nCount>1 || CurrString.GetAt(CurrString.GetLength()-1)=='.') 
				{ 
					nError++; 
					wNumber=CTable::ERRORCODE; 
					CurrString=_T("【错误:未知的实型数 ")+CurrString+_T(" 】"); 
					Wordtype=CTable::UNKNOWN; 
				} 
				else 
				{ 
					for(nIndex=0;nIndexnIndex;i--)(fTempNum/=10)+=(CurrString.GetAt(i)-'0'); 
							fCurrNum+=fTempNum/10; 
							break; 
						} 
					} 
					if(nCount || fCurrNum>0xFFFFFFFF) 
					{ 
						nSize=m_pTable->m_RealTable.GetSize(); 
						for(nIndex=0;nIndexm_RealTable.GetAt(nIndex)) 
							{ 
								wNumber=CTable::REAL+nIndex; 
								Wordtype=CTable::UNKNOWN; 
								break; 
							} 
						if(Wordtype==CTable::REAL) 
						{ 
							m_pTable->m_RealTable.Add(fCurrNum); 
							wNumber=CTable::REAL+nSize; 
							Wordtype=CTable::UNKNOWN; 
						} 
					} 
					else 
					{ 
						dwCurrNum=(DWORD)fCurrNum; 
						Wordtype=CTable::INTEGER; 
						break; 
					} 
				} 
				output.Add(wNumber); 
				Temp.Format("%.2d.实型数:",output.GetSize()); 
				destination+=Temp; 
				destination+=CurrString; 
				destination+=_T("\r\n"); 
			} 
		while(Wordtype!=CTable::UNKNOWN); 
	} 
 
	return nError; 
}