模仿exprtk写一个简易版的解析函数
时间: 2024-10-02 17:02:17 浏览: 19
模仿ExprTk(一个C++库,用于解析表达式)创建一个简易版的解析函数,我们可以使用栈数据结构来模拟基本的算术运算。这里是一个简单的示例,仅支持加减乘除操作:
```cpp
#include <iostream>
#include <stack>
#include <string>
// 定义基本的运算符优先级
enum class Operator { Plus = 1, Minus = 2, Times = 3, Divide = 4 };
class SimpleParser {
public:
double parse(const std::string& expression) {
std::stack<double> numbers;
std::stack<Operator> operators;
for (char c : expression) {
if (isdigit(c)) {
double num = 0;
while (isdigit(c)) {
num = num * 10 + c - '0';
++c;
}
numbers.push(num);
} else if (c == '+' || c == '-' || c == '*' || c == '/') {
operators.push(c == '+' ? Operator::Plus
: c == '-' ? Operator::Minus
: c == '*' ? Operator::Times
: Operator::Divide);
} else if (c == '(') {
// 处理左括号,暂存当前运算结果
numbers.push(numbers.top());
numbers.pop();
} else if (c == ')') {
// 处理右括号,直到找到对应的左括号
while (!operators.empty() && operators.top() != Operator::Plus) {
apply_operator(numbers, operators);
operators.pop();
}
if (!operators.empty()) {
numbers.push(numbers.top());
numbers.pop(); // 移除左括号
}
}
}
// 处理剩余的操作符
while (!operators.empty()) {
apply_operator(numbers, operators);
operators.pop();
}
return numbers.top();
}
private:
void apply_operator(std::stack<double>& numbers, std::stack<Operator>& operators) {
double right = numbers.top();
numbers.pop();
while (!operators.empty()) {
double left = numbers.top();
numbers.pop();
switch (operators.top()) {
case Operator::Plus:
numbers.push(left + right);
break;
case Operator::Minus:
numbers.push(left - right);
break;
case Operator::Times:
numbers.push(left * right);
break;
case Operator::Divide:
if (right != 0)
numbers.push(left / right);
else
throw std::runtime_error("Division by zero");
break;
}
operators.pop();
}
}
};
int main() {
SimpleParser parser;
try {
std::cout << "Result: " << parser.parse("2 + 3 * (4 - 1)") << "\n";
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << '\n';
}
return 0;
}
```
这个简化版的解析器只能处理单级运算,没有括号嵌套或优先级处理,但展示了基础思路。如果你想增加复杂度,例如处理更复杂的表达式、括号匹配和优先级,就需要引入更多的逻辑和数据结构。