消除文法左遞迴的演算法

2022-01-22 04:37:37 字數 1953 閱讀 9012

1 typedef struct

pp;6 typedef struct

gg;

文法g由多條產生式組成,出現在產生式左部的非終結符,會指向乙個p文法陣列,每乙個陣列元素對應乙個程式的右部,這樣的結構顯然是對文法進行了壓縮的

1、 掃瞄文法,先將間接做遞迴轉換成直接左遞迴

2、 借助如下公式,消除直接左遞迴

對形如這樣的程式

a->aα1|aα2|aα3| aαn|..|ρ1|ρ2|….| ρn

轉換成如下形式

a->ρ1a'|ρ2a'|ρ3a'

a'->α1a'|α2a'|....|ε

輸入

132

2 s qc|c

32 q rb|b

42 r sa|a

1 #include 2 #include 

3 #include

45 typedef struct

pp;10 typedef struct

gg;17

18int

main()

41else45}

46 str[sp]='\0'

;47 g.p[i].value[c] = (char *) malloc(sizeof(char)*255

);48

strcpy(g.p[i].value[c],str);

4950 printf("

%c=>%s|%s\n

",g.p[i].key,g.p[i].value[0],g.p[i].value[1

]);51}52

53for(i=0;i)80}

8182}83

}84//消除直接左遞迴

85//

掃瞄pi.key 為產生式右部的所有產生式

86for(j=0;j);

95 strcat(g.p[i].value[m],aci); //

這裡a'直接已a的ascii碼值減32表示

96 }else

;102 strcat(g.p[g.pcount].value[0

],aci);

103 g.p[g.pcount].value[1] = (char *) malloc(sizeof(char)*255

);104 strcpy(g.p[g.pcount].value[1],"

kong");

105 g.p[g.pcount].count = 2

;106 g.p[i].value[j] =null;

107 g.pcount++;

108}

109}

110break

;111

}112

}113

114}

115116 printf("

\n-----------------------\n");

117//

列印文法

118for(i=0;i)

125 printf("\n"

);126

}127

}128

free

(g.p);

129return0;

130 }

(這裡用2代替r',用kong代表空字元)

c 消除左遞迴文法 遞迴(Leetcode)

遞迴對於我來說,典型的一看就會,一寫就廢 希望這章總結能給我一點啟發 by the way,我的文章你快點接收吧!侵刪 這個題解我竟無從下筆,擷取幾個非常清楚的圖來解釋吧 1 如果l1 val l2 val,那麼mergetwolist l2 next l1 2 反之,mergetwolist l2...

編譯原理 三 消除文法的左遞迴

對於任意上下文無關的文法消除左遞迴形如p p 可以通過直接消除轉化為 p p p p 有時候雖然形式上產生式沒有遞迴,但是因為形成了環,所以導致進行閉包運算後出現左遞迴,如下 s qc c q rb br sa a 雖不具有左遞迴,但s q r都是左遞迴的,因為經過若干次推導有 消除左遞迴演算法 f...

消除左遞迴

參考關健young的部落格,左遞迴形式為 1 a a a vn,v 2 a b b a a b vn,v 稱其為左遞迴。其中可以採取修改左遞迴為右遞迴 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 ...