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

📄 nodes.cpp

📁 表达式计算expression evaluate expression evaluate expression evaluate
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    // Determine variable name
    ::std::string ident = parser[start].GetIdentifier();
    
    // Make sure it is not a constant
    if(vlist->IsConstant(ident))
    {
        ConstantAssignException e(ident);
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[v1].GetEnd());
        throw(e);
    }
        
    // Get address
    double *vaddr = vlist->GetAddress(ident);
    
    if(vaddr == 0)
    {
        // If it does not already exist, try to create it
        vlist->Add(ident);
        vaddr = vlist->GetAddress(ident);
    }
        
    if(vaddr == 0)
    {
        NotFoundException e(ident);
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[start].GetEnd());
        throw(e);
    }
        
    // Parse the node (will throw if it can not parse)
    auto_ptr<CNode> n(parser.ParseRegion(v1 + 1, end));
    
    // Set data
    m_var = vaddr;
    m_rhs = n.release();
}    
    

// Add node
//------------------------------------------------------------------------------

// Constructor
CAddNode::CAddNode(CExpression *expr) : CNode(expr), m_lhs(0), m_rhs(0)
{
}
    
// Destructor
CAddNode::~CAddNode()
{
    // Free child nodes
    delete m_lhs;
    delete m_rhs;
}
        
// Evaluate
double CAddNode::DoEvaluate()
{
    return m_lhs->Evaluate() + m_rhs->Evaluate();        
}
    
// Parse
void CAddNode::Parse(CParser &parser, CParser::size_type start, CParser::size_type end, CParser::size_type v1)
{
    // Check some basic syntax
    if(v1 <= start || v1 >= end)
    {
        CSyntaxException e;
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[end].GetEnd());
        throw(e);
    }
        
    // Parse sides
    auto_ptr<CNode> left(parser.ParseRegion(start, v1 - 1));
    auto_ptr<CNode> right(parser.ParseRegion(v1 + 1, end));
    
    m_lhs = left.release();
    m_rhs = right.release();
}
    
// Subtract node
//------------------------------------------------------------------------------

// Constructor
CSubtractNode::CSubtractNode(CExpression *expr) : CNode(expr), m_lhs(0), m_rhs(0)
{
}
    
// Destructor
CSubtractNode::~CSubtractNode()
{
    // Free child nodes
    delete m_lhs;
    delete m_rhs;
}
        
// Evaluate
double CSubtractNode::DoEvaluate()
{
    return m_lhs->Evaluate() - m_rhs->Evaluate();        
}
    
// Parse
void CSubtractNode::Parse(CParser &parser, CParser::size_type start, CParser::size_type end, CParser::size_type v1)
{
    // Check some basic syntax
    if(v1 <= start || v1 >= end)
    {
        CSyntaxException e;
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[end].GetEnd());
        throw(e);
    }
        
    // Parse sides
    auto_ptr<CNode> left(parser.ParseRegion(start, v1 - 1));
    auto_ptr<CNode> right(parser.ParseRegion(v1 + 1, end));
    
    m_lhs = left.release();
    m_rhs = right.release();
}    
    
// Multiply node
//------------------------------------------------------------------------------

// Constructor
CMultiplyNode::CMultiplyNode(CExpression *expr) : CNode(expr), m_lhs(0), m_rhs(0)
{
}
    
// Destructor
CMultiplyNode::~CMultiplyNode()
{
    // Free child nodes
    delete m_lhs;
    delete m_rhs;
}
        
// Evaluate
double CMultiplyNode::DoEvaluate()
{
    return m_lhs->Evaluate() * m_rhs->Evaluate();        
}
    
// Parse
void CMultiplyNode::Parse(CParser &parser, CParser::size_type start, CParser::size_type end,
        CParser::size_type v1)
{
    // Check some basic syntax
    if(v1 <= start || v1 >= end)
    {
        CSyntaxException e;
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[end].GetEnd());
        throw(e);
    }
        
    // Parse sides
    auto_ptr<CNode> left(parser.ParseRegion(start, v1 - 1));
    auto_ptr<CNode> right(parser.ParseRegion(v1 + 1, end));
    
    m_lhs = left.release();
    m_rhs = right.release();
}    
    
// Divide node
//------------------------------------------------------------------------------

// Constructor
CDivideNode::CDivideNode(CExpression *expr) : CNode(expr), m_lhs(0), m_rhs(0)
{
}
    
// Destructor
CDivideNode::~CDivideNode()
{
    // Free child nodes
    delete m_lhs;
    delete m_rhs;
}
        
// Evaluate
double CDivideNode::DoEvaluate()
{
    double r2 = m_rhs->Evaluate();
    
    if(r2 != 0.0)
    {
        return m_lhs->Evaluate() / r2;
    }
    else
    {
        throw(DivideByZeroException());
    }
}
    
