#include #include #include #include #include #include #include #include using namespace std;void input_G(); //LL(1)文法输入函数以及VN和VT之间的分离void Select();bool Judge_LL1();void PREDICT();void analyze(string str);string char2str(char ch);///*********函数声明分隔线*******************string p[100]; //表示产生式int n_chan; //产生式的个数int n_VN;vector VN; //终结符集和set_VN存储相同,但向量存储便于随机访问vector VT; //非终结符集set set_VN; //非终结符集合和VN存储相同,但集合存储便于查找元素和去重set set_VT; //终结符集合string all_left[100]; //产生式所有左部VNstring all_right[100]; //产生式所有右部VN+VNstring S; //开始VNmap Vn2Num; //VN映射到FIRST集合下标map Vt2Num; //VN映射到FIRST集合下标set SELECT[100];vector predict[100]; //预测分析表string kong = “error“; //预测分析表空白处填写字符串int step = 0; //预测分析过程步骤序数int main() { input_G(); Select(); PREDICT(); cout<<“请输入对应以上文法要分析的字符串(如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“; ///提取非终结符VN的循环 for(int i=0;i tmp = ““; tmp1 = ““; //scanf(“%[^\n]“p[i]); //getchar(); int j=0; while(p[i][j]!=‘-‘){ tmp += p[i][j]; //因为非终结符可能是形如E‘之类的两个字符,所以需要拼接,遇到箭头就结束 j++; } j += 2; for(;j<(int)p[i].length();j++) tmp1 += p[i][j]; cout< all_left[i] = tmp; //存储每个产生式的左部 all_right[i] = tmp1; //存储每个产生式的右部 set_VN.insert(tmp); //将每行产生式拼接好的非终结符插入到集合中 } n_VN = set_VN.size(); //读取VN个数 ///提取终结符VT的循环 for(int i=0;i int chan_len = p[i].length(); //每个产生式的长度 for(int j=0;j if(p[i][j]==‘>‘){ tmp = ““; for(int k=j+1;k“之后的下标 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; //本行产生式已扫描结束 } } set_VT.erase(“‘“); //VT集合中删除“‘“和“e“符号
共有 条评论
评论
共有 条评论