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

📄 scaner.cpp

📁 一个多线程
💻 CPP
字号:
#include "stdafx.h"
#include "scaner.h"

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

CScanner::CScanner(LPSTR lpFileName)
{
	m_bClosed=FALSE;
	m_csFileName= new char[strlen(lpFileName)+1];
	strcpy(m_csFileName,lpFileName);
	m_iLine=m_iBufferLen=m_iWordLen=m_iBufferPointer=0;
	hFile=INVALID_HANDLE_VALUE;
	pSubScan=NULL;
}

CScanner::~CScanner()
{
	delete [] m_csFileName;
	if(hFile!=INVALID_HANDLE_VALUE)Close();

}

//a identy ,a operation,or a parentheses,a control letter,a spacebar
LPSTR CScanner::Read(DWORD & dwID)
{
	BYTE btFirst=GetFirstChar();//skip char small than 0x20 but \n,\26;//space,\r
	switch(btFirst){
	case '\n':
		dwID=WORD_ENDOFLINE;
		strcpy((char *)m_pWord,"\n");
		m_iLine++;
		return (LPSTR)m_pWord;
	case 0x1b:
		Close();
		dwID=WORD_ENDOFFILE;
		return NULL;
	case '(':
		dwID=WORD_LEFTSMLBRACKET;
		strcpy((char *)m_pWord,"(");
		return (LPSTR)m_pWord;
	case ')':
		dwID=WORD_RIGHTSMLBRACKET;
		strcpy((char *)m_pWord,")");
		return (LPSTR)m_pWord;
	case '[':
		strcpy((char *)m_pWord,"[");
		dwID=WORD_LEFTMIDBRACKET;
		return (LPSTR)m_pWord;
	case ']':
		strcpy((char *)m_pWord,"]");
		dwID=WORD_RIGHTMIDBRACKET;
		return (LPSTR)m_pWord;
	case '{':
		strcpy((char *)m_pWord,"{");
		dwID=WORD_LEFTGIBBRACKET;
		return (LPSTR)m_pWord;
	case '}':
		strcpy((char *)m_pWord,"}");
		dwID=WORD_RIGHTBIGBRACKET;
		return (LPSTR)m_pWord;
	case ',':
		strcpy((char *)m_pWord,",");
		dwID=WORD_COMMA;
		return (LPSTR)m_pWord;
	case ':':
		strcpy((char *)m_pWord,":");
		dwID=WORD_COLON;
		return (LPSTR)m_pWord;
	case ';':
		strcpy((char *)m_pWord,";");
		dwID=WORD_SEMICOLON;
		return (LPSTR)m_pWord;
	case '\'':
		ClearWord();
		btFirst=GetChar();
		while(btFirst!='\''&&btFirst!='\r'&&btFirst!='\n'&&btFirst!=0x1b){
			PutWord(btFirst);
			btFirst=GetChar();
		}
		if(btFirst!='\''){
			BackChar();
		}
		EndWord();
		dwID=WORD_STRING;
		return (LPSTR)m_pWord;
	default:
		ClearWord();
		if(btFirst>=0x30&&btFirst<=0x39||btFirst>='a'&&btFirst<='z'||btFirst>='A'&&btFirst<='Z'||btFirst=='_'||btFirst=='#'){
			BOOL bHasDot=FALSE;
			PutWord(btFirst);
			btFirst=GetChar();
			while(btFirst>=0x30&&btFirst<=0x39||btFirst>='a'&&btFirst<='z'||btFirst>='A'&&btFirst<='Z'||btFirst=='_'||btFirst=='.'||btFirst=='#'){
				if(btFirst=='.')bHasDot=TRUE;
				PutWord(btFirst);
				btFirst=GetChar();
			};
			BackChar();
			EndWord();
			if(m_pWord[0]>=(BYTE)'0'&&m_pWord[0]<=(BYTE)'9'){
				if(bHasDot)
					dwID=WORD_FLOAT;
				else
					dwID=WORD_UINT;
			}
			else{
				if(m_pWord[0]=='#'){
					dwID=WORD_COMPILE;
				}
				else {
					dwID=WORD_IDENTY;
				}
			}
			return (LPSTR)m_pWord;
		}
		else {
			CString cs="=>+<!@$%^&*-/?|\\";
			PutWord(btFirst);
			char ccc=btFirst;
			btFirst=GetChar();
			if(btFirst!='='&&ccc=='='){
				BackChar();
			}
			else if(cs.Find(btFirst,0)<0){
				BackChar();
			}
			else{
				PutWord(btFirst);
			}
			EndWord();
			dwID=WORD_OPERATOR;
			return (LPSTR)m_pWord;
		}
	};
}

char szSubName[128]="";
LPSTR lpReturn="\n";

