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

📄 variable.cpp

📁 这是一个能够自动生成文档的程序
💻 CPP
字号:
// Variable.cpp: implementation of the CVariable class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "Variable.h"
#include "Identifiers.h"
#include "CPGlobals.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

BEGIN_TEST_DUMP(CVariable)
    TEST_DUMP_BASE(CIdentifier)
    TEST_DUMP(mType)
    TEST_DUMP(mPureType)
	TEST_DUMP(mArray)
END_TEST_DUMP()


CVariable::CVariable(LPCTSTR iName, LPCTSTR iPureType/*=NULL*/, LPCTSTR iType/*=NULL*/)
:
mPureType(iPureType),
mType(iType)
{

}

CVariable::~CVariable()
{

}

void CVariable::ParseVariable(CTokenList& iList, 
							  UINT iAccessTrim, 
							  CVariableList& oVarList, 
							  BOOL iDefinition/*=TRUE*/)
{
    //解析变量类型
	CString type;
	POSITION pos = iList.GetHeadPosition();
	BOOL definition = TRUE;
	UINT trim = 0;
	ParseVariableType(iList, pos, definition, type, trim);

	while(pos != NULL)
	{
		CVariable* pVar = NULL;
		BOOL next = ParseOneVariable(pVar, iList, pos, type);
		TEST_TRACE(pVar);
		pVar->SetDefined(definition);
		pVar->SetTrim(trim);
		pVar->SetCurrScope(gScope.GetCurrScope());
		if(pVar != NULL)
			oVarList.AddTail(pVar);
		if(!next)
			break;
	}
}

void CVariable::ParseVariableType(CTokenList& ioList,
								  POSITION& ioPos,
								  BOOL& oDefinition,
                                  CString& oType,
								  UINT& oTrim)
{
	ioPos = ioList.GetHeadPosition();
	oDefinition = TRUE;
	oTrim = 0;

	while(ioPos != NULL)
    {
		CToken* pToken = ioList.GetNext(ioPos);
		ASSERT(pToken != NULL);
		
		if(pToken->IsType(TT_WORD))
		{
			CIdenItem* pIdenItem = gIdens.Search(pToken->GetContent());
			if(pIdenItem == NULL || pIdenItem->IsDataType())
			{
				CIdentifier::CatDataType(oType, *pToken);
				
				//变量类型有可能是模板类
				if(ioPos != NULL)
				{
					pToken = ioList.GetAt(ioPos);
					ASSERT(pToken != NULL);
					if(pToken->IsType(TT_LT))
					{
						while(ioPos != NULL)
						{
							pToken = ioList.GetNext(ioPos);
							CIdentifier::CatDataType(oType, *pToken);
							if(pToken->IsType(TT_GT)) break;
						}
					}
				}
				
				break;
			}
			else
			{
				//其他修饰符
				switch(pIdenItem->keyIndex)
				{
				case KEY_EXTERN:
                    oDefinition = FALSE;
				    break;
				case KEY_STATIC:
					oTrim |= TRIM_STATIC;
					break;
				default:
					break;
				}	
			}	
		}
		else
		{
			CIdentifier::CatDataType(oType, *pToken);
		}
	}
}


BOOL CVariable::ParseOneVariable(CVariable*& opVar, CTokenList& iList, POSITION& ioPos, LPCTSTR iType)
{
    if(iList.IsEmpty())
	{
		opVar = NULL;
		return FALSE;
	}

	//作为输出数据,由调用者删除
    opVar = new CVariable();
    CString type = iType;
	CToken* pToken = NULL;

	//解析变量名
	int paran = 0;
	while(ioPos != NULL)
    {
		pToken = iList.GetNext(ioPos);
		if(pToken->IsType(TT_WORD)) //变量名
		{
			//变量名前面可能有域字符串如CMyClass::abc
			if(ioPos != NULL)
			{
				CToken* pTemp = iList.GetAt(ioPos);
				if(pTemp->IsType(TT_SCOPE))
				{
					iList.GetNext(ioPos); //跳过::
					opVar->SetScope(pToken->GetContent());
					opVar->SetScope(pTemp->GetContent());
					continue;
				}
			}

			opVar->SetName(pToken->GetContent());
			break;
		}
		//忽略变量名周围的(),如int (i) = 0也是允许的
		else if(pToken->IsLParan())
		{
			paran++;
			continue;
		}
		else if(pToken->IsRParan())
		{
			paran--;
			continue;
		}
	    else //类型可能包括指针或引用符
		{
			if(pToken->IsType(TT_WORD))
			    pToken->CatContentTo(type);
			else
				type += pToken->GetContent();
		}
	}

	
	opVar->SetType(type);
	TEST_TRACE(opVar);

	//是否已完成解析
	if(ioPos == NULL) return FALSE;
	
	//抛弃多余的括号
    while(ioPos != NULL && paran !=0)
	{
		pToken = iList.GetNext(ioPos);
		if(pToken->IsLParan()) paran++;
		else if(pToken->IsRParan()) paran--;
	}

	//是否已完成解析
	if(ioPos == NULL) return FALSE;

	//是否数组
	pToken = iList.GetAt(ioPos);
	CString arr;
	while(pToken->IsType(TT_LBRACE)) //[
	{	
		while(ioPos != NULL)
		{
		    pToken = iList.GetNext(ioPos);
			pToken->CatContentTo(arr);
			if(pToken->IsType(TT_RBRACE)) //]
				break;
		}

		if(ioPos == NULL)
		{
			opVar->SetArray(arr);
            TEST_TRACE(opVar);
			return FALSE;
		}

		pToken = iList.GetAt(ioPos);
	}
	
	opVar->SetArray(arr);

	//是否已完成解析
	TEST_TRACE(opVar);
	if(ioPos == NULL) return FALSE;
	
	//是否有赋值、对象构造、数组初始化等token
	paran = 0;
    while(ioPos != NULL)
	{
		pToken = iList.GetNext(ioPos);
		if(pToken->IsLParan())
		{
			//即使使用了extern关键字,如果变量已被初始化,则是变量定义
			opVar->SetDefined(TRUE);                        
			paran++;
		}
		else if(pToken->IsType(TT_ASSIGN))
		{
			opVar->SetDefined(TRUE);
		}
		else if(pToken->IsRParan()) 
		{
			paran--;
		}
		else if(pToken->IsType(TT_COMMA) && paran == 0 )
		{
			TEST_TRACE(opVar);
			return TRUE;
		}
	}
	
	//没有读取逗号,完成解析
	TEST_TRACE(opVar);
	return FALSE;
}


void CVariable::UniteType(CToken* ipOperator)
{
	//解引用
	if(ipOperator->GetType() == TT_TIMES)
	{
	    int pos = mType.ReverseFind('*');
        ASSERT(pos != -1);
	    if(pos != -1)
		{
		    mType.Delete(pos);
		}
	}
	//取地址
	else if(ipOperator->GetType() == TT_BIT_AND)
	{
		mType += "*";
	}
	else
	{
		ASSERT(FALSE);
	}
}

void CVariable::UniteVariable(CVariable* ipOther)
{
	ASSERT(mName == ipOther->GetName());
    if(ipOther->IsDefined())
		this->SetDefined(TRUE);

	delete ipOther;
}

⌨️ 快捷键说明

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