左递归

编程入门 行业动态 更新时间:2024-10-23 16:18:41

左<a href=https://www.elefans.com/category/jswz/34/1771140.html style=递归"/>

左递归

空串产生式最常出现的情形——左递归的消除。

左递归是产生式的一种特殊形式。它的形式如下。

A→Aα

其中A是非终结符,而 α 是由终结符和非终结符组成的字符串。注意, α 不能是空串,否则产生式变为

A→A

没有任何意义。

左递归会对文法分析造成困扰。因为,根据产生式,我们可以不断进行如下推导。

A→→→→AαAααAααα...

这样的推导可以无限进行下去,如果不对字符串做全面的分析,根本不知道哪里是尽头。而我们做语法分析,希望观察前面一个字符就能判断接下来使用哪个产生式。只有这样才能避免回溯,提高效率。

消除左递归,已经有一般化的公式。

先考虑如下一个简单的例子。

例: 考虑如下两个产生式。

A→Aα
A→β

其中A是非终结符, α 和 β 非空,且 β 不以A开头。注意,对于文法中任何的非终结符,以它为左部的产生式不能全是左递归的。因为一个左递归函数,在自顶向下设计(前面几篇博文介绍的后缀表达式解析,以及去除注释,都是自顶向下设计。后面的博文会专门就这一问题展开讨论)中,左递归产生式对应着一个递归函数。而一个递归函数都需要有出口,即结束条件。而左递归产生式的出口,就是由非左递归产生式给出。

对于本例给出的这组产生式,可以转化为如下等价形式。

A→βR
R→αR
R→ϵ.

这两组产生式的等价性,我们不再证明。转化的主要思想是将左递归转化为右递归。这里仅声明一下,两组产生式等价的意义是指他们接受的字符序列的集合相同。

上面介绍的是一个左递归产生式,一个出口产生式的情形。在有的文法中可能有多个左递归产生式和出口产生式。

例: 对于如下一组包括左递归的产生式

A→Aα1A→Aα2A→Aα3A→β1A→β2

其等价产生式为

A→β1RA→β2RR→α1RR→α2RR→α3RR→ϵ

例: 更一般地,对于如下产生式组

A→Aαi,1≤i≤I,A→Aβj,1≤j≤J,

其等价产生式为

A→βjR1≤i≤I,1≤j≤JR→αiR,1≤i≤IR→ϵ

更多推荐

左递归

本文发布于:2023-06-26 22:08:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/901383.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:递归

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!