📄 parser.cpp
字号:
#include"StdAfx.h"
#include"parser.h"
MYSPC_BEGIN //or "using namespace my_space;"(if in a separate implementation file) or use prefix such as "my_space::PSTATE my_space::Parser::Parse()"
PSTATE Parser::Parse()
{
try{
_re=_Exp();
return SUCCESS;
}
catch(PSTATE excp){
return excp;
}
}
void Parser::_Match(DSTATE expTok)
{
if(_curTok==expTok){
(_scPtr->_ts).pop();
if(!(_scPtr->_ts).empty())
_curTok=(_scPtr->_ts).front();
}
else throw MAERROR;
}
double Parser::_Exp()
{
double temp=_Term();
if(_curTok!=PLUS && _curTok!=MINUS && _curTok!=RP && _curTok!=EOI) // Follow(term) contains RP and EOI;
throw MAERROR;
while(_curTok==PLUS || _curTok==MINUS)
switch(_curTok){
case PLUS:
_Match(PLUS);
temp+=_Term();
break;
case MINUS:
_Match(MINUS);
temp-=_Term();
break;
}
return temp;
}
double Parser::_Term()
{
double temp=_Factor();
while(_curTok==MUL||_curTok==DIV)
switch(_curTok){
case MUL:
_Match(MUL);
temp*=_Factor();
break;
case DIV:
_Match(DIV);
double t;
if((t=_Factor())!=0)
temp/=t;
else throw DBZ;
break;
}
return temp;
}
double Parser::_Factor()
{
double temp;
bool posiFlag=true;
if(_curTok==POSI) _Match(POSI);
else if(_curTok==NEG) {_Match(NEG);posiFlag=false;}
switch(_curTok){
case NAT: case FLOAT:
_Match(_curTok);
temp=posiFlag ? (_scPtr->_vs).front() : (0-(_scPtr->_vs).front());
(_scPtr->_vs).pop();
break;
case LP:
_Match(LP);
temp=posiFlag ? _Exp() : (0-_Exp());
_Match(RP);
break;
default: throw MAERROR;
}
return temp;
}
MYSPC_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -