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