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()
{
read_grammar();
init_grammar_set();
}

View File

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

View File

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