📄 scan.cpp
字号:
currentToken=ERROR;
break; //处理第三类记号(需后续状态),
}
}
return;
};
/******************************************************
** 遇上ID型记号,有可能为保留字,在保留字数组
** m_ReservedWords进行搜索,若没有找到,则为普通ID。
******************************************************/
TokenType CScaner::reservedLookup(char *ps_pwords){
int i;
for(i=0;i<MAXRESERVED;i++)
if(!strcmp(ps_pwords, m_ReservedWords[i].m_chwords))
return m_ReservedWords[i].m_Enwords;
return ID;
}
/***********************************************
** 以下十个函数为第三类记号的后续处理函数。
************************************************/
/******************************************************************处理函数起始处**********/
void CScaner::OnInassigh(void){ //
m_chGetchar=getNextChar(); //
if(m_chGetchar=='=') currentToken=EQ; //一个'='后还是'=',则为等于号。 //
else{ //
currentToken=ASSIGH; //否则为赋值号。 //
ungetNextChar(); //为赋值号,则后续符号无需保存。 //
m_isave=FALSE; //
} //
m_Enstate=DONE; //
}; //
//
void CScaner::OnIncomment(void){ //
m_chGetchar=getNextChar(); //
char chLasttwo[2]; //
if(m_chGetchar!='*'){ //
m_isave=TRUE; //
ungetNextChar(); //
ungetNextChar(); //
m_chGetchar=getNextChar(); //
currentToken=OVER; //
m_Enstate=DONE; //
} //
else{ //
do{ //
chLasttwo[0]=getNextChar(); //
chLasttwo[1]=getNextChar(); //
ungetNextChar(); //
}while(chLasttwo[0]!='*' || chLasttwo[1]!='/'); //注释内容则完全跳过。 //
getNextChar(); //
m_isave=FALSE; //
m_Enstate=START; //
} //
} //
//
void CScaner::OnInnum(void){ //
m_chGetchar=getNextChar(); //
if(!isdigit(m_chGetchar) && m_chGetchar!='.'){ //
ungetNextChar(); //
m_Enstate=DONE; //
currentToken = NUM; //
m_isave=FALSE; //
} //
}; //
//
void CScaner::OnInchar(void){ //
static int iflag=0; //
m_chGetchar=getNextChar(); //
if(iflag==0){ //
iflag=1; //
return;} //
else if(iflag==1){ //
iflag=0; //
m_Enstate=DONE; //
if(m_chGetchar!='\'') //
currentToken = ERROR; //
else currentToken =CCHAR; //
m_isave=FALSE; //
return; //
} //
} //
//
void CScaner::OnInid(void){ //
m_chGetchar=getNextChar(); //
if(!isalpha(m_chGetchar) && !isdigit(m_chGetchar) && m_chGetchar!='_'){ //
ungetNextChar(); //
m_Enstate=DONE; //
currentToken = ID; //
m_isave=FALSE; //
} //
}; //
//
void CScaner::OnInneq(void){ //
m_chGetchar=getNextChar(); //
if(m_chGetchar!='='){ //
ungetNextChar(); //
currentToken = NOT; //
m_isave=FALSE; //
} //
else //
currentToken = NEQ; //
m_Enstate=DONE; //
} //
//
void CScaner::OnInand(void){ //
m_chGetchar=getNextChar(); //
if(m_chGetchar!='&'){ //
ungetNextChar(); //
currentToken = ERROR; //
m_isave=FALSE; //
} //
else //
currentToken = AND; //
m_Enstate=DONE; //
} //
//
void CScaner::OnInor(void){ //
m_chGetchar=getNextChar(); //
if(m_chGetchar!='|'){ //
ungetNextChar(); //
currentToken = ERROR; //
m_isave=FALSE; //
} //
else //
currentToken = OR; //
m_Enstate=DONE; //
} //
//
/********************************************* //
** DONE为结束状态,无需任何附加处理(其实这个 //
** 函数根本不会被执行到,为便于理解而加入。 //
*********************************************/ //
void CScaner::OnDone(void){ //
}; //
//
void CScaner::OnInnlt(void){ //
m_chGetchar=getNextChar(); //
if(m_chGetchar!='='){ //
ungetNextChar(); //
currentToken = GT; //
m_isave=FALSE; //
} //
else //
currentToken = NLT; //
m_Enstate=DONE; //
} //
//
void CScaner::OnInngt(void){ //
m_chGetchar=getNextChar(); //
if(m_chGetchar!='='){ //
ungetNextChar(); //
currentToken = LT; //
m_isave=FALSE; //
} //
else //
currentToken = NGT; //
m_Enstate=DONE; //
} //
/***************************************************************************处理函数结束处*/
/*******************************************************
** 打印扫描结果,这个函数在只进行源文件扫描时被执行。
*********************************************************/
void CScaner::printToken(TokenType pa_currentToken, char* pa_tokenString){
if(pa_currentToken>=IF && pa_currentToken<=FLOAT){
cout<<"reserved word: "<<pa_tokenString<<endl;
return;}
switch(pa_currentToken){
case ASSIGH: cout<<"="<<endl; break;
case EQ: cout<<"=="<<endl; break;
case NEQ: cout<<"!="<<endl; break;
case LT: cout<<"<"<<endl; break;
case GT: cout<<">"<<endl; break;
case NLT: cout<<">="<<endl; break;
case NGT: cout<<"<="<<endl; break;
case AND: cout<<"&&"<<endl; break;
case OR: cout<<"||"<<endl; break;
case NOT: cout<<"!"<<endl; break;
case PLUS: cout<<"+"<<endl; break;
case MINUS: cout<<"-"<<endl; break;
case TIMES: cout<<"*"<<endl; break;
case OVER: cout<<"/"<<endl; break;
case LLPAREN: cout<<"("<<endl; break;
case RLPAREN: cout<<")"<<endl; break;
case LGPAREN: cout<<"{"<<endl; break;
case RGPAREN: cout<<"}"<<endl; break;
case SEMI: cout<<";"<<endl; break;
case COMMA: cout<<","<<endl; break;
case COLON: cout<<":"<<endl; break;
case ENDFILE: cout<<"EOF"<<endl; break;
case NUM:
cout<<"NUM, val="<<pa_tokenString<<endl;
break;
case ID:
cout<<"ID, name="<<pa_tokenString<<endl;
break;
case CCHAR:
cout<<"char, val="<<pa_tokenString<<endl;
break;
case ERROR:
cout<<"ERROR: "<<pa_tokenString<<endl;
break;
default:
cout<<"Unknown token: "<<pa_currentToken<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -