#include?#include?#include?#include?#include?#include?#include?#include?using?namespace?std;void?input_G();??//LL(1)文法輸入函數(shù)以及VN和VT之間的分離void?Select();bool?Judge_LL1();void?PREDICT();void?analyze(string?str);string?char2str(char?ch);///*********函數(shù)聲明分隔線*******************string?p[100];???????//表示產(chǎn)生式int?n_chan;?????????????//產(chǎn)生式的個數(shù)int?n_VN;vector?VN;??????//終結(jié)符集和set_VN存儲相同,但向量存儲便于隨機(jī)訪問vector?VT;??????//非終結(jié)符集set?set_VN;?????//非終結(jié)符集合和VN存儲相同,但集合存儲便于查找元素和去重set?set_VT;?????//終結(jié)符集合string?all_left[100];??????//產(chǎn)生式所有左部VNstring?all_right[100];??????//產(chǎn)生式所有右部VN+VNstring?S;??//開始VNmap?Vn2Num;????//VN映射到FIRST集合下標(biāo)map?Vt2Num;????//VN映射到FIRST集合下標(biāo)set?SELECT[100];vector?predict[100];??//預(yù)測分析表string?kong?=?“error“;??//預(yù)測分析表空白處填寫字符串int?step?=?0;??//預(yù)測分析過程步驟序數(shù)int?main()?{ input_G();????Select();????PREDICT();????cout<<“請輸入對應(yīng)以上文法要分析的字符串(如i*i):“;????string?str;????cin>>str;????while(str[str.length()-1]!=‘-‘){????????analyze(str);????????cout<????????cin>>str;????} return?0;}///輸入合法文法&&分離VT和VNvoid?input_G(){????string?tmp;???//用于拼接字符串????string?tmp1;????n_chan?=?8;????p[0]?=?“E->TE‘“;????p[1]?=?“E‘->+TE‘“;????p[2]?=?“E‘->e“;????p[3]?=?“T->FT‘“;????p[4]?=?“T‘->*FT‘“;????p[5]?=?“T‘->e“;????p[6]?=?“F->(E)“;????p[7]?=?“F->i“;????///提取非終結(jié)符VN的循環(huán)????for(int?i=0;i????????tmp?=?““;????????tmp1?=?““;????????//scanf(“%[^\n]“p[i]);????????//getchar();????????int?j=0;????????while(p[i][j]!=‘-‘){????????????tmp?+=?p[i][j];??//因?yàn)榉墙K結(jié)符可能是形如E‘之類的兩個字符,所以需要拼接,遇到箭頭就結(jié)束????????????j++;????????}????????j?+=?2;????????for(;j<(int)p[i].length();j++)????????????tmp1?+=?p[i][j];????????cout<????????all_left[i]?=?tmp;??????//存儲每個產(chǎn)生式的左部????????all_right[i]?=?tmp1;????//存儲每個產(chǎn)生式的右部????????set_VN.insert(tmp);??//將每行產(chǎn)生式拼接好的非終結(jié)符插入到集合中????}????n_VN?=?set_VN.size();???//讀取VN個數(shù)????///提取終結(jié)符VT的循環(huán)????for(int?i=0;i????????int?chan_len?=?p[i].length();?//每個產(chǎn)生式的長度????????for(int?j=0;j????????????if(p[i][j]==‘>‘){????????????????tmp?=?““;????????????????for(int?k=j+1;k“之后的下標(biāo)????????????????????tmp1?=?p[i][k];????????????????????if(set_VN.count(tmp1)==0){?//count==0表示該字符不在集合中,即∈VT????????????????????????tmp?+=?p[i][k];???????????//拼接字符串????????????????????????tmp1?=?p[i][k+1];????????????????????????if((k==chan_len-1)||((k????????????????????????????//判斷(已是最后一個字符||后一個字符是VN則之前的字符串是一個VT)????????????????????????????set_VT.insert(tmp);????????????????????????????tmp?=?““;????????????????????????}????????????????????}????????????????}????????????????break;??//本行產(chǎn)生式已掃描結(jié)束????????????}????}????set_VT.erase(“‘“);??//VT集合中刪除“‘“和“e“符號
共有 條評論