This commit is contained in:
LiuYuanchi 2024-05-11 22:27:22 +08:00
parent 0600b113d6
commit 936e9ea07d
3 changed files with 13 additions and 20 deletions

View File

@ -12,6 +12,7 @@
LL1::LL1() LL1::LL1()
{ {
read_grammar(); read_grammar();
init_grammar_set(); init_grammar_set();
} }

View File

@ -30,6 +30,7 @@ void Grammar::read_grammar() {
return; return;
} }
string buf; string buf;
string arrow = "->"; string arrow = "->";
string farrow; string farrow;
@ -77,6 +78,7 @@ void Grammar::read_grammar() {
} }
} }
// 符号集 和 非终结符 去重 // 符号集 和 非终结符 去重
set<string> ssymbols(symbols.begin(), symbols.end()); set<string> ssymbols(symbols.begin(), symbols.end());
symbols.clear(); symbols.clear();
@ -96,7 +98,7 @@ void Grammar::read_grammar() {
set_difference(symbols.begin(), symbols.end(), VNs.begin(), VNs.end(), back_inserter(VTs)); set_difference(symbols.begin(), symbols.end(), VNs.begin(), VNs.end(), back_inserter(VTs));
infile.close(); infile.close();
} }
void Grammar::print_grammar() void Grammar::print_grammar()
@ -158,8 +160,7 @@ void Grammar::init_grammar_set()
{ {
string symbol; string symbol;
//system("pause");
// 对符号集中各符号进行推导 是否可以到达 $ 空符号 // 对符号集中各符号进行推导 是否可以到达 $ 空符号
for (int i = 0; i < symbols.size(); i++) { for (int i = 0; i < symbols.size(); i++) {
symbol = symbols[i]; symbol = symbols[i];
@ -167,6 +168,7 @@ void Grammar::init_grammar_set()
symbol.clear(); symbol.clear();
} }
//system("pause");
// 初始化符号在产生式的 出现 依赖 情况 // 初始化符号在产生式的 出现 依赖 情况
init_appears_depend(); init_appears_depend();
@ -184,11 +186,13 @@ void Grammar::init_grammar_set()
// 初次遍历所有符号 生成初始的 FOLLOW 集 // 初次遍历所有符号 生成初始的 FOLLOW 集
// 构建 start 的 FOLLOW 集 // 构建 start 的 FOLLOW 集
follow[start] = this->symbol_infer_follow(start); follow[start] = this->symbol_infer_follow(start);
follow[start].push_back("$"); follow[start].push_back("$");
queue.push_back(start); queue.push_back(start);
// 构建除 start 的 FOLLOW 集 // 构建除 start 的 FOLLOW 集
for (int i = 0; i < symbols.size(); i++) { for (int i = 0; i < symbols.size(); i++) {
symbol = symbols[i]; symbol = symbols[i];
@ -219,7 +223,7 @@ void Grammar::init_grammar_set()
} }
symbol.clear(); symbol.clear();
} }
} }

View File

@ -48,12 +48,13 @@ int main(int argc, char** argv) {
//printDFA(dfa); //printDFA(dfa);
DFA minimizedDFA = minimizeDFA(minimizeDFA(dfa)); DFA minimizedDFA = minimizeDFA(minimizeDFA(dfa));
removeUnreachableStates(minimizedDFA); removeUnreachableStates(minimizedDFA);
//printDFA(minimizedDFA); printDFA(minimizedDFA);
cout<<"DFA FINISH"<<endl; cout<<"DFA FINISH"<<endl;
int i = 0; int i = 0;
try{ cout<<"LL1 START"<<endl;
for (auto input : inputs) { for (auto input : inputs) {
cout<<outputs_grammar[i]<<endl;
LL1 ll; LL1 ll;
//ll.print_grammar_set(); //ll.print_grammar_set();
@ -64,7 +65,7 @@ int main(int argc, char** argv) {
ll.build_LL1_predict(); ll.build_LL1_predict();
//ll.print_LL1_predict(); //ll.print_LL1_predict();
ll.get_token_strings(token_strings); ll.get_token_strings(token_strings);
@ -77,23 +78,10 @@ int main(int argc, char** argv) {
//ll.print_LL1_grammar_log(); //ll.print_LL1_grammar_log();
cout << endl; cout << endl;
cout<<outputs_grammar[i]<<endl;
cout<<"end"<<endl;
i++; i++;
} }
cout<<"LL1 FINISH"<<endl; cout<<"LL1 FINISH"<<endl;
}
catch(...){
cout<<"FINAL ERROR";
}
return 0; return 0;
} }