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

原创 2016年06月01日 21:36:51

编译原理值之缀表达式生成与计算(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 查看。


前缀、中缀、后缀表达式

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

编译原理值后缀表达式生成与计算
  • qyvlik
  • qyvlik
  • 2016年06月01日 21:23
  • 1306

编译原理—中缀转后缀

zh.lex文件 %{ /* * 输入中缀表达式,输出后缀表达式 */ #include #include int yyerror(c...
  • LY_624
  • LY_624
  • 2016年04月20日 14:51
  • 719

编译原理实验(后缀表达式Postfix)

  • 2010年05月22日 14:23
  • 6KB
  • 下载

后缀表达式

对于一个算术表达式我们的一般写法是这样的 (3 + 4) × 5 - 6 这中写法是中序表达式 而后序表达式则是将运算符放在操作数的后面,如 3 4 + 5 × 6 - 可以看出后序表达式...
  • u012507347
  • u012507347
  • 2016年08月18日 21:47
  • 7812

图解后缀表达式的计算过程

为了解释后缀表达式的好处,我们先来看看,计算机如何应用后缀表达式计算出最终的结果20的。 后缀表达式:9 3 1-3*+ 10 2/+ 规则:从左到右遍历表达式的每个数字和...
  • yangquanhui1991
  • yangquanhui1991
  • 2016年08月11日 22:51
  • 9327

后缀表达式(3)——后缀表达式的计算,递归实现

有了博客后缀表达式(2)的分析,要实现后缀表达式的计算已经非常容易了。   首先,我们构造一个结构体。这个结构体表示后缀表达式中的一个元素。这个元素可能是运算符,也可能是运算元。这里我们假设运算符有加...
  • hedan2013
  • hedan2013
  • 2016年09月05日 16:33
  • 605

后缀表达式与解析算术表达式

首先说明,本文中的算术表达式只包括0-9数字的加减乘除,含括号。重点在用Java实现栈和中缀表达式转后缀表达式再计算表达式结果(商用计算器都是采用这种方法)。 首先说一下后缀表达式:我们常见的 1+...
  • MarkHo365
  • MarkHo365
  • 2012年12月07日 09:29
  • 3152

后缀表达式求值

#include #include "seqStack.h" using namespace std; class Calculator   //模拟一个简单的计算器。此计算器对键盘读入的后缀...
  • xiaogua1211
  • xiaogua1211
  • 2016年04月09日 15:40
  • 433

后缀表达式

题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。 如:3*(5–2)+7...
  • SSLGZ_yyc
  • SSLGZ_yyc
  • 2018年01月30日 21:04
  • 20

使用堆栈计算后缀表达式--java实现

后缀表达式相对于中缀表达式的优点: 1:不考虑运算优先级和括号。 2:从左到右单次扫描即可,时间复杂度O(1)。 注意: 堆栈是一种计算后缀表达式的理想数据结构,本例中笔者使用了java.ut...
  • u014088119
  • u014088119
  • 2014年04月02日 14:30
  • 1330
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译原理之后缀表达式生成与计算(2)
举报原因:
原因补充:

(最多只允许输入30个字)