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

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

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

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 )
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值