// Parse
void CDivideNode::Parse(CParser &parser, CParser::size_type start, CParser::size_type end, CParser::size_type v1)
{
    // Check some basic syntax
    if(v1 <= start || v1 >= end)
    {
        CSyntaxException e;
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[end].GetEnd());
        throw(e);
    }
        
    // Parse sides
    auto_ptr<CNode> left(parser.ParseRegion(start, v1 - 1));
    auto_ptr<CNode> right(parser.ParseRegion(v1 + 1, end));
    
    m_lhs = left.release();
    m_rhs = right.release();
}    
    
// Negate node
//------------------------------------------------------------------------------

// Constructor
CNegateNode::CNegateNode(CExpression *expr) : Node(expr), m_rhs(0)
{
}
    
// Destructor
CNegateNode::~CNegateNode()
{
    // Free child nodes
    delete m_rhs;
}
        
// Evaluate
double CNegateNode::DoEvaluate()
{
    return -(m_rhs->Evaluate());        
}
    
// Parse
void CNegateNode::Parse(CParser &parser, CParser::size_type start, CParser::size_type end, CParser::size_type v1)
{
    // Check some basic syntax
    if(start != v1 || v1 >= end)
    {
        CSyntaxException e;
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[end].GetEnd());
        throw(e);
    }
        
    // Parse sides
    auto_ptr<CNode> right(parser.ParseRegion(v1 + 1, end));
    
    m_rhs = right.release();
}
    
// Exponent node
//------------------------------------------------------------------------------

// Constructor
CExponentNode::CExponentNode(CExpression *expr) : Node(expr), m_lhs(0), m_rhs(0)
{
}
    
// Destructor
CExponentNode::~CExponentNode()
{
    // Free child nodes
    delete m_lhs;
    delete m_rhs;
}
        
// Evaluate
double CExponentNode::DoEvaluate()
{
    errno = 0;
    
    double result =  pow(m_lhs->Evaluate(), m_rhs->Evaluate());
    
    if(errno)
    {
        throw(CMathException("^"));
    }       
    return result;        
}
    
// Parse
void CExponentNode::Parse(CParser &parser, CParser::size_type start, CParser::size_type end, CParser::size_type v1)
{
    // Check some basic syntax
    if(v1 <= start || v1 >= end)
    {
        CSyntaxException e;
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[end].GetEnd());
        throw(e);
    }
        
    // Parse sides
    auto_ptr<CNode> left(parser.ParseRegion(start, v1 - 1));
    auto_ptr<CNode> right(parser.ParseRegion(v1 + 1, end));
    
    m_lhs = left.release();
    m_rhs = right.release();
}    
    
// Variable node
//------------------------------------------------------------------------------

// Constructor
CVariableNode::CVariableNode(CExpression *expr) : CNode(expr), m_var(0)
{
}
    
// Destructor
CVariableNode::~CVariableNode()
{
}
        
// Evaluate
double CVariableNode::DoEvaluate()
{
    return *m_var;        
}
    
// Parse
void CVariableNode::Parse(CParser &parser, CParser::size_type start, CParser::size_type end, CParser::size_type v1)
{
    // Check some basic syntax
    if(start != end)
    {
        CSyntaxException e;
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[end].GetEnd());
        throw(e);
    }
        
    // Get value list
    CValueList *vlist = m_expr->GetValueList();
    if(vlist == 0)
    {
        CNoValueListException e;
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[start].GetEnd());
        throw(e);
    }
    
    // Get name
    ::std::string ident = parser[start].GetIdentifier();
    
    // Get address
    double *vaddr = vlist->GetAddress(ident);
    
    if(vaddr == 0)
    {
        // If it does not already exist, try to create it
        vlist->Add(ident);
        vaddr = vlist->GetAddress(ident);
    }
        
    if(vaddr == 0)
    {
        CNotFoundException e(ident);
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[start].GetEnd());
        throw(e);
    }
        
    // Set information
    m_var = vaddr;
}            
    
// Value node
//------------------------------------------------------------------------------

// Constructor
CValueNode::CValueNode(CExpression *expr) : CNode(expr), m_val(0)
{
}
    
// Destructor
CValueNode::~CValueNode()
{
}
        
// Evaluate
double CValueNode::DoEvaluate()
{
    return m_val;        
}
    
// Parse
void CValueNode::Parse(CParser &parser, CParser::size_type start, CParser::size_type end, CParser::size_type v1)
{
    // Check basic syntax
    if(start != end)
    {
        CSyntaxException e;
        
        e.SetStart(parser[start].GetStart());
        e.SetEnd(parser[end].GetEnd());
        throw(e);
    }
        
    // Set info
    m_val = parser[start].GetValue();
}    

⌨️ 快捷键说明

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