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

📄 parser.h

📁 一个我的数据结构解题集合
💻 H
字号:
#ifndef PARSER_H__
#define PARSER_H__

#include <iostream>
#include <string>

#include "Vector.h"

using namespace std;

class Parser {		// 表达式分析器
private:
	typedef string::const_iterator Itor;
	string expr_;		// 保存需要分析的表达式的字符串表述
	Itor curr_;			// 当前位置
	Vector<Variable *> vars_;	// 保存已经读入的变量的地址
public:

	/* 构造函数, 参数为需要分析的表达式字符串expr, 
	 * 函数保存expr的一个拷贝, 并将当前位置指向该拷贝的开头.
	 */
	explicit Parser(string expr)
		: expr_(expr), curr_(expr_.begin())
		{}	// Parser(string)
		

	/* 重置表达式对象, 使其能够从头开始读取每个表达式项.
	 */
	void reset() {
		curr_ = expr_.begin();
	} // reset()

	/* 取得当前已经读入的变量的地址表
	 */
	const Vector<Variable *>& getVars() const {
		return vars_;
	} // getVars() const

	/* 取得下一个表达式项, 
	 * 其空间有本函数分配, 由客户端负责清理.
	 * 若表达式已空, 返回0; 若表达式有错误,
	 * 抛出std::invalid_argument异常
	 */
	Term *readNext() {
		while ( ( curr_ != expr_.end() ) && isspace(*curr_) )
			++curr_;								// 跳过空白字符

		if ( curr_ == expr_.end() ||
			 *curr_ == '\0' ) {						// 表达式结束
			return 0;
		} else
		if ( isalpha(*curr_) ) {					// 变量
			string buf;
			do {									// 读入变量名
				buf += *curr_;
				++curr_;
			} while ( isalpha(*curr_) || isdigit(*curr_) );
			
			for (int i=0; i<vars_.size(); ++i) {	// 查找变量是否已经存在
				if ( vars_[i]->toString() == buf )
					return vars_[i];
			}

			Variable *var = new Variable(buf);
			vars_.pushBack(var);
			return var;
		} else
		if ( isdigit(*curr_) || *curr_ == '.' ) {					// 数值
			double r = 0;
			sscanf(curr_, "%lf", &r);
			while ( !Operator::isOperator(*curr_) &&
					curr_ != expr_.end() &&
					*curr_ != '\0' )	// 跳到下一个运算符
				++curr_;
			return new Number(r);
		} else
		if ( Operator::isOperator(*curr_) ) {		// 运算符
			return new Operator(*curr_++);
		} else {									// 表达式有错误
			stringstream buf;
			buf << "Parser: Invalid expression\n"
				<< "\tOperation: readNext()\n"
				<< "\tExpression: " << expr_ << "\n"
				<< "\tError point: " << curr_
				<< endl;
			throw std::invalid_argument(buf.str());
		}
	} // readNext()

}; // Parser


#endif // PARSER_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -