1 typedef struct文法g由多條產生式組成,出現在產生式左部的非終結符,會指向乙個p文法陣列,每乙個陣列元素對應乙個程式的右部,這樣的結構顯然是對文法進行了壓縮的pp;6 typedef struct
gg;
1、 掃瞄文法,先將間接做遞迴轉換成直接左遞迴
2、 借助如下公式,消除直接左遞迴
對形如這樣的程式
a->aα1|aα2|aα3| aαn|..|ρ1|ρ2|….| ρn
轉換成如下形式
a->ρ1a'|ρ2a'|ρ3a'
a'->α1a'|α2a'|....|ε
輸入
1322 s qc|c
32 q rb|b
42 r sa|a
1 #include 2 #include(這裡用2代替r',用kong代表空字元)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 }
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 ...