📄 parser.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 + -