ʵÓñê×¼
±àÒëÔÀíʵÑ鱨¸æ
Ò»£®LL(1)ÎÄ·¨·ÖÎö
1.Éè¼ÆÒªÇó
£¨1£©¶ÔÊäÈëÎÄ·¨£¬ËüÄÜÅжÏÊÇ·ñΪLL(1)ÎÄ·¨£¬ÈôÊÇ£¬Ôòת£¨2£©£»·ñÔò±¨´í²¢
ÖÕÖ¹£»
£¨2£©ÊäÈëÒÑÖªÎÄ·¨£¬ÓɳÌÐò×Ô¶¯Éú³ÉËüµÄLL(1)·ÖÎö±í£»
£¨3£©¶ÔÓÚ¸ø¶¨µÄÊäÈë´®£¬Ó¦ÄÜÅжÏʶ±ð¸Ã´®ÊÇ·ñΪ¸ø¶¨ÎÄ·¨µÄ¾äÐÍ¡£
2.·ÖÎö
¸Ã³ÌÐò¿É·ÖΪÈçϼ¸²½£º £¨1£©¶ÁÈëÎÄ·¨ £¨2£©ÅжÏÕýÎó
£¨3£©ÈôÎÞÎó£¬ÅжÏÊÇ·ñΪLL(1)ÎÄ·¨ £¨4£©ÈôÊÇ£¬¹¹Ôì·ÖÎö±í£»
£¨5£©ÓÉ×Ü¿ØËã·¨ÅжÏÊäÈë·ûºÅ´®ÊÇ·ñΪ¸ÃÎÄ·¨µÄ¾äÐÍ¡£
3.Á÷³Ìͼ
Îݸ´óÈ«
ÊÇLL(1)ÎÄ·¨£¿ ÓÐЧ£¿ ¶ÁÈëÎÄ·¨ ¿ªÊ¼ ÊÇ ÊÇ ÅжϾäÐÍ ±¨´í ½áÊø ʵÓñê×¼
4.Ô´³ÌÐò
/******************************************* Óï·¨·ÖÎö³ÌÐò
×÷Õߣºxxx ѧºÅ£ºxxx
********************************************/ #include
/*******************************************/
int count=0; /*·Ö½âµÄ²úÉúʽµÄ¸öÊý*/
int number; /*ËùÓÐÖÕ½á·ûºÍ·ÇÖÕ½á·ûµÄ×ÜÊý*/ char start; /*¿ªÊ¼·ûºÅ*/ char termin[50]; /*ÖÕ½á·ûºÅ*/ char non_ter[50]; /*·ÇÖÕ½á·ûºÅ*/ char v[50]; /*ËùÓзûºÅ*/ char left[50]; /*×ó²¿*/ char right[50][50]; /*ÓÒ²¿*/
char first[50][50],follow[50][50]; /*¸÷²úÉúʽÓÒ²¿µÄFIRSTºÍ×󲿵ÄFOLLOW¼¯ºÏ*/ char first1[50][50]; /*ËùÓе¥¸ö·ûºÅµÄFIRST¼¯ºÏ*/ char select[50][50]; /*¸÷µ¥¸ö²úÉúʽµÄSELECT¼¯ºÏ*/
char f[50],F[50]; /*¼Ç¼¸÷·ûºÅµÄFIRSTºÍFOLLOWÊÇ·ñÒÑÇó¹ý*/ char empty[20]; /*¼Ç¼¿ÉÖ±½ÓÍÆ³ö^µÄ·ûºÅ*/
char TEMP[50]; /*ÇóFOLLOWʱ´æ·Åijһ·ûºÅ´®µÄFIRST¼¯ºÏ*/ int validity=1; /*±íʾÊäÈëÎÄ·¨ÊÇ·ñÓÐЧ*/ int ll=1; /*±íʾÊäÈëÎÄ·¨ÊÇ·ñΪLL(1)ÎÄ·¨*/ int M[20][20]; /*·ÖÎö±í*/
char choose; /*Óû§ÊäÈëʱʹÓÃ*/ char empt[20]; /*Çó_emp()ʱʹÓÃ*/ char fo[20]; /*ÇóFOLLOW¼¯ºÏʱʹÓÃ*/
/******************************************* ÅжÏÒ»¸ö×Ö·ûÊÇ·ñÔÚÖ¸¶¨×Ö·û´®ÖÐ
********************************************/ int in(char c,char *p) {
int i;
if(strlen(p)==0)
Îݸ´óÈ«
ʵÓñê×¼ }
/******************************************* µÃµ½Ò»¸ö²»ÊÇ·ÇÖÕ½á·ûµÄ·ûºÅ
********************************************/ char c() { }
/******************************************* ·Ö½âº¬ÓÐ×óµÝ¹éµÄ²úÉúʽ
********************************************/ void recur(char *point)
{ /*ÍêÕûµÄ²úÉúʽÔÚpoint[]ÖÐ*/ int j,m=0,n=3,k;
char temp[20],ch;
ch=c(); /*µÃµ½Ò»¸ö·ÇÖÕ½á·û*/ k=strlen(non_ter); non_ter[k]=ch; non_ter[k+1]='\\0';
for(j=0;j<=strlen(point)-1;j++) {
if(point[n]==point[0])
{ /*Èç¹û¡®|¡¯ºóµÄÊ×·ûºÅºÍ×ó²¿Ïàͬ*/
for(j=n+1;j<=strlen(point)-1;j++) {
while(point[j]!='|'&&point[j]!='\\0')
temp[m++]=point[j++]; left[count]=ch;
memcpy(right[count],temp,m); right[count][m]=ch; right[count][m+1]='\\0'; m=0; count++;
char c='A';
c++;
while(in(c,non_ter)==1)
return(c); { }
return(0);
if(p[i]==c)
return(1); /*ÈôÔÚ£¬·µ»Ø1*/ if(i==strlen(p))
return(0); /*Èô²»ÔÚ£¬·µ»Ø0*/
for(i=0;;i++)
Îݸ´óÈ«
ʵÓñê×¼ }
/******************************************* ·Ö½â²»º¬ÓÐ×óµÝ¹éµÄ²úÉúʽ
********************************************/ void non_re(char *point) {
int m=0,j;
char temp[20]; }
} else
{ /*Èç¹û¡®|¡¯ºóµÄÊ×·ûºÅºÍ×󲿲»Í¬*/
left[count]=ch; right[count][0]='^'; right[count][1]='\\0'; count++;
for(j=n;j<=strlen(point)-1;j++) {
if(point[j]!='|')
temp[m++]=point[j]; else }
{
left[count]=point[0];
memcpy(right[count],temp,m); right[count][m]=ch; right[count][m+1]='\\0'; }
printf(\m=0;
}
if(point[j]=='|') { }
n=j+1; break;
count++;
left[count]=point[0];
memcpy(right[count],temp,m); right[count][m]=ch;
right[count][m+1]='\\0'; count++; }
m=0;
Îݸ´óÈ«