#include????????????????????????????????????????????????????????//基本輸入輸出操作等?#include?????????????????????????????????????????????????????????????//關聯容器?#include????????????????????????????????????????????????????????//迭代器?#include?????????????????????????????????????????????????????????//文件操作?#include?????????????????????????????????????????????????????????//Dev-C++特有?/**?使用關聯容器Map????存在一個問題,就是最終求出的V[i][j]中可能存在重復的值,如SASC,????不符合經典集合論的要求?*/using?namespace?std;??????????????????????????????????????????????????????typedef?map::value_type?valType;????????????????????????????//自定義數據類型map::value_typetypedef?string*?*pString;??????????????????????????????????????????????????//定義指向string*的指針?map?P;??????????????????????????????????????????????????????//存儲產生式的關聯容器?/*------------------------------------讀取產生式并存入對應的數據結構中-------------------------------------*/void?readFromFile(){??????????????????????????????????????????????????????//從文件中讀取產生式??????string?key;??????????????????????????????????????????????????????????//喬姆斯基范式中產生式右邊部分作為key?????string?value;????????????????????????????????????????????????????????//?左邊的非終結符作為value?????string?input;????????????????????????????????????????????????????????//臨時存放讀入的字符串?????int?location;????????????????????????????????????????????????????????//讀取文件時存儲空格位置??????ifstream?in(“Production.txt“);???????????????????????????????????????//以只讀方式打開文件???????????if(!in){?????????????????????????????????????????????????????????????//文件打開失敗的異常處理??????????cerr<<“文件打開失敗“<?????????exit(-1);?????????????}?????while(in.peek()!=EOF){???????????????????????????????????????????????//開始讀取文件內的內容,存入Production??????????getline(ininput);???????????????????????????????????????????????//首先讀取一行?????????location=input.find(‘?‘);????????????????????????????????????????//查找空格位置??????????value=input.substr(0location);??????????????????????????????????//喬姆斯基范式中產生式左邊非終結符作為value?????????key=input.substr(location+1input.size());???????????????????????//右邊部分作為key??????????if(P.count(key)==0){?????????????????????????????????????????????//關聯容器中還沒有key對應的非終結符??????????????P.insert(valType(keyvalue));????????????????????????????????//插入鍵值對??????????}???????????????????????????else{?????????????P[key]+=value;????????????????????????????????????????????????//關聯容器中已存在key對應的非終結符??????????}?????}???????/**?????for(map::iterator?it=P.begin();it!=P.end();it++)??????//測試用?????????cout<<(*it).second<<“-->“<<(*it).first<}/*----------------------------------------從控制臺讀入需判斷的字符串--------------------------------------*/?void?readFromConsole(string&?w){???????????????????????????????????????????//返回字符串的長度,以定義數組V的大小??????cout<<“請輸入要判斷的字符串:“<?????cin>>w;???????????????????????????????????????????????????????????????//從控制臺輸入需判
共有 條評論