📄 hwordstream.h
字号:
// HWordStream.h: interface for the HWordStream class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_HCHARACTER_H__6BE6C332_4451_4122_AF31_8C4E14AAD84F__INCLUDED_)
#define AFX_HCHARACTER_H__6BE6C332_4451_4122_AF31_8C4E14AAD84F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "HInputStream.h"
#include "Word.h"
////////////////////////////////////////////////////////////////////////
//文件名 : HWordStream.h
//功能 : 简单词法分析,
//创建 : 2004.3.1
//修改日期 : 2004.4.9
//作者 : 韩国静
//
typedef int WORDSTATE;
//用以指明是一个范围还是一个用数组表示的集合
typedef enum { E_RANG=0, E_SET } ITEMTYPE;
//
typedef enum {
STATE_ONLYEND=0,
STATE_BACKEND,
STATE_NOTEND
}ACTION_FLAG;
///////////////////////////////////////////////////////////
//{A,Z},{a-z},{_,_}
typedef struct {
//用来表示一个大于等于MinChar到小于等于MaxChar的字节范围,
char MinChar;
char MaxChar;
}CHAR_RANG,*PCHAR_RANG;
typedef struct _CHAR_MAPITEM{
//用以指明CharRang是一个由pRang指定的范围,还是一个由pCharSet指向的字符数组,
ITEMTYPE type;
//如果type为E_RANG则指示CharRang.pRang包含范围分段的个数,
//如果type为E_SET则指示CharRang.pCharSet的字符数组的有效长度,
int nCount;
//能够与当前状态匹配的字符集合,可以用范围(区间)来表示,也可以用数组(穷举)来表示。
union{
PCHAR_RANG pRang;
char *pCharSet;
}CharRang;
//如果给定字符在范围之内或在数组内,则pNextTable指向输入流需要匹配的下一个范围或集合
_CHAR_MAPITEM *pNextTable;
//如果给定字符在范围之内或在数组内,则CurState是已经匹配成功的词类型,
//若没有下一个要匹配的集合或与下一个不匹配,则返回这个类型
WORDSTATE CurState;
//若与下一个状态不匹配,指示当前的类型是否已匹配完整。
ACTION_FLAG Flag;
}CHAR_MAPITEM,*PCHAR_MAPITEM;
///////////////////////////////////////////////////////////////////
#ifndef NULL
#define NULL 0
#endif
#define MAP_STATE_RANGE(rangeTable,curState,goTable)\
{E_RANG, sizeof(rangeTable)/sizeof(rangeTable[0]), rangeTable, goTable, curState, STATE_NOTEND},
#define MAP_STATE_SET(setString,curState,goTable)\
{E_SET, sizeof(setString)-1, (PCHAR_RANG)setString, goTable, curState, STATE_NOTEND},
#define BEGIN_STATE_MAP(tableName,className)\
CHAR_MAPITEM className::tableName[]={
#define END_STATE_MAP()\
{E_RANG,0,0,0,WORD_UNKNOWN},};
//////////////////////////////////////////////////////////////////////////
class HWordStream
{
//////////////////静态数据////////////////////////
static CHAR_RANG g_RangeLetter[];
static CHAR_RANG g_Range1_9[];
static CHAR_RANG g_Range0_9[];
static CHAR_RANG g_Range16[];
static CHAR_MAPITEM g_FloatTable[];
static CHAR_MAPITEM g_Num10Table[];
static CHAR_MAPITEM g_Num8Table[];
static CHAR_MAPITEM g_Num16Table[];
static CHAR_MAPITEM g_Num0Table[];
static CHAR_MAPITEM g_NameTable[];
static CHAR_MAPITEM g_NotTable[];
static CHAR_MAPITEM g_LessTable[];
static CHAR_MAPITEM g_BigerTable[];
static CHAR_MAPITEM g_SubTable[];
static CHAR_MAPITEM g_EQUTable[];
static CHAR_MAPITEM g_LFnTable[];
static CHAR_MAPITEM g_LFrTable[];
static CHAR_MAPITEM g_DivTable[];
static CHAR_MAPITEM g_ColonTable[];
static CHAR_MAPITEM g_NULL[];
/////////////////////////////////////////////////////
bool m_bHadBuf;
char m_BufChar;
HInputStream *m_pStream;
void BackOneChar(char c)
{
m_BufChar=c;
m_bHadBuf=true;
};
/////////////////////////////////////////////////////
protected:
unsigned long m_Row;
unsigned long m_Colum;
bool IsBacked(){return m_bHadBuf;};
char GetOneChar()
{
if(this->m_bHadBuf)//有一个缓冲
{
m_bHadBuf=(!m_bHadBuf);
return this->m_BufChar;
}
return this->m_pStream->GetOneCharater();
};
PCHAR_MAPITEM FindNextState(PCHAR_MAPITEM pMap,char c,WORDSTATE *newState);
public:
unsigned long getCurRow(){return m_Row;};
unsigned long getCurColum(){return m_Colum;};
void SetInputStream(HInputStream *pStream)
{
m_bHadBuf=false;
m_pStream=pStream;
this->m_Colum=1;
this->m_Row =1;
};
int GetOneWord(H_WORD &word);
HWordStream();
virtual ~HWordStream();
};
#endif // !defined(AFX_HCHARACTER_H__6BE6C332_4451_4122_AF31_8C4E14AAD84F__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -