优化bool analyze() //总控,分析字word的合法性,若合法,输出所有产生式。 { stack<char>sta; sta.push('#'); sta.push(proce[0][0]); shuchu.push_back('#'); shuchu.push_back(proce[0][0]); int i = 0; while (!sta.empty()) { int cur = sta.top();//取出栈顶元素 sta.pop(); //删除栈顶元素 if (cur == word[i]) //是终结符,推进 { word[i] = NULL; if (!shuchu.empty()) shuchu.pop_back(); i++; } else if (cur == '#') //成功,结束 { return 1; } else if (table[getnum[cur]][getnum[word[i]]] != -1) //查表,最初预测分析表全定义为-1 { int k = table[getnum[cur]][getnum[word[i]]]; cout << shuchu << " "; cout << word << "#" << " "; cout << proce[k][0] << "->"; for (int j = 1; j < proce[k].size(); j++) cout << proce[k][j]; cout << endl; shuchu.pop_back(); for (int j = proce[k].size() - 1; j > 0; j--) //逆序入栈 { if (proce[k][j] != '@') { sta.push(proce[k][j]); shuchu.push_back(proce[k][j]); } } } else //失败! { return 0; } } return 1; }代码
时间: 2024-01-28 07:03:15 浏览: 73
QT C++ 基于word模板 在标签位置写入文字和图片 demo
这段代码实现了LL(1)语法分析器的主要功能,即根据预测分析表对输入符号串进行分析,并输出所有的推导过程。
以下是一些优化建议:
1. 在代码中使用了多个STL库函数,如stack、vector等,这些函数可以提高代码的可读性和可维护性,但在性能方面可能不如手写实现,特别是在处理大规模数据时。因此,可以考虑手写栈和动态数组等数据结构,以提高效率。
2. 在代码中使用了多个if语句进行判断,这样的代码可读性较差,也不利于维护和扩展。可以考虑使用switch语句或者函数指针数组等方式进行优化。
3. 在代码中定义了一些不必要的变量,如i和cur等,这些变量可以直接使用循环变量和栈顶元素等代替,以减少代码行数和内存占用。
4. 在代码中使用了多个cout语句进行输出,这样的输出方式可能会影响程序性能。可以考虑将输出语句封装成一个函数,以减少重复代码和提高可读性。
5. 在代码中没有对输入的符号串进行检查和处理,如果输入的符号串不符合规范,程序可能会崩溃或者输出错误结果。因此,可以考虑添加符号串检查和处理函数,以保证程序的稳定性和正确性。
阅读全文