📄 tokenreader.h
字号:
#ifndef __TOKENREADER_H__
#define __TOKENREADER_H__
#pragma once
#define MAX_SHORT 65535
#include "Token.h"
#include "afxtempl.h"
typedef CList<CToken*, CToken*> CTokenList;
typedef CList<CTokenList*, CTokenList*> CTokenListList;
DECLARE_TEST_DUMP(CTokenList)
typedef int (CToken::*PFReadToken)(LPCTSTR);
//记号读取器,将源代码转换为记号序列
class CTokenReader
{
public:
//构造函数
CTokenReader();
//析构函数
virtual ~CTokenReader();
public:
//初始化
static void Init();
//设置要转换为序号序列的源代码
void SetCode(LPCTSTR ipCode)
{ASSERT(ipCode != NULL); mpCode = ipCode; Init();};
//读取下一个Token
CToken* NextToken();
//将代码读取到TokenList中
void ReadTokenList(CTokenList& oList, LPCTSTR ipCode);
//删除TokenList中的对象
static void ClearTokenList(CTokenList& iList);
//在完成预处理后剔除无效的token如换行符
static void DeleteInvalidToken(CTokenList& iList);
//本函数主要用于读取函数或宏的参数
//将TokenList转换为字符串,遇到type为iEndType的Token时结束,并返回TRUE,字符串不包含该Token
//但iSkipBeginType和iSkipEndType之内的type为iEndType的Token则不结束
//当出现不匹配的)时则结束,并返回FALSE, 表示读取完毕
static BOOL TokenListToString(CString& oStr, CTokenList& ioList,
POSITION& ioPos, UINT iEndType=TT_UNDEFINED,
UINT iSkipBeginType=TT_UNDEFINED, UINT iSkipEndType=TT_UNDEFINED);
//将TokenList转换成C/C++字符串,如"需替负为\"
static BOOL TokenListToCString(CString& oStr, CTokenList& ioList,
POSITION& ioPos, UINT iEndType=TT_UNDEFINED,
UINT iSkipBeginType=TT_UNDEFINED, UINT iSkipEndType=TT_UNDEFINED);
private:
//读取一个token前的预处理,忽略空格及其他无效字符
//oColumns为跳过的字符数
BOOL BeforeNextToken(UINT& oColumns);
//读取一个非符号Token,如单词,数字,注释,字符串
CToken* ReadCodeToken(UINT iType, PFReadToken pf, int iOffset, BOOL iForeSpace);
//读取一个符号Token,如->,iLen为符号长度
CToken* ReadOperatorToken(UINT iType, int iLen, BOOL iForeSpace);
//判断记号类别
int GetSymbolType(char ch1, char ch2='\0')
{
if(ch2 == '\0')
return mSymbols[ch1];
int index = ch1;
index <<= 8;
index += ch2;
return mSymbols[index];
}
private:
LPCTSTR mpCode; //以0结尾的源代码
//保存分界符,两个字节或一个字节
//两个字节的分界符,其值为左字节的值左移八位加历字节的值
static UINT mSymbols[MAX_SHORT];
//int mLine;
//int mColumn;
UNIT_TEST(CTokenReader)
};
DECLARE_TEST_DUMP(CTokenReader)
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -