编译原理之消除算术表达式文法的左递归

原创 2016年05月30日 23:58:29

编译原理之消除算术表达式文法的左递归

现在给定如下算术表达式文法:

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

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

factor -> ( expr )      
        | number        
        | id            

很明显,上诉文法中,exprterm 都有左递归。

为了消除上诉文法的左递归,可以将插入新的非终结符号,转换为右递归。

先假定有如下产生式(α 和 β 是不以 A 开头的终结符号/非终结符号):

A -> A α | β

因为 A -> β,所以有 A -> β ε

因为 A -> β 以及 A -> A α ,所以有 A -> β α

又因为 A -> β εA -> β α

所以有 A -> β (α | ε)

R -> α | ε,既有 R -> αR | ε

最终文法如下:

A -> β R
R -> αR | ε

让我们回到具体的算术表达式的文法上:

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

因为 expr -> term,所以又 expr -> term ε

因为 expr -> term 以及 expr -> expr + term ,所以有 expr -> term + term

又因为 expr -> term εexpr -> term + term

所以有 expr -> term ( + term | ε)

R -> + term | ε,既有 R -> + term R | ε

得出文法如下:

expr -> term R

R    -> + term
      | - term
      | ε

更加详细的消除左递归可以看看龙书。

下面给出本文给定算术表达式消除左递归后的文法:

expr     -> term trest

trest    -> + term
          | - term
          | ε

term     -> factor frest

frest    -> * factor
          | / factor
          | ε

factor   -> NUMBER
          | ( expr )
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

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

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

消除文法左递归-编译原理

消除文法左递归-编译原理

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

编译原理(三) 消除文法的左递归

算法的功能 对于任意上下文无关的文法消除左递归 问题分析 一、产生式直接消除左递归 形如P→Pα|β可以通过直接消除转化为:  P→βP′P′→αP′|ϵ ...

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

已知表达式文法:        E

编译原理动手实操,用java实现编译器-算术表达式及其语法解析器的实现

大家在参考本节时,请先阅读以下博文,进行预热: http://blog.csdn.net/tyler_download/article/details/50708807   本节代码下载地址: htt...

编译原理学习笔记(二)左递归消除、递归下降

正则文法与上下文无关文法文法规则是定义在一个字母表或符号集之上。在正则表达式中,这些符号通常就是字符,而在文法规则中,符号就是这些token。基本正则表达式规则有3种运算: choice(由竖线元字符...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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