消除左递归文法

一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。

  左递归分为直接左递归和间接左递归。
  直接左递归经过一次推导就可以看出文法存在左递归,如P→Pa|b。
  间接左递归侧需多次推导才可以看出文法存在左递归,如文法:S→Qc|c,Q→Rb|b,R→Sa|a有S =>Qc =>Rbc =>Sabc

消除直接左递归的方法:

  1、把所有产生式写成候选式形式。如A→Aa1|Aa2……|Aan|b1|b2……|bm。其中每个a都不等于ε,而第个b都不以A开头。
  2、变换候选式成如下形式:
  A→b1A’|b2A’……|bmA’
  A’ →a1A’|a2A’……|anA’|ε

  例1:文法E→E+T|T,T→T*F|F,F →(E)|id消除直接左递归后有:
  E→TE’,E’ →+TE’|ε,T→FT’,T’ →*FT’|ε,F→(E)|id

消除间接左递归的方法:

  要求文法不存在A 经过一次或多次能推导出A和不存在ε产生式(形如A→ε)。 
  1、以某种顺序排列非终结符

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文法左递归是指在文法中存在形如$A\rightarrow A\alpha$的产生式,这种产生式会导致递归调用,从而使得语法分析器无法正确地处理文法。 为了解决这个问题,我们需要将文法中的左递归进行消除。具体的方法是,对于形如$A\rightarrow A\alpha_1|\cdots|A\alpha_n|\beta_1|\cdots|\beta_m$的产生式,我们可以将其转化为$A\rightarrow\beta_1A'|\cdots|\beta_mA'$和$A'\rightarrow\alpha_1A'|\cdots|\alpha_nA'|\epsilon$的形式,其中$A'$是一个新的非终结符号。 下面是一个例子,展示如何将文法中的左递归进行消除: 原始文法: $S\rightarrow SAB|AB|a$ $A\rightarrow aA|\epsilon$ $B\rightarrow bB|\epsilon$ 消除左递归后的文法: $S\rightarrow AB S'|\epsilon$ $S'\rightarrow AB S'|\epsilon$ $A\rightarrow aA|\epsilon$ $B\rightarrow bB|\epsilon$ 这里,我们将原始文法中的$S\rightarrow SAB$转化为$S\rightarrow AB S'$,然后添加了一个新的非终结符号$S'$,用于处理递归调用。类似地,我们对$A$和$B$也进行了类似的处理。 最后,我们需要对文法进行压缩,以便于计算机程序进行处理。具体的方法是,我们可以将每个非终结符号用一个数字表示,然后将产生式中的非终结符号替换为对应的数字。例如,我们可以将$S$表示为0,$A$表示为1,$B$表示为2,那么上面的文法就可以表示为: 0->23 3|2|a 1->1a|ε 2->2b|ε 这样的文法就可以被计算机程序处理了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值