µ±Ç°Î»ÖãºÊ×Ò³ > ±àÒëÔÀíʵÑ鱨¸æ3-LL(1)ÎÄ·¨¹¹Ôì
}
}
}
gp->P[i - 1].insert(0, 1, ch_i); for (; h <= s; h++) { }
gp->P[m - 1] += \;
gp->P[i - 1].erase(gp->P[i - 1].size() - 1, 1);
if (flagpos[h]) { }
splitstr[h] += newWord;
gp->P[i - 1] = gp->P[i - 1] + splitstr[h] + \;
simplify(gp); //»¯¼òÎÞÓõIJúÉúʽ
ÌáÈ¡×óÒò×Ó£¨°üÀ¨¸¨Öúº¯Êý£©£º
//¶Ô×Ö·û´®Êý×éÅÅÐò
void str_sort(string *str, int num) { }
/*×Óº¯Êý£¬ÌáÈ¡×óÒò×Ó*/
void remove_left_gene(struct grammar *gp) {
char ch, newWord;
for (rule_a = 0; rule_a < m; rule_a++) {
int bre = -1; int oldpo = 0; int num = 0, ps = 3; string str[30],restr[30];
//ǰÕßÓÃÓÚÅжϣ¬ÐèÒª±£³ÖÔÑù£¬ºóÕßÓÃÓÚ¶ÔÓй«
//·Ö¸îÌæ»»ºóµÄ²úÉúʽ
//±éÀúËùÓвúÉúʽ
//±ê¼ÇÒѶԲúÉúʽ½øÐйý×óÒò×ÓµÄÌáÈ¡
int rule_a, i, j, k, l, matchnum,oldmatchnum, resize,size; int i, j;
for (i = 0; i < num; i++) { }
for (j = i + 1; j < num; j++) { }
if (str[i] > str[j])
str[i].swap(str[j]);
¹²×óÒò×ӵĺòÑ¡½øÐÐÌáÈ¡£¬¿É±ä
while (ps != gp->P[rule_a].size() + 1) { }
str_sort(str, num); str_sort(restr, num);
//¶ÔËùÓкòÑ¡°´ASCIIÂë½øÐÐÅÅÐò£¬ÒÔ±ãÓÚ¼ò
str[num] = strsplit(gp->P[rule_a], ps); restr[num] = str[num]; ps = ps + str[num].size() + 1; num++;
»¯¶Ô¹«¹²×óÒò×ÓµÄÅжϣ¬Ö»ÐèÏȶÔÇ°ÃæºòÑ¡ÅжÏ
int ca_i; string Pa = \;
Pa.insert(0, 1, gp->Vn[rule_a]);
for (ca_i = 0; ca_i < num; ca_i++) { //¶ÔÅÅÐòºóµÄºòÑ¡½øÐÐÖØ×é²¢´æÈëÎÄ·¨ }
gp->P[rule_a] = Pa; int ipo = 0;
ipo = 0; size = 0; resize = 0; oldmatchnum = 0; int i_s = str[i].size(); for (j = 0; j < i_s; j++) { }
/*Óй«¹²×óÒò×ӵĴ¦Àí¹ý³Ì*/
if (matchnum != oldmatchnum || j == i_s) {
bre ++;
string match, repstr, can, newP; match = str[i].substr(0, j);
//»ñÈ¡¹«¹²×óÒò×Ó
matchnum = 0; ch = str[i][j]; int kf = num;
for (k = i + 1; k < num && k < kf; k++) { //¶ÔiÖ®ºóµÄºòÑ¡½øÐÐÅжϣ¬ÊÇ·ñÓÐÓëi¶ÔÓ¦ }
if (j == 0) { } else { }
if (oldmatchnum != matchnum) break;
//ÅжÏÊÇ·ñÓй«¹²×óÒò×ÓÊÇiµÄµÚÒ»¸ö×Ö·ûµÄ
if (str[k][j] == ch) { } else { }
break; matchnum++;
//Óй«¹²×óÒò×Ó
//¶ÔºòÑ¡µÄÖð¸ö×Ö·û±éÀú
//±ê¼Ç³ýÁ˱¾Éí£¬Óм¸¸öºòÑ¡Óй«¹²×óÒò×Ó
//¸¨ÖúÃâ³ý¶ÔÒÑÅжϹýÓÐ×óÒò×ӵĺòÑ¡µÄ±éÀú
//±éÀúºòÑ¡
for (i = 0; i < num; i++,i += ipo) {
if (ca_i == num - 1) else
Pa += str[ca_i] + \; Pa += str[ca_i];
µÄ¹«¹²×óÒò×Ó
Çé¿ö£¬ÓÐÔòÌØ±ð´¦Àí
if (matchnum == 0)
break;
else { oldmatchnum = matchnum; kf = i + 1 + oldmatchnum; }
}
}
}
}
newWord = GetWord(gp->Vn); gp->Vn[m] = newWord; m++; newP = \;
newP.insert(0, 1, newWord); repstr = match + newWord; int renum = num; if (bre > 0) { }
//µÃµ½ÐµķÇÖÕ½á·û
//½«Ð·ÇÖÕ½á·û´æÈëÎÄ·¨
//µÃµ½Òª±»Ìæ»»µÄÓй«¹²×óÒò×ÓµÄËùÓкòÑ¡
//Èô¶Ôͬһ²úÉúʽ»¹´æÔÚÁíÒ»¸ö¹«¹²×óÒò×Ó£¨Ö®Ç°
ÌáÈ¡¹ýÒ»´Î×óÒò×Ó£©£¬Ðè½øÐÐÌØ±ð´¦Àí
size = resize = 0; renum = 0; ps = 3;
while (ps != gp->P[rule_a].size() + 1) { }
//·Ö¸î±ä»¯ºó
µÄ²úÉúʽ
restr[renum] = strsplit(gp->P[rule_a], ps); ps = ps + restr[renum].size() + 1; renum++;
/*½«ÒѾÌáÈ¡¹ý×óÒò×ÓµÄÒÔºòѡΪµ¥Î»µÄ×Ö·û´®ÖØÐÂ×éºÏ³É²úÉúʽ£¨°üÀ¨Ð²úÉúfor (l = 0; l <= i - oldpo + oldmatchnum; l++) { }
gp->P[rule_a].replace(resize + 3, size + oldmatchnum, repstr); //Ô²úÉúʽÒÔÌæ»»µÄ·½if (i + 1 + oldmatchnum > num) { break; } else oldpo = ipo = oldmatchnum;
if (l >= i - oldpo) { } else { }
resize += restr[l].size(); resize++;
size += restr[l].size(); can = restr[l].substr(j); if (can == \)
can = \;
if (l == i - oldpo + oldmatchnum) newP += can; else newP = newP + can + \; gp->P[m - 1] = newP;
ʽ£©*/
ʽ½øÐиıä
4¡¢ Ö÷³ÌÐò´úÂ룻
#include
struct grammar { };
int m = 0, n = 0;
char GetBC(FILE* fpi) { }
/*
ÕûÐͺ¯Êý£¬¶ÁÈëÒ»ÐвúÉúʽ·ÖÎö³öÎÄ·¨³ÉÔ±£¬²ÎÊý·Ö±ðÊÇÊäÈëÎı¾µÄÎļþÖ¸Õë¡¢ÎÄ·¨
µÚ¼¸ÐеIJúÉúʽ
*/
½á¹¹ÌåµÄÖ¸Õë
void scanP(FILE* fpi,struct grammar *gp) {
char ch; string str; if (feof(fpi))
//´æÈëÒ»Ìõ²úÉúʽ //µ½´ïÎļþβÔò·µ»Ø
//¶ÁÈë²úÉúʽ×󲿵ķÇÖÕ½á·û
//½«·ÇÖÕ½á·û´æÈë½á¹¹Ìå
return;
char ch; do {
ch = fgetc(fpi); } while (ch == ' '); return ch;
//×Óº¯Êý£¬ÓÃÓÚ¶Áȡһ¸ö·Ç¿Õ¸ñ×Ö·û
//È«¾Ö±äÁ¿£¬·Ö±ð±íʾ×î½ü´æÈë½á¹¹ÌåµÄ·ÇÖÕ½á·ûÓëÖÕ
½á·ûÊÇ×Ö·ûÊý×éµÄµÚ¼¸¸öλÖÃ
char Vn[20]; char Vt[20]; char S;
string P[20];
//ʹÓýṹÌ嶨ÒåÎÄ·¨ //·ÇÖÕ½á·û //ÖÕ½á·û //¿ªÊ¼·ûºÅ
//²úÉúʽ
ch = GetBC(fpi);
if (ch >= 'A' && ch <= 'Z') {
str += ch; gp->Vn[m] = ch; m++;
ch = GetBC(fpi); if (ch == '-') {
str += ch; ch = GetBC(fpi); if (ch == '>') {
str += ch; while (1) {
ch = GetBC(fpi); if (ch == '\\n' || ch == ';')
break;
//¶ÁÈë»»Ðзû
¹²·ÖÏí92ƪÏà¹ØÎĵµ