LPSTR CScanner::ReadWord(LPSTR & pName,DWORD & dwID,int & iline)
{
	if(pSubScan){
		LPSTR p1=pSubScan->ReadWord(pName,dwID,iline);
		if(dwID==WORD_ENDOFFILE){
			dwID=WORD_ENDOFLINE;
			delete pSubScan;
			pSubScan=NULL;
			pName=szSubName;
			return lpReturn;
		}
		else if(dwID!=WORD_NOFILEOPENED){
			return p1;
		}
		delete pSubScan;
		pSubScan=NULL;
	}
	pName=m_csFileName;
	if(m_bClosed){
		dwID=WORD_ENDOFFILE;
		iline=0xffffffff;
		return NULL;
	}
	else if(hFile==INVALID_HANDLE_VALUE){ 
		if(Open()){ 
			iline=m_iLine;
			LPSTR lpstr=Read(dwID);
			if(dwID==WORD_OPERATOR){
				if(lpstr[0]=='/'){
					if(lpstr[1]=='/'){
						while(dwID!=WORD_ENDOFLINE&&dwID!=WORD_ENDOFFILE){
							lpstr=Read(dwID);
						}
						return lpstr;
					}
					else if(lpstr[1]=='*'){
						lpstr=Read(dwID);
						while(dwID!=WORD_ENDOFFILE){
							if(dwID==WORD_OPERATOR){
								if(!strncmp(lpstr,"*/",2)){
									return ReadWord(pName,dwID,iline);
								}
							}
							lpstr=Read(dwID);
						}
						return lpstr;
					}
				}
			}
			return lpstr;
		}
		else {
			dwID=WORD_NOFILEOPENED;
			iline=0xffffffff;
			return NULL;
		}
	}
	else {
		iline=m_iLine;
		LPSTR lpstr=Read(dwID);
		if(dwID==WORD_OPERATOR){
			if(lpstr[0]=='/'){
				if(lpstr[1]=='/'){
					while(dwID!=WORD_ENDOFLINE&&dwID!=WORD_ENDOFFILE){
						lpstr=Read(dwID);
					}
					return lpstr;
				}
				else if(lpstr[1]=='*'){
					lpstr=Read(dwID);
					while(dwID!=WORD_ENDOFFILE){
						if(dwID==WORD_OPERATOR){
							if(!strncmp(lpstr,"*/",2)){
								return ReadWord(pName,dwID,iline);
							}
						}
						lpstr=Read(dwID);
					}
					return lpstr;
				}
			}
		}
		return lpstr;
	}
}

BOOL CScanner::OpenSubScan(char * szName)
{
	if(pSubScan){
		return pSubScan->OpenSubScan(szName);
	}
	else{
		pSubScan=new CScanner(szName);
		if(!pSubScan->Open()){
			delete pSubScan;
			pSubScan=NULL;
			return FALSE;
		}
		else{
			return TRUE;
		}
	}
}

BOOL CScanner::Open()
{
	hFile=::CreateFile((LPSTR)(LPCTSTR)m_csFileName,
		GENERIC_READ, 
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if(hFile!=INVALID_HANDLE_VALUE){
		m_pBuffer=new BYTE[MAXBUFFERLEN];
		m_pWord=new BYTE[MAXWORDLEN];
		ASSERT(m_pWord);
		ASSERT(m_pBuffer);
		m_bClosed=false;
		m_iBufferPointer=0;
		m_iBufferLen=0;
		return TRUE;
	}
	else {
		return FALSE;
	}
}

void CScanner::Close()
{
	if(hFile!=INVALID_HANDLE_VALUE){
		CloseHandle(hFile);
		hFile=INVALID_HANDLE_VALUE;
		delete [] m_pBuffer;
		delete [] m_pWord;
		m_pWord=NULL;
		m_pBuffer=NULL;
		m_bClosed=true;
	}
}

BYTE CScanner::GetFirstChar()
{
	BYTE btChar=GetChar();
	while(btChar<=0x20&&btChar!=0x1b&&btChar!='\n')btChar=GetChar();
	return btChar;
}

BYTE CScanner::GetChar()
{
	if(m_iBufferLen==0||m_iBufferPointer>=m_iBufferLen){
		if(!::ReadFile(hFile,m_pBuffer,MAXBUFFERLEN,(DWORD *)&m_iBufferLen,NULL))m_iBufferLen=0;
		if(m_iBufferLen==0){
			m_pBuffer[0]=0x1b;
			m_iBufferLen=m_iBufferPointer=1;
			return 0x1b;
		}
		else {
			m_iBufferPointer=1;
			return m_pBuffer[0];
		}
	}
	else {
		return m_pBuffer[m_iBufferPointer++];
	}
}

⌨️ 快捷键说明

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