📄 variable.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 + -