https://github.com/leozhang1/QtInterpreter这个链接 unaryopnode.cpp代码 展示
时间: 2023-10-10 12:15:20 浏览: 75
以下是 `unaryopnode.cpp` 的代码:
```cpp
#include "unaryopnode.h"
UnaryOpNode::UnaryOpNode(Token op, std::shared_ptr<Node> expr)
: m_op(op), m_expr(expr)
{
}
UnaryOpNode::~UnaryOpNode()
{
}
std::string UnaryOpNode::toString() const
{
return m_op.getValue() + m_expr->toString();
}
Type UnaryOpNode::getType() const
{
if (m_op.getType() == Token::NOT)
{
return Type::BOOL;
}
return m_expr->getType();
}
std::shared_ptr<Value> UnaryOpNode::eval(Environment &env)
{
std::shared_ptr<Value> val = m_expr->eval(env);
if (m_op.getType() == Token::NOT)
{
return std::make_shared<BoolValue>(!val->asBool());
}
else if (m_op.getType() == Token::MINUS)
{
if (val->getType() == Type::INT)
{
return std::make_shared<IntValue>(-val->asInt());
}
else if (val->getType() == Type::FLOAT)
{
return std::make_shared<FloatValue>(-val->asFloat());
}
}
throw std::runtime_error("Unsupported unary operator: " + m_op.getValue());
}
```
`UnaryOpNode` 类是表示一元操作符节点的类,其构造函数接收一个 `Token` 对象和一个指向 `Node` 对象的智能指针,并将它们保存在成员变量中。`toString()` 函数返回节点的字符串表示形式,其中包括操作符和表达式的字符串表示形式。`getType()` 函数返回节点的类型,如果操作符是逻辑非,则返回 `BOOL` 类型,否则返回表达式的类型。`eval()` 函数对节点进行求值,如果操作符是逻辑非,则求出表达式的值并返回其取反的布尔值,如果操作符是负号,则求出表达式的值并返回其相反数的整数或浮点数值,否则抛出异常。
阅读全文