📄 testexfunction.h
字号:
#ifndef __EXFUNCTION_H__
#define __EXFUNCTION_H__
#pragma once
#include "Identifier.h"
#include "Xml.h"
struct PARAMETER
{
CString type; //参数类型
CString name; //参数名
CString defVal; //缺省值
CString array; //如果参数是数组,保存[]及[]内的文字常量
};
DECLARE_TEST_DUMP(PARAMETER)
typedef CList<PARAMETER*, PARAMETER*> CParameterList;
class CExFunction;
typedef CList<CExFunction*, CExFunction*> CExFunctionList;
//函数类
class CExFunction : public CIdentifier
{
public:
//构造函数
CExFunction();
//析构函数
virtual ~CExFunction();
public:
//解析一个函数的代码
static CExFunction* ParseFunction(CTokenList& iList, UINT iAccessTrim=TRIM_PUBLIC,
BOOL iDefinition=FALSE, CTokenList* iopSrcList=NULL, POSITION* iopPos=NULL,
BOOL iIsInType=FALSE);
//合并函数,有两种情况:
//1.将由实现代码解析得到的函数对象合并到由声明代码解析得到的函数中
//2.重载函数,加入到重载函数列表
void UniteFunction(CExFunction* ipOther);
//==操作符
BOOL operator == (CExFunction& oOther);
//比较第N个参数是否相等
BOOL IsParamEqual(LPCTSTR iParamType, int iIndex);
//参数个数
int GetParameterCount() const {return mParameterList.GetCount();};
//取得函数原形
void GetPrototype(CString& oPrototype);
//取得第一个重载函数的POSITION,用于输出重载函数的数据如原形
POSITION GetFirstRewriteFunctionPosition() {return mRewriteFuncList.GetHeadPosition();};
//取得下一个重载函数
CExFunction* GetNextRewriteFunction(POSITION& ioPos){return mRewriteFuncList.GetNext(ioPos);};
//输出数据到代码文档
void OutputSymbols(CXml& oXml, LPCTSTR iPath);
private:
//解析函数声明
static void ParseDeclare(CTokenList& iList, UINT iAccessTrim,
CExFunction& oFunc, BOOL iIsInType=FALSE);
//设置返回类型
void SetReturnType(LPCTSTR iReturnType) {mReturnType=iReturnType;};
//加入一个参数项
void AddParameter(PARAMETER* ipParam) {ASSERT(ipParam!=NULL); mParameterList.AddTail(ipParam);};
//加入一个该函数的实现代码解析所获得的记号,
//当前版本只是保存实现代码记号,以后版本视需要可作进一步处理
void AddImpToken(CToken* ipToken) {ASSERT(ipToken!=NULL); mImpTokenList.AddTail(ipToken);};
//解析函数名之前的部分
static void ParsePrecursor(CTokenList& iList, CExFunction& oFunc, BOOL iIsInType=FALSE);
//解析参数表后面的部分
static void ParseTail(CTokenList& iList, CExFunction& oFunc);
//解析参数表
static void ParseParameter(CTokenList& iList, CExFunction& oFunc);
//解析一个参数,此函数实现代码有构造性问题,建议采用另一个版本
static PARAMETER* ParseOneParameter(CTokenList& iList);
//解析一个参数的第二个版本
static PARAMETER* ParseOneParameter2(CTokenList& iList);
//解析参数的缺省值,如有缺省值,在解析后将对应的记号从列表中删除
static void ParseOneParameter2DefaultValue(CTokenList& iList, PARAMETER& oParam);
//解析参数的数组部分,如有数组部分,在解析后将对应的记号从列表中删除
static void ParseOneParameter2Array(CTokenList& iList, PARAMETER& oParam);
//解析参数的类型和参数名,由于不能简单分辩类型和参数名,这两项放在
//一个函数中解析
static void ParseOneParameter2TypeAndName(CTokenList& iList, PARAMETER& oParam);
public:
//取得返回类型
CString GetReturnType() const {return mReturnType;};
private:
CTokenList mImpTokenList; //临时保存实现代码
CString mReturnType; //返回类型
CParameterList mParameterList; //参数表
CString mPrototype; //函数原形字符串
CExFunctionList mRewriteFuncList; //同域的重载函数列表
UNIT_TEST(CExFunction)
};
DECLARE_TEST_DUMP(CExFunction)
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -