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

原创 2016年06月01日 21:23:16

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

文法参照上一篇编译原理之消除算术表达式文法的左递归

将算数表达式解析为后缀表达式是不少脚本语言的运行时的计算方案。

根据原文法:

expr -> expr + term     
      | expr - term     
      | term            

term -> term * factor   
      | term / factor   
      | factor          

factor -> ( expr )      
        | number        
        | id

我们先罗列出要实现的函数:

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

    void term(LexerStream* lexers)
    {
    }

    void factor(LexerStream* lexers)
    {
    }
};

其中的 LexerStream 为词素序列流。

再根据消除左递归的文法实现递归算法:

expr     -> term trest

trest    -> + term
          | - term
          | ε

term     -> factor frest

frest    -> * factor
          | / factor
          | ε

factor   -> NUMBER
          | ( expr )

先看未消除左递归的 expr 产生式和消除左递归 exprtrest 的产生式。原 expr 产生式本身是左递归的,所以在递归下降算法中是对应到一个内部循环。

所以先给出 expr 的实现:

void expr(LexerStream* lexers)
{
    term(lexers);
    while(lexers->current() == "+" || lexers->current() == "-") {

        string op = lexers->current();

        lexers->next();
        term(lexers);

        cout << op;     // PUSH
    }
}

其他产生式类似:

void term(LexerStream* lexers)
{
    factor(lexers);

    while(lexers->current() == "*" || lexers->current() == "/") {

        string op = lexers->current();

        lexers->next();
        factor(lexers);

        cout << op;     // PUSH
    }
}

void factor(LexerStream* lexers)
{
    string current = lexers->current();

    if(current == "(") {
        lexers->next();

        expr(lexers);
        lexers->next();

        string e = lexers->current();
        if(e != ")") {
            cout << "lost `(" << endl;
        }
    } else {
        cout << current;      // PUSH

        lexers->next();
    }
}

详细代码前往 LearnCompilers/HLL/calculator001 下载。

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

编译原理—中缀转后缀

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

利用栈结构生成后缀表达式

利用栈结构来构建后缀表达式 关于后缀表达式,推荐博客http://blog.csdn.net/antineutrino/article/details/6763722/ 博客中详细介绍了表达式的生成过...
  • xiaokang123456kao
  • xiaokang123456kao
  • 2017年01月05日 17:02
  • 335

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

编译原理值后缀表达式生成与计算(2)
  • qyvlik
  • qyvlik
  • 2016年06月01日 21:36
  • 1008

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

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

编译原理---四则运算表达式的计算简单实现

编译原理---四则运算表达式的计算简单实现
  • u010251278
  • u010251278
  • 2016年09月05日 19:17
  • 3429

编译原理之算术表达式文法的预测分析算法c实现

已知表达式文法:        E
  • u014771617
  • u014771617
  • 2014年10月11日 12:36
  • 1336

编译原理表达式运算-实现四则运算,赋值预算,变量赋值

  • 2008年12月11日 17:39
  • 990KB
  • 下载

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

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

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

后缀表达式相对于中缀表达式的优点: 1:不考虑运算优先级和括号。 2:从左到右单次扫描即可,时间复杂度O(1)。 注意: 堆栈是一种计算后缀表达式的理想数据结构,本例中笔者使用了java.ut...
  • u014088119
  • u014088119
  • 2014年04月02日 14:30
  • 1328

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

编译原理值后缀表达式生成与计算
  • qyvlik
  • qyvlik
  • 2016年06月01日 21:23
  • 1300
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译原理之后缀表达式生成与计算
举报原因:
原因补充:

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