编译原理之后缀表达式生成与计算(2)

编译原理值之缀表达式生成与计算(2)

上一篇编译原理值后缀表达式生成与计算只提供了生成后缀表达式的方法,这篇文章提供如何计算后缀表达式。

先给 Parser 这个类一个 code 字段,用来保存后缀表达式:

class Parser {
public:
    void expr(LexerStream* lexers)
    {
    }

    void term(LexerStream* lexers)
    {
    }

    void factor(LexerStream* lexers)
    {
    }
    vector<string> code;
};

然后在每个解析函数中合适的地方压入值。具体代码前往 LearnCompilers/HLL/calculator001 查看。

class Calculator {
public:
    string result() {

        string current;

        do {
            current = code.front();
            code.erase(code.begin());

            if(!isOperator(current)) {
                calc.push(current);
            } else {

                string arg0 = calc.top();
                calc.pop();
                string arg1 = calc.top();
                calc.pop();

                calc.push(calcula(current, arg0, arg1));
            }
        } while(!code.empty());

        return calc.top();
    }

    bool isOperator(const string& s) ;
    string calcula(const string& operation, const string& arg0, const string& arg1);
    string add(const string& arg0, const string& arg1)
    string sub(const string& arg0, const string& arg1);
    string mul(const string& arg0, const string& arg1);
    string div(const string& arg0, const string& arg1);

    vector<string> code;
    stack<string> calc;
}

具体看 result 函数。先取出后缀表达式中的 token,如果是操作符,就从运算结果栈中取出两个 token,然后进行计算,将获取到的结果压入运算结果栈中;如果不是操作符,就压入运算结果栈中。

具体代码前往 LearnCompilers/HLL/calculator001 查看。


前缀、中缀、后缀表达式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值