#includeusing namespace std;
int norterminal(char c)
struct lr
;int main()
//變為增廣文法
string s="z::=";
s+=strn[0][0];
s+='#';
strn.insert(strn.begin(),s);
for(int i=0;iif(norterminal(strn[i][0]))
nonterm+=strn[i][0];
string ustr(nonterm);
sort(ustr.begin(), ustr.end());
ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() );
nonterm=ustr;
} nonterm.erase(nonterm.end() - 1);
// cout/求解初始項集的閉包
// cout<
char non;
//找第乙個終結符
if(norterminal(strn[0][4]))
for(int j=1;jif(non==strn[j][0])
}non=strn[j][4];}}
} /* for(int i=0;i/*求解項集規範族 */
//求解當前項集中的終結符與非終結符以便於後續的存放。
string nont;//存放當前閉包$後邊遇到的字母
int totalnum=1;
//偶數遍歷
for(int r=0;r"";
for(int i=0;istr.size();i++)
}string ustr(nont);
sort(ustr.begin(), ustr.end());
ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() );
nont=ustr;
//lr[r].later=nont;
}
// now=r;
//cout
for(int i=0;istr.size();i++)} }
}}//若遇到終結符進行閉包運算
for(int i=0;ifor(int k=0;kstr.size();k++)
}non=strn[j1][4];}}
}break;}}
}break;}}
r+=1;
if(nont.length()!=0)
totalnum+=nont.length();
} //奇數遍歷
for(int r=1;r"";
for(int i=0;istr.size();i++)
}string ustr(nont);
sort(ustr.begin(), ustr.end());
ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() );
nont=ustr;
// lr[r].later=nont;
}
// now=r;
//cout
for(int i=0;istr.size();i++)} }
}}//若遇到終結符進行閉包運算
for(int i=0;ifor(int k=0;kstr.size();k++)
}non=strn[j1][4];}}
}break;}}
}break;}}
r+=1;
if(nont.length()!=0)
totalnum+=nont.length();
}cout0)}}
int termnum=0;
for(int i=0;iif(lr[i].str.size()>0)
}// cout<
for(int i=0;ibool flag=false;
if(lr[i].str.size()>0)
}string ustr(nont);
sort(ustr.begin(), ustr.end());
ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() );
nont=ustr;
lr[i].later=nont;
}if(lr[i].nape[0]=='#')
for(int p=0;pstr.size();p++)
{cout<
e::=aa
e::=bb
a::=d
a::=ca
b::=cb
b::=d
# 執行結果:
編譯原理中LR 0 專案集規範族的構造
此文略長。我也沒想到這寫起來這麼多,但對構造過程絕對清楚,一步步慢慢看吧。lr的第乙個l和ll的第乙個l含義相同,即從左到右掃瞄句子 第二個r表示right most最右推導。在通常的描述中,後面還有乙個括號裡面的數字如,lr 0 lr 1 這樣,括號裡面的數字表示用於決策所需的後續token分詞數...
編譯原理LR 0 專案集規範族的構造詳解
學編譯原理的時候,感覺什麼ll 1 lr 0 slr 1 lalr 1 思想滿天飛。而且做題的時候,一不留意,一道題就寫了三頁紙了。就拿今天這個玩意兒來講,我真的是考試前花了最多的時間,搞懂了 差不多搞懂了 這是個什麼玩意兒。以下內容,做題的話應該夠了而且很!容!易!理!解!其他學術情況恕博主也是個...
編譯原理中LR 0 專案集規範族的構造
lr的第乙個l和ll的第乙個l含義相同,即從左到右掃瞄句子 第二個r表示right most最右推導。在通常的描述中,後面還有乙個括號裡面的數字如,lr 0 lr 1 這樣,括號裡面的數字表示用於決策所需的後續token分詞數。首先看一下lr分析器的模型圖 可惜看出,lr分析器最關鍵的部分就是 lr...