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

📄 parser.cpp

📁 使用实际的编译算法的计算器 包括词法、文法分析过程
💻 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 + -