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

📄 fileex.cpp

📁 Visual C++编写的工程解析器源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
							fprintf(lpfile, "%s", bufLine);
							fclose(file);
							fclose(lpfile);
							return TRUE;
						}
						
						if(str != "")							
							fprintf(lpfile, "%s", bufLine);
						memset(bufLine, 0x0, sizeof(bufLine));
						break;			//至此一行内容解析完毕[不包含注释部分]										
					}
				}
			}						
		}	
	}
	fclose(file);
	fclose(lpfile);
	
	//
	return TRUE;
}

//内部方法[解析工程的文件列表]
BOOL CParseDelphiFile::ParseDelphiProj()
{
	if(!RemoveProjFileNoteInfo()) return FALSE;
	
	CFileEx lpfile;
	try
	{
		lpfile.Open((LPCTSTR)m_strNoNotesFilename, CFile::modeRead);
	}
	catch(...)
	{
		return FALSE;
	}
	//
	CStringList m_lstSentence;		//存放工程中的所有句子
	CString strSentence = "";		//句子临时空间
	
	m_lstSentence.RemoveAll();
	//
	while(!lpfile.IsEof())
	{
		char ch;
		lpfile.Read(&ch, 1);
		
		//根据分号来做分隔符来读一个句子
		if(ch == GLOBAL_PASSTR_SPECCHAR)	//字符串有限考虑
		{
			while(!lpfile.IsEof())	
			{
				strSentence += ch;
				
				lpfile.Read(&ch, 1);
				if(ch == GLOBAL_PASSTR_SPECCHAR)	break;
			}
		}
		
		//如果是分号则		
		else if(ch == ';')
		{
			//至此一个句子分析完毕			
			m_lstSentence.AddTail(strSentence);			
			strSentence.Empty();
		}
		
		//普通字符
		else
			strSentence += ch;
	}
	lpfile.Close();
	::DeleteFile((LPCTSTR)m_strNoNotesFilename);	//清除痕迹
	
	/***********************从StringList中搜索出Uses部分内容*************************/
	
	CStringList m_sltTmpList;
	m_sltTmpList.RemoveAll();
	
	POSITION pos = m_lstSentence.GetHeadPosition();
	while(pos != NULL)
	{
		CString str = "";
		str = m_lstSentence.GetNext(pos);
		str += ',';
		
		str.TrimLeft();		str.TrimRight();
		str.MakeUpper();
		int nIndex = str.Find((LPCTSTR)"USES");
		if(nIndex == 0)
		{
			str = str.Right(str.GetLength() - 4);
			str.TrimLeft();
			
			while(str.GetLength() > 0)
			{				
				nIndex = str.Find((TCHAR)',');
				if(nIndex != -1)
				{
					m_sltTmpList.AddTail(str.Left(nIndex));
					
					str = str.Right(str.GetLength() - nIndex -1);					
					str.TrimLeft();
				}
			}
		}
	}
	m_lstSentence.RemoveAll();
	
	//从格式串中解析出文件名
	pos = m_sltTmpList.GetHeadPosition();
	while(pos != NULL)
	{
		CString str = "";
		str = m_sltTmpList.GetNext(pos);
		str.MakeUpper();
		int nIndex = str.Find((TCHAR)GLOBAL_PASSTR_SPECCHAR);
		if(nIndex != -1)
		{
			str = str.Right(str.GetLength() - nIndex);
			str.TrimLeft();	str.TrimRight();
			str.Remove((TCHAR)GLOBAL_PASSTR_SPECCHAR);
			
			m_sltHeadFiles.AddTail(str);
		}
	}
	m_sltTmpList.RemoveAll();
	
	/***********************************结束搜索*************************************/
	return TRUE;
}

