//?LL(1).cpp?:?此文件包含?“main“?函數。程序執行將在此處開始并結束。//#include?#include#include#include#include#include#includeusing?namespace?std;mapgetnum;char?getchar1[100];?????????//獲得對應字符vectorproce;int?table[100][100];??????//預測分析表int?num?=?0;?int?numvt?=?0;?????//numvt是終結符集合,0是‘#’,numvt表空字string?first[100];string?follow[200];void?readin(){ memset(table?-1?sizeof(table)); getnum[‘#‘]?=?0; getchar1[0]?=?‘#‘; cout?<“請輸入終結符集:“?< char?x; do { cin?>>?x; getnum[x]?=?++num; getchar1[num]?=?x; }?while?(cin.peek()?!=?‘\n‘); numvt?=?++num; getnum[‘@‘]?=?numvt;????????//kong?zi getchar1[num]?=?(‘@‘); cout?<“請輸入非終結符集:“?< do { cin?>>?x; getnum[x]?=?++num; getchar1[num]?=?x; }?while?(cin.peek()?!=?‘\n‘); cout?<“輸入需要用到的文法,并以‘end’結束:(空字ε用‘@’表示,方便輸入)“?< string?pro; while?(cin?>>?pro?&&?pro?!=?“end“) { string?ss; ss?+=?pro[0]; for?(int?i?=?3;?i? { if?(pro[i]?==?‘|‘) { proce.push_back(ss); ss.clear();?ss?+=?pro[0]; } else { ss?+=?pro[i]; } } proce.push_back(ss); }}void?jiaoji(string?&a?string?b)??//a=a?or?b???取ab交集賦值給a{ setse; for?(int?i?=?0;?i? se.insert(a[i]); for?(int?i?=?0;?i? se.insert(b[i]); string?ans; set::iterator?it; for?(it?=?se.begin();?it?!=?se.end();?it++) ans?+=?*it; a?=?ans;}string?get_f(int?vn?int?&?has_0)?????//dfs:vn能推出的不含空字的vt集合,并且判斷vn能否推出空字{ if?(vn?==?numvt)has_0?=?1; if?(vn? string?ans; for?(int?i?=?0;?i? { if?(getnum[proce[i][0]]?==?vn) ans?+=?get_f(getnum[proce[i][1]]?has_0); } return??ans;}void?getfirst(){ for?(int?i?=?1;?i?<=?numvt;?i++)?????//終結符,first集是其本身。 { first[i]?+=?(‘0‘?+?i); } for?(int?j?=?0;?j? { int?k?=?0;?int?has_0?=?0;????????//k掃瞄該產生式 do?{ has_0?=?0; k++; if?(k?==?proce[j].size())??//推到最后一個了,則附加空字 { first[getnum[proce[j][0]]]?+=?(‘0‘?+?numvt); break; }?????????????????????//合并之 jiaoji(first[getnum[proce[j][0]]]?get_f(getnum[proce[j][k]]?has_0)); }?while?(has_0);??//到無法推出空字為止 }}void?print_first(){ cout?<“First集如下:“?< for?(int?i?=?1;?i?<=?num;?i++) { cout?<“first?[“?< for?(int?j?=?0;?j? cout?< cout?< } cout?<}void?getfollow(){ jiaoji(follow[getnum[proce[0][0]]]?“0“);??//先添加‘#’; for?(int?j?=?0;?j? { for?(int?jj?=?1;?jj? { if?(getnum[proce[j][jj]]?<=?numvt)continue;??//vt無follow集 int?k?=?jj;?int?has_0; do { has_0?=?0; k++; if?(k?==?proce[j].size())???//都能推出空字,follow集=產生式
共有 條評論