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

原创 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 )
版权声明:本文为博主原创文章,未经博主允许不得转载。

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

算法的功能对于任意上下文无关的文法消除左递归问题分析一、产生式直接消除左递归形如P→Pα|βP\rightarrow P \alpha | \beta可以通过直接消除转化为: P→βP′P′→αP′...
  • qq_24451605
  • qq_24451605
  • 2015年11月28日 08:45
  • 7543

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

正则文法与上下文无关文法文法规则是定义在一个字母表或符号集之上。在正则表达式中,这些符号通常就是字符,而在文法规则中,符号就是这些token。基本正则表达式规则有3种运算: choice(由竖线元字符...
  • thisinnocence
  • thisinnocence
  • 2016年09月27日 00:29
  • 1495

文法左递归的消除(直接左递归和间接左递归)

一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。   左递归分为直接左递归和间接左递归。   直接左递归经过一次推导就可以看出文法存在左递归,如...
  • u010204038
  • u010204038
  • 2014年12月15日 12:03
  • 4470

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

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

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

消除文法左递归-编译原理
  • qq78442761
  • qq78442761
  • 2017年01月01日 17:30
  • 508

LL1文法消除左递归编译原理mfc实现(完整版)

  • 2011年07月01日 17:19
  • 15.03MB
  • 下载

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

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

编译原理之ll(1)文法判断和左递归问题

LL(1)文法判断和左递归
  • jxch____
  • jxch____
  • 2017年12月02日 11:17
  • 230

编译原理用C++消除左递归

  • 2009年06月04日 11:42
  • 3KB
  • 下载

2016年秋季《编译原理》课程实验(2014级)表达式语法分析——递归子程序法

#include #include #include #include #include using namespace std; int num; stack A; stack B; int f(c...
  • RIPwangh
  • RIPwangh
  • 2016年11月15日 11:27
  • 1290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译原理之消除算术表达式文法的左递归
举报原因:
原因补充:

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