其他分享
首页 > 其他分享> > 左递归左递归消除

左递归左递归消除

作者:互联网


直接左递归的消除

P  →  bP';
P'  →  aP' | ε;
P  →  YP';        比如:P  →  abP' | b P'
P'  →  XP' | ε;   比如: P'  →  abcP' | ε

间接左递归的消除

// 1.把文法G的所有非终结符按任意顺序排列,并编号
[P1,P2,……,Pn]

// 2.按上面的排列顺序,对这些非终结符进行遍历
for(int i = 1; i <= n; ++i) {
  
  for(int j = 1; i <= i - 1; ++j) {
    // 3.将当前处理的非终结符中的序号小于等于它的非终结符按规则3)进行替换(序号大于的按规则2)处理)
    2)、3)
  }
  // 4.消除i序号的非终结符的直接左递归(如果存在的话)
  1)
}

// 5.删除其中不可达的非终结符(从开始符开始,无法再推出的非终结符)

例题

1)把文法G的所有非终结符按任意顺序排列,并编号

R、Q、S

2)按上面的排列顺序,对这些非终结符进行遍历
3)将当前处理的非终结符中的序号小于等于它的非终结符按规则3)进行替换(序号大于的按规则2)处理)

R:
R的右部中的非终结符有S;
S的下标大于R,可以暂时不处理;
所以此时R改写为:R  →  Sa | a

----------------------------------------------
Q:
Q的右部中的非终结符有R;
R的下标小于Q,将R的右部替换进来;
所以此时Q改写为:Q  →  Sab | ab | b;
S的下标大于Q,可以暂时不处理;
所以此时Q改写为:Q  →  Sab | ab | b;

-----------------------------------------
S:
S的右部中的非终结符有Q;
Q的下标小于S,将Q的右部替换进来;
所以此时S改写为:S  →  Sabc |abc | bc | c
S的下标等于S,可以暂时不处理;
所以此时S改写为:S  →  Sabc |abc | bc | c

4)消除i序号的非终结符的直接左递归(如果存在的话)

S  →  Sabc |abc | bc | c
∴  X = abc,Y = abc | bc | c
∴ 直接消除左递归的结果是:
S  →  abcS' | bcS' | cS'
S'  → abcS' | ε

5)删除其中不可达的非终结符,这里就是Q、R了

∴ 最终消除左递归的结果是

S  →  abcS' | bcS' | cS'
S'  → abcS' | ε


作者:冯强计算机考研
链接:https://www.jianshu.com/p/7cd310e6c74e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:abc,下标,递归,右部,终结符,消除
来源: https://www.cnblogs.com/cfas/p/12783574.html