c++ 计算器 语法实现

#include <bits/stdc++.h>

using namespace std;
//语法逻辑
//exp: factor
//| exp '+' factor
//| exp '-' factor
//;
//
//factor: term
//| factor '*' term
//| factor '/' term
//;
//
//term: NUMBER
//| '(' exp ')'
//| '-' term
//| '+' term
//;
//%%

int str_index = 0;
string cacl_str;

void skip_space() {
    while (cacl_str[str_index] == ' ') {
        ++str_index;
    }
}

void index_add() {
    //跳过无用的空格
    skip_space();
    ++str_index;
    skip_space();
}

char get_char() {
    skip_space();
    return cacl_str[str_index];
}

struct Node {
    bool tag;
    double num;

    Node(bool tagg, double numm) {
        tag = tagg;
        num = numm;
    }

    Node operator+(const Node &b) {

        Node node(this->tag & b.tag, this->num + b.num);
        return node;
    }

    Node operator-(const Node &b) {
        Node node(this->tag & b.tag, this->num - b.num);
        return node;
    }

    Node operator*(const Node &b) {

        Node node(this->tag & b.tag, this->num * b.num);
        return node;
    }

    Node operator/(const Node &b) {

        Node node(this->tag & b.tag, this->num / b.num);
        return node;
    }
};

//实现加减法
Node exp();

//实现乘除法
Node factor();

//获取括号中的值
Node term();

//获取一个数字
Node number();

Node exp() {

    Node node = factor();

    if (get_char() == '+') {
        index_add();
        Node node2 = exp();
        return node + node2;
    } else if (get_char() == '-') {
        index_add();
        Node node2 = exp();
        return node - node2;
    }
    return node;
}

Node factor() {
    Node node = term();
    if (get_char() == '*') {
        index_add();
        
        Node node2 = factor();
 
        return node * node2;
    } else if (get_char() == '/') {
        index_add();
        Node node2 = factor();
        return node / node2;
    }
    return node;
}

int read_num_char() {
    return cacl_str[str_index++] - '0';
}

Node number() {
    skip_space();
    if (cacl_str[str_index] >= '0' && cacl_str[str_index] <= '9') {
        int tem = 0;
        while (cacl_str[str_index] >= '0' && cacl_str[str_index] <= '9') {
            tem = tem * 10 + read_num_char();
        }
        return Node(true, tem);
    } else {
        return Node(false, 0);
    }
}

Node term() {
    Node node = number();
    if(!node.tag){
        if (get_char() == '(') {
            index_add();
            Node node1 = exp();
            if (get_char() == ')') {
                index_add();
                return node1;
            } else {
                return Node(false, 0);
            }
        }
        if (get_char() == '-') {
            index_add();
            Node node1 = term();
            //避免内部出错
            return Node(node1.tag, -node1.num);
        }
        if (get_char() == '+') {
            index_add();
            Node node1 = term();
            return node1;
        }
        return node;
    }
    return node;
}

int main() {
    cacl_str = "1 - + * 3";
    str_index = 0;
    Node pi = exp();
    if (!pi.tag) {
        cout << "错误" << endl;
    }
    cout << pi.num << endl;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值