参考:https://blog.csdn.net/liyun123gx/article/details/19924993
- 左递归分为两种:
- 直接左递归:经过一次推导(直接看出来)的左递归式子,例如
-
(1)A→Aβ
- 间接左递归:经过若干次推导得到左递归式子
-
1)A→Bβ,B→Aα
消除左递归
- 1、消除直接左递归
-
a) 把直接左递归改写为右递归:
设有文法产生式:A→Aβ|γ
。其中β
非空,γ
不以A
打头。
可写为:A → γA'
A' → βA'|ε
一般情况下,假定关于A的产生式是:
A → Aα1| Aα2 |… |Aαm|β1|β2 |…|βn
其中,αi( 1 ≤ i ≤ m)
均不为空,βj(1 ≤ j ≤ n)
均不以A打头。
则消除直接左递归后改写为:
A→ β1A'| β2 A' |…| βnA'
A'→ α1A' | α2A' |…| αmA' |ε
案例
E → E + T | T
T → T * F | F
F → (E) | i
转换后:(记得多个ε
)
E → TE'
E' → +TE'| ε
T → FT'
T' → *FT' | ε
F → (E) | i
- 2、消除间接左递归
- 方法:对于间接左递归的消除需要先将间接左递归变为直接左递归,然后再按
a)
清除左递归。
案例
(1)A → aB
(2)A → Bb
(3)B → Ac
(4)B → d
- 若干次推导得到:
(1)B → aBc
(2)B → Bbc
(3)B → d
- 按
a)
方法消除左递归:
B → aBcB' | dB'
B' → bcB' | ε
- 再把原来其余的产生式A→aB,A→Bb加入,最终得到等价文法为:
(1) A → aB
(2) A → Bb
(3) B → (aBc|d)B'
(4) B' → bcB'| ε
还有一个万能方法,懒得看了
参考:https://blog.csdn.net/liyun123gx/article/details/19924993
标签:aB,Bb,递归,间接,编译,直接,消除 来源: https://blog.csdn.net/weixin_45787528/article/details/117922621
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。