📄 scanner.cpp
字号:
#include<cctype>
#include<stdlib.h>
#include"StdAfx.h"
#include"scanner.h"
MYSPC_BEGIN
using std::string;
bool Scanner::Scan()
{
_PreScan();
DSTATE s;
while(s=_NextTok())
_ts.push(s);
return _pos==_slen; //see : "case'$': _pos++; return EOI;"
}
void Scanner::_PreScan()
{
int i=0;
if((*_inPtr)[0]=='+')
(*_inPtr)[i++]='@';
if((*_inPtr)[0]=='-')
(*_inPtr)[i++]='#';
while(i<_slen-1){
if( (*_inPtr)[i]=='(')
if((*_inPtr)[i+1]=='+')
(*_inPtr)[++i]='@';
else
if((*_inPtr)[i+1]=='-')
(*_inPtr)[++i]='#';
i++;
}
}
DSTATE Scanner::_NextTok()
{
DSTATE s=START;
string vbuf;
while(_pos<_slen){
switch (s){
case START:
if( isdigit((*_inPtr)[_pos]) ) { s=BNAT; vbuf+=(*_inPtr)[_pos++];}
else
switch ((*_inPtr)[_pos]){
case'+': _pos++; return PLUS;
case'-': _pos++; return MINUS;
case'*': _pos++; return MUL;
case'/': _pos++; return DIV;
case'(': _pos++; return LP;
case')': _pos++; return RP;
case'@': _pos++; return POSI;
case'#': _pos++; return NEG;
case'$': _pos++; return EOI; // _pos should equal to _slen after this rather than _slen-1
default: return DERROR;
}
break;
case BNAT:
if( isdigit((*_inPtr)[_pos]) ) vbuf+=(*_inPtr)[_pos++];
else
if((*_inPtr)[_pos]=='.') { s=MFLOAT; vbuf+=(*_inPtr)[_pos++];}
else{_vs.push(atof(vbuf.c_str())); return NAT;}
break;
case MFLOAT:
if( isdigit((*_inPtr)[_pos]) ) { s=BFLOAT; vbuf+=(*_inPtr)[_pos++];}
else return DERROR;
break;
case BFLOAT:
if( isdigit((*_inPtr)[_pos]) ) vbuf+=(*_inPtr)[_pos++];
else{ _vs.push(atof(vbuf.c_str())); return FLOAT;}
break;
}
}
return DERROR;
}
MYSPC_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -