文章目录
- 自上而下分析
- 面临的问题
- 文法左递归问题
- 回溯问题
- 构造不带回溯的自上而下分析算法
- 消除文法的左递归
自上而下分析
自上而下就是从文法的开始符号出发,向下推导,推出句子。
面临的问题
文法左递归问题
左递归在语法分析过程中可能会导致无限循环和低效的分析。
回溯问题
回溯问题在语法分析过程中可能会出现,特别是在递归下降分析中。它指的是当选择一条产生式进行推导时,如果无法匹配当前输入符号或导致错误结果,就需要回溯到上一步选择另一条产生式进行尝试。这种回溯的过程可能导致效率低下和冗余的分析。
构造不带回溯的自上而下分析算法
消除文法的左递归
见诸于产生式的直接左递归:假定关于非终结符P的规则为
接下来我我们可以把P的规则等价的改写非直接左递归的形式:
了解了左递归的消除,我们也可以思考一下左递归会把分析带入无限循环中,右递归会吗?
在编译原理中,左递归确实可能导致分析进入无限循环,而右递归不会导致这个问题。这是由于在语法分析过程中,左递归会导致左递归展开时产生的推导过程无限地循环下去,而右递归则没有这个问题。
具体来说,左递归是指在文法规则中,产生式的右侧直接或间接地引用了同一个非终结符作为其左侧的非终结符。例如,考虑以下文法规则:
A -> Aα | β
其中,A是非终结符,α和β是文法符号(可以是终结符或非终结符)。这是一个左递归的文法规则,因为A在右侧出现。
当使用递归下降分析或类似的自顶向下分析方法时,对于左递归的产生式,如果没有适当的处理,会导致分析进入无限循环,无法终止。这是因为在展开左递归时,每次展开都会再次遇到同一个非终结符A,从而形成循环。
为了解决左递归带来的无限循环问题,可以使用递归下降分析中的左递归消除技术,如左因子提取或左递归消除算法。
相比之下,右递归不会导致无限循环的问题。右递归是指产生式右侧的非终结符出现在产生式的末尾,例如:
A -> αA | β
在自顶向下的分析过程中,右递归可以顺利地向下展开,因为每次展开都会使得右递归的非终结符出现在产生式的末尾,从而逐步减少产生式的长度,最终终止分析过程。
总结而言,左递归在编译原理中可能导致分析进入无限循环,而右递归不会引起这个问题。因此,在语法分析的过程中,对于左递归的处理是非常重要的。
理论了解之后,我们看个习题对消除左递归进一步认识一下:
上面所说的都是直接消除左递归,显而易见,有直接消除左递归法就有间接消除左递归法,如何间接消除左递归呢?