?? parser.h
字號(hào):
#ifndef PARSER_H__
#define PARSER_H__
#include <iostream>
#include <string>
#include "Vector.h"
using namespace std;
class Parser { // 表達(dá)式分析器
private:
typedef string::const_iterator Itor;
string expr_; // 保存需要分析的表達(dá)式的字符串表述
Itor curr_; // 當(dāng)前位置
Vector<Variable *> vars_; // 保存已經(jīng)讀入的變量的地址
public:
/* 構(gòu)造函數(shù), 參數(shù)為需要分析的表達(dá)式字符串expr,
* 函數(shù)保存expr的一個(gè)拷貝, 并將當(dāng)前位置指向該拷貝的開頭.
*/
explicit Parser(string expr)
: expr_(expr), curr_(expr_.begin())
{} // Parser(string)
/* 重置表達(dá)式對(duì)象, 使其能夠從頭開始讀取每個(gè)表達(dá)式項(xiàng).
*/
void reset() {
curr_ = expr_.begin();
} // reset()
/* 取得當(dāng)前已經(jīng)讀入的變量的地址表
*/
const Vector<Variable *>& getVars() const {
return vars_;
} // getVars() const
/* 取得下一個(gè)表達(dá)式項(xiàng),
* 其空間有本函數(shù)分配, 由客戶端負(fù)責(zé)清理.
* 若表達(dá)式已空, 返回0; 若表達(dá)式有錯(cuò)誤,
* 拋出std::invalid_argument異常
*/
Term *readNext() {
while ( ( curr_ != expr_.end() ) && isspace(*curr_) )
++curr_; // 跳過空白字符
if ( curr_ == expr_.end() ||
*curr_ == '\0' ) { // 表達(dá)式結(jié)束
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) { // 查找變量是否已經(jīng)存在
if ( vars_[i]->toString() == buf )
return vars_[i];
}
Variable *var = new Variable(buf);
vars_.pushBack(var);
return var;
} else
if ( isdigit(*curr_) || *curr_ == '.' ) { // 數(shù)值
double r = 0;
sscanf(curr_, "%lf", &r);
while ( !Operator::isOperator(*curr_) &&
curr_ != expr_.end() &&
*curr_ != '\0' ) // 跳到下一個(gè)運(yùn)算符
++curr_;
return new Number(r);
} else
if ( Operator::isOperator(*curr_) ) { // 運(yùn)算符
return new Operator(*curr_++);
} else { // 表達(dá)式有錯(cuò)誤
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__
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -