为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

代码

2013-11-20 12页 doc 162KB 9阅读

用户头像

is_384406

暂无简介

举报
代码#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef pairDP; typedef pair >TP; char beginflag='S';//存?储洹?开a始?符?号? multimapProductions;//存?储洹?产ú生Θ?式? multimapRe_Productions; //先è存?...
代码
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef pairDP; typedef pair >TP; char beginflag='S';//存?储洹?开a始?符?号? multimapProductions;//存?储洹?产ú生Θ?式? multimapRe_Productions; //先è存?右?部?再ù存?左哩?部?,便?于?查é找ò vectorFIRST; //FIRST集ˉ vectorFOLLOW; //FOLLOW集ˉ setcan_getempty; //能ü推?出?空?的?非?终?结á符?的?集ˉ合? setnon_terminal; //非?终?结á符?集ˉ合? vectorrights; //产ú生Θ?式?右?部? vectorSELECT; //SELECT集ˉ vectorSentence; //要癮识?别纄的?句?子哩? void Read_file();//初?始?化ˉ,读á入?数簓据Y bool Judge_can_getempty(char); //判D断?一?个?非?终?结á符?是?否?能ü推?出?空? void Get_can_getempty(); //求ó出?那?些?能ü推?出?空?的?非?终?结á符?集ˉ合? void Get_First(char, set&); //求ó某3个?非?终?结á符?的?FIRST集ˉ void First_All(); //求ó所ù有瓺非?终?结á符?的?FIRST集ˉ void Print_First(); //输?出?FIRST集ˉ合? void Get_Follow(char, set&); //求ó某3个?非?终?结á符?的?FOLLOW集ˉ void Follow_All(); //求ó所ù有瓺非?终?结á符?的?FOLLOW集ˉ void Print_Follow(); //输?出?FOLLOW集ˉ void Get_Select(); //求ó各÷个?产ú生Θ?式?的?SELECT集ˉ void Print_Select(); //输?出?SELECT集ˉ void Analysis(); //预¤测a分?析?程ì序ò void Read_file()//读á入?数簓据Y { ifstream infile; infile.open("grammars.txt"); if (!infile) { cout << "无T法ぁ?打洙?开a文?件t" << endl; return; } string s; while (infile >> s) { char ch = s[0]; string ss = ""; for (int i = 2; i < (int)s.size(); i++) ss += s[i]; Productions.insert(make_pair(ch, ss)); Re_Productions.insert(make_pair(ss, ch)); rights.push_back(ss); non_terminal.insert(s[0]); //非?终?结á符? } infile.close(); } void Get_can_getempty()//求ó出?那?些?能ü推?出?空?的?非?终?结á符?集ˉ合? { set::iterator iter; for (iter = non_terminal.begin(); iter != non_terminal.end(); iter++) { if(Judge_can_getempty((*iter))) { can_getempty.insert(*iter); } } } bool Judge_can_getempty(char ch)//判D断?某3一?非?终?结á符?能ü否?推?出?空? { if (Productions.find(ch) == Productions.end())return false; multimap::iterator iter = Productions.find(ch);//multimap的?迭台?代洙?器÷ int Count =(int)Productions.count(iter->first); for (int i = 0; i < Count; i++) { bool flag = true; for (int j = 0; j < (int)iter->second.size(); j++) { if (isupper(iter->second[j]))//大洙?写′字?母?表括?示?非?终?结á符? { if (iter->second[j] == ch) { flag = false; break; } else if (!Judge_can_getempty(iter->second[j])) { flag = false; break; } } else if (iter->second[j] != '@')//@表括?示?空? { flag = false; break; } } if (flag)return true; //对?于?某3非?终?结á符?,?只?要癮有瓺某3个?产ú生Θ?式?能ü产ú生Θ?空?,?那?么′这a个?非?终?结á符?就í能ü推?出?空?,返う?回?true; iter++; } return false;//如?果?都?不?能ü推?出?空?,?那?么′就í返う?回?false; } void First_All()//求ó所ù有瓺非?终?结á符?的?FIRST集ˉ { setFirst; set::iterator iter; for ( iter = non_terminal.begin(); iter != non_terminal.end(); iter++) { First.clear(); Get_First(*iter, First); //求ó某3一?个?非?终?结á符?的?FIRST集ˉ string str = ""; set::iterator it; for ( it= First.begin(); it != First.end(); it++)str += (*it); FIRST.push_back(make_pair(*iter, str)); } } void Get_First(char ch, set&st)//求ó某3一?个?非?终?结á符?的?FIRST集ˉ { if (Productions.find(ch) == Productions.end())return; multimap::iterator iter = Productions.find(ch); int Count = (int)Productions.count(iter->first); for (int i = 0; i < Count; i++) { for (int j = 0; j < (int)(iter->second.size()); j++) { if (!isupper(iter->second[j])) //碰?到?终?结á符? { st.insert(iter->second[j]); break; } else if (isupper(iter->second[j])) { if (iter->second[j] == ch) { break; } Get_First(iter->second[j], st);//递蘗归é调獭?用? if (can_getempty.find(iter->second[j]) == can_getempty.end()) { break;//如?果?这a个?非?终?结á符?不?会á推?出?空?,?那?么′就í直±接óbreak寻°找ò下?一?个?产ú生Θ?式?,?否?则ò继ì续?判D断?下?一?个?符?号? } } } iter++; } } void Print_First()//输?出?FIRST集ˉ { cout << "FIRST集ˉ:" << endl << endl; for (int i = 0; i <(int) FIRST.size(); i++) { cout << FIRST[i].first << ":阰"; for (int j = 0; j <(int) FIRST[i].second.size(); j++) { cout << FIRST[i].second[j] << " "; } cout << endl; } cout << endl<Follow; set::iterator iter; for ( iter= non_terminal.begin(); iter != non_terminal.end(); iter++) { Follow.clear(); //if (*iter == beginflag)Follow.insert('#'); Get_Follow(*iter, Follow); string str = ""; set::iterator it; for (it = Follow.begin(); it != Follow.end(); it++)str += (*it); FOLLOW.push_back(make_pair(*iter, str)); } } void Get_Follow(char ch, set&st)//求ó某3一?个?非?终?结á符?的?FOLLOW集ˉ { if (ch == beginflag)st.insert('#'); for (int i = 0; i < (int)rights.size(); i++)//对?所ù有瓺的?产ú生Θ?式?右?部?找ò到?该?非?终?结á符? { string str = rights[i]; for (int j = 0; j < (int)rights[i].size(); j++)//对?每?个?产ú生Θ?式?右?部?找ò到?该?非?终?结á符? { if (rights[i][j] == ch&&j !=(int) rights[i].size() - 1)//不?是?最?后ó一?个?符?号? { if (!isupper(rights[i][j + 1]))//后ó面?是?终?结á符? { if (rights[i][j + 1] != '@') { st.insert(rights[i][j + 1]); } } else { //后ó面?紧?跟ú着?是?非?终?结á符? /*vector::iterator iter = FIRST.begin(); while (iter != FIRST.end()) { if (iter->first == rights[i][j+1]) { break; } iter++; } for (int k = 0; k < (int)iter->second.size(); k++) { if (iter->second[k] != '@')st.insert(iter->second[k]); }*/ //如?果?这a些?非?终?结á符?都?能ü推?出?空?,?就í要癮把?左哩?部?的?Follow(辍)?送í入?到?所ù求ó的?Follow(辍)?中D bool flag = true; for (int pos = j + 1; pos < (int)rights[i].size(); pos++) { if (isupper(rights[i][pos]) && can_getempty.find(rights[i][pos]) != can_getempty.end()) { vector::iterator ii = FIRST.begin(); while (ii != FIRST.end()) { if (ii->first == rights[i][pos]) { break; } ii++; } for (int k = 0; k < (int)ii->second.size(); k++) { if (ii->second[k] != '@')st.insert(ii->second[k]); } continue; } flag = false; break; } if (flag) { multimap::iterator it = Re_Productions.find(str); int Count = Re_Productions.count(it->first); while (Count--) { if (it->second != ch) { Get_Follow(it->second, st); } } } } } else if (rights[i][j] == ch&&j == (int)rights[i].size() - 1)//如?果?是?最?后ó一?个?字?符? { multimap::iterator iter = Re_Productions.find(str);//反ぁ?向ò映?射?找ò到?推?出?str这a个?产ú生Θ?式?的?左哩?部?字?符? int Count = Re_Productions.count(iter->first); while (Count--) { if (iter->second != ch) { Get_Follow(iter->second, st); } } } } } } void Print_Follow()//输?出?所ù有瓺非?终?结á符?的?FOLLOW集ˉ { cout << "FOLLOW集ˉ:" << endl << endl; for (int i = 0; i < (int) FOLLOW.size(); i++) { cout << FOLLOW[i].first << " : "; for (int j = 0; j <(int) FOLLOW[i].second.size(); j++) { cout << FOLLOW[i].second[j] << " "; } cout << endl; } cout << endl<::iterator iter; vector::iterator it; setst; for (iter = Productions.begin(); iter != Productions.end(); iter++)//对?整?个?文?法ぁ?进?行D遍括?历え? { char ch = iter->first; string str = iter->second; bool flag = true; st.clear(); for (int i = 0; i < (int)str.size(); i++) { if (can_getempty.find(str[i]) == can_getempty.end()&& str[i] != '@')//找ò到?不?能ü推?出?空?的?非?终?结á符?或ò者?是?终?结á符? { flag = false; } } int pos = 0; while (pos<(int)str.size() && can_getempty.find(str[pos]) != can_getempty.end())//能ü推?出?空?的?非?终?结á符? { for (it = FIRST.begin(); it != FIRST.end(); it++) { if (str[pos] == it->first)break; } for (int j = 0; j < (int)it->second.size(); j++) { st.insert(it->second[j]); } pos++; } if (pos < (int)str.size())//右?部?产ú生Θ?式?中D含?有瓺终?结á符?或ò者?含?有瓺不?能ü推?出?空?的?非?终?结á符? { if (isupper(str[pos])) { for (it = FIRST.begin(); it != FIRST.end(); it++) { if (str[pos] == it->first)break; } for (int j = 0; j < (int)it->second.size(); j++) { st.insert(it->second[j]); } } else st.insert(str[pos]); } if (flag)//右?部?中D全?都?是?能ü推?出?空?的?非?终?结á符? { for (it = FOLLOW.begin(); it != FOLLOW.end(); it++) { if (ch == it->first)break; } for (int j = 0; j < (int)it->second.size(); j++) { st.insert(it->second[j]); } for (set::iterator ii = st.begin(); ii != st.end(); ) { if ((*ii) == '@') { ii = st.erase(ii); break; } ii++; } string ss = ""; for (set::iterator ii = st.begin(); ii != st.end(); ii++)ss += (*ii); SELECT.push_back(make_pair(ch, make_pair(str,ss))); } else //SELECT(辍->a)=(FIRST(a)) { string ss = ""; for (set::iterator ii = st.begin(); ii != st.end(); ii++)ss += (*ii); SELECT.push_back(make_pair(ch, make_pair(str,ss))); } } } void Print_Select()//输?出?SELECT集ˉ { cout << "SELECT集ˉ:" << endl << endl; for (int i = 0; i < (int) SELECT.size(); i++) { cout << SELECT[i].first << " ->"; cout <> str; for (int i = 0; i < (int)str.size(); i++){ Sentence.push_back(str[i]); } Sentence.push_back('#'); vector::iterator iter = Sentence.begin(), ii; stackS; vectorvet; S.push('#'); S.push(beginflag); vet.push_back('#'); vet.push_back(beginflag); cout << "分?析?栈?" << " " << "剩骸?余?输?入?串?" << " " << "推?导?所ù用?的?产ú生Θ?式?或ò匹¥配?" << endl; int space = 5; while (!S.empty()) { for (int i = 0; i < (int)vet.size(); i++) { cout << vet[i] << " "; } for (int i = (int)vet.size(); i <= space+2; i++)cout << " "; int count = 0; for (ii = iter; ii != Sentence.end(); ii++) { cout << (*ii) << " "; count++; } for (; count <= space; count++)cout << " "; char ch = S.top(); if (ch == (*iter)) { S.pop(); vet.pop_back(); iter++; for (int i = 0; i <= space; i++)cout << " "; cout << ch<<"匹¥配?" << endl; } else { vector::iterator it; string ss = ""; bool flag = false; for (it = SELECT.begin(); it != SELECT.end(); it++) { if (it->first == ch) { ss = it->second.first; for (int i = 0; i < (int)it->second.second.size(); i++) { if (it->second.second[i] == (*iter)) { flag = true; break; } } if (flag)break; } } for (int i = 0; i <= space; i++)cout << " "; if (!flag) { cout << "该?输?入?串?无T法ぁ?被?识?别纄" << endl; return; } cout << ch << "->" << ss << endl; reverse(ss.begin(), ss.end()); //反ぁ?转羇 if (ss == "@") { S.pop(); vet.pop_back(); } else { S.pop(); vet.pop_back(); for (int i = 0; i < (int)ss.size(); i++) { S.push(ss[i]); vet.push_back(ss[i]); } } } } cout <
/
本文档为【代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索