//解析文件内部类结构,并修改m_cilClassNames列表内容
BOOL CParseDelphiFile::ParseDelphiClass(char strPasFilename[MAX_PATH])
{
	if(!RemovePasFileNoteInfo(strPasFilename)) return FALSE;		//效率
	
	CFileEx lpfile;
	try
	{
		lpfile.Open((LPCTSTR)m_strNoNotesFilename, CFile::modeRead);
	}
	catch(...)
	{
		return FALSE;
	}
	//
	CStringList m_lstSentence;		//存放工程中的所有句子
	CString strSentence = "";		//句子临时空间
	
	m_lstSentence.RemoveAll();
	
	BOOL bTypeStart = FALSE;		//类型定义是否开始标志
	//
	while(!lpfile.IsEof())
	{
		char ch;
		lpfile.Read(&ch, 1);
		
		if(ch == '(')
		{
			strSentence += ch;
			while(!lpfile.IsEof())
			{				
				lpfile.Read(&ch, 1);
				strSentence += ch;
				if(ch == ')') break;
			}
		}
		else if(ch == ';')
		{
			/********************至此一个句子分析完毕****************/
			
			//如果该句子的前四个字符是type--类型定义开始标志,那么开始记录其中内容
			//如果该句子的前三个字符是var---类型定义结束标志,那么结束记录
			strSentence.TrimLeft();
			
			if(strSentence.Left(4).CompareNoCase("type") == 0)			
				bTypeStart = TRUE;
			else if(strSentence.Left(3).CompareNoCase("var") == 0)
				break;
			
			if(bTypeStart == TRUE)
				m_lstSentence.AddTail(strSentence);
			
			strSentence.Empty();
		}
		
		//普通字符
		else
		{
			strSentence += ch;
		}
	}
	lpfile.Close();
	::DeleteFile((LPCTSTR)m_strNoNotesFilename);	//清除痕迹
	
	/*****************以下部分功能:找出类名列表/找出各个类的三种内部函数*****************/
	
	POSITION pos = m_lstSentence.GetHeadPosition();
	while(pos != NULL)
	{
		CString strSentence = m_lstSentence.GetNext(pos);
		
		strSentence.Replace(10, ' ');
		strSentence.Replace('\n', ' ');

		CString strOld = strSentence;
		strSentence.MakeLower();
		
		//搜索类名		
		int nIndex = strSentence.Find("class");
		if(nIndex != -1)
		{					
			TCHAR chp = 0, chn = 0;		//class标志符前后字符判断
			
			int np = nIndex - 1;
			TCHAR ch = strSentence.GetAt(np);
			while(ch == ' ')
			{ 
				--np; ch = strSentence.GetAt(np); 
			}
			chp = ch;
			
			int nn = nIndex + 5;
			ch = strSentence.GetAt(nn);
			while(ch == ' ')
			{ 
				++nn;	ch = strSentence.GetAt(nn); 
			} 
			chn = ch;
			
			if(chp == '=' && chn == '(')	//如果符合一个类名位置关系
			{
				CString strClassname = "", 
					str = strOld.Left(np - 1);	
				
				str.TrimRight();
				
				int nCount = str.GetLength() - 1;
				
				while(nCount >= 0 && (ch = str.GetAt(nCount)) != ' ')
				{
					strClassname.Insert(0, ch);
					--nCount;
				}
				
				if(strClassname.CompareNoCase("") != 0)
				{
					LPCLASSANDFILEREL lpitem;	
					lpitem = (LPCLASSANDFILEREL)malloc(sizeof(CLASSANDFILEREL));
					memset(lpitem, 0x0, sizeof(lpitem));
					lpitem->nFuncCounts = 0;
					
					lstrcpy(lpitem->strClassName, strClassname.GetBuffer(0));
					lstrcpy(lpitem->strFileName, strPasFilename);
										
					/*********************以后留做扩展[解析类内部函数]*********************/

					//如果class标志行句子中包含有过程或函数定义[特殊情况]
					//所以用do...while结构,至少执行一次

					//标志当前解析部分所在的位置(public/private/protected)
					_CLASSFUNSTYPE cftCurPartType = CLS_FUNS_PUBLIC;

					do	//循环解析var以前的句子内容
					{
						int ifunc = 0;	BOOL bisfunc = FALSE;	//过程和函数区分标志

						ifunc = strSentence.Find("function");
						if(ifunc != -1)
						{
							if(ifunc == 0) bisfunc = TRUE;
							else
							{
								chp = strSentence.GetAt((ifunc > 0) ? ifunc - 1:ifunc);
								chn = strSentence.GetAt(ifunc + strlen("function"));
								if((chp == ' ' || chp == ';') && 
									(chn == ' ' || chn == ';'))							
									//该标志符为函数标志符								
									bisfunc = TRUE;							
							}
						}
						else
						{
							ifunc = strSentence.Find("procedure");
							if(ifunc != -1)
							{
								if(ifunc == 0) bisfunc = FALSE;
								else
								{
									
									chp = strSentence.GetAt(ifunc - 1);
									chn = strSentence.GetAt(ifunc + strlen("procedure"));
									if((chp == ' ' || chp == ';') && 
										(chn == ' ' || chn == ';'))
										//该标志符为函数标志符
										bisfunc = FALSE;
								}
							}
						}

						//解析内部函数列表
						if(ifunc != -1)
						{	
							//解析一个函数/过程名
							CString str = "";
							
							for(int i = ifunc + (bisfunc ? strlen("function"):strlen("procedure")); i < strSentence.GetLength(); ++i)
							{
								ch = strOld.GetAt(i);
								if(ch != '(')	str += ch;	else break;
							}
							str.TrimLeft();	str.TrimRight();

							LPCLASSFUNSSTRUCT lpfunclst;
							lpfunclst = (LPCLASSFUNSSTRUCT)malloc(sizeof(CLASSFUNSSTRUCT));
							memset(lpfunclst, 0x0, sizeof(lpfunclst));

							lstrcpy(lpfunclst->strFunctionName, str.GetBuffer(0));
							lpfunclst->cfType = cftCurPartType;

							if(bisfunc == TRUE)	//如果为function
								lpfunclst->ftType = FT_FUNCTION;
							else				//如果为procedure
								lpfunclst->ftType = FT_PROCEDURE;
							
							lpitem->cfaClassFunsArray[lpitem->nFuncCounts++] = lpfunclst;							
						}

						//下一个成员函数/过程的搜索
						strSentence = m_lstSentence.GetNext(pos);
						strOld = strSentence;
						strSentence.MakeLower();
						
						//是否到类结束部分
						if(strSentence.Compare((LPCTSTR)"end") == 0) break;
						
						//确定下一个函数所在的部分类型(cftCurPartType)
						BOOL bHaveAType = FALSE;	//临时标志位
						
						int nTypeFlagPos = strSentence.Find("private");
						
						if(bHaveAType == FALSE)
						{
							if(nTypeFlagPos != -1)
							{
								if(nTypeFlagPos == 0) 
								{
									cftCurPartType = CLS_FUNS_PRIVATE;
									bHaveAType = TRUE;
								}
								else
								{
									chp = strSentence.GetAt(nTypeFlagPos - 1);
									chn = strSentence.GetAt(nTypeFlagPos + strlen("private"));
									if((chp == ' ' || chp == ';') && 
										(chn == ' ' || chn == ';'))
									{
										cftCurPartType = CLS_FUNS_PRIVATE;
										bHaveAType = TRUE;
									}
								}
							}
						}
						
						nTypeFlagPos = strSentence.Find("protected");
						if(bHaveAType == FALSE)
						{
							if(nTypeFlagPos != -1)
							{
								if(nTypeFlagPos == 0)
								{
									cftCurPartType = CLS_FUNS_PROTECTED;
									bHaveAType = TRUE;
								}
								else
								{								
									chp = strSentence.GetAt((nTypeFlagPos > 0) ? nTypeFlagPos - 1:nTypeFlagPos);
									chn = strSentence.GetAt(nTypeFlagPos + strlen("protected"));
									if((chp == ' ' || chp == ';') && 
										(chn == ' ' || chn == ';'))
									{
										cftCurPartType = CLS_FUNS_PROTECTED;
										bHaveAType = TRUE;
									}
								}
							}
						}
						
						nTypeFlagPos = strSentence.Find("public");
						if(bHaveAType == FALSE)
						{
							if(nTypeFlagPos != -1)
							{
								if(nTypeFlagPos == 0)
								{
									cftCurPartType = CLS_FUNS_PUBLIC;
									bHaveAType = TRUE;
								}
								else
								{
									chp = strSentence.GetAt((nTypeFlagPos > 0) ? nTypeFlagPos - 1:nTypeFlagPos);
									chn = strSentence.GetAt(nTypeFlagPos + strlen("public"));
									if((chp == ' ' || chp == ';') && 
										(chn == ' ' || chn == ';'))
									{
										cftCurPartType = CLS_FUNS_PUBLIC;
										bHaveAType = TRUE;
									}
								}
							}
						}
					}
					while(pos != NULL);
					//一个类解析完毕					
					m_cilClassNames.AddTail(lpitem);
				}
			}
		}
	}
	/****************************************结束****************************************/
	return TRUE;
}

⌨️ 快捷键说明

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