编译原理期末速成-自上而下分析、消除文法的左递归问题

自上而下分析

自上而下就是从文法的开始符号出发,向下推导,推出句子。

在这里插入图片描述

面临的问题

文法左递归问题

左递归在语法分析过程中可能会导致无限循环和低效的分析。

回溯问题

回溯问题在语法分析过程中可能会出现,特别是在递归下降分析中。它指的是当选择一条产生式进行推导时,如果无法匹配当前输入符号或导致错误结果,就需要回溯到上一步选择另一条产生式进行尝试。这种回溯的过程可能导致效率低下和冗余的分析。

构造不带回溯的自上而下分析算法

消除文法的左递归

见诸于产生式的直接左递归:假定关于非终结符P的规则为在这里插入图片描述

在这里插入图片描述

接下来我我们可以把P的规则等价的改写非直接左递归的形式:

在这里插入图片描述
在这里插入图片描述

了解了左递归的消除,我们也可以思考一下左递归会把分析带入无限循环中,右递归会吗

在编译原理中,左递归确实可能导致分析进入无限循环,而右递归不会导致这个问题。这是由于在语法分析过程中,左递归会导致左递归展开时产生的推导过程无限地循环下去,而右递归则没有这个问题。

具体来说,左递归是指在文法规则中,产生式的右侧直接或间接地引用了同一个非终结符作为其左侧的非终结符。例如,考虑以下文法规则:

A -> Aα | β

其中,A是非终结符,α和β是文法符号(可以是终结符或非终结符)。这是一个左递归的文法规则,因为A在右侧出现。

当使用递归下降分析或类似的自顶向下分析方法时,对于左递归的产生式,如果没有适当的处理,会导致分析进入无限循环,无法终止。这是因为在展开左递归时,每次展开都会再次遇到同一个非终结符A,从而形成循环。

为了解决左递归带来的无限循环问题,可以使用递归下降分析中的左递归消除技术,如左因子提取或左递归消除算法。

相比之下,右递归不会导致无限循环的问题。右递归是指产生式右侧的非终结符出现在产生式的末尾,例如:

A -> αA | β

在自顶向下的分析过程中,右递归可以顺利地向下展开,因为每次展开都会使得右递归的非终结符出现在产生式的末尾,从而逐步减少产生式的长度,最终终止分析过程。

总结而言,左递归在编译原理中可能导致分析进入无限循环,而右递归不会引起这个问题。因此,在语法分析的过程中,对于左递归的处理是非常重要的。

理论了解之后,我们看个习题对消除左递归进一步认识一下:

在这里插入图片描述

上面所说的都是直接消除左递归,显而易见,有直接消除左递归法就有间接消除左递归法,如何间接消除左递归呢?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢靠窗坐.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值