对下列文法,用LR(1)分析法对任意输入的符号串进行分析: (0)E->S (1)S->BB (2)B->aB (3)B->b C++代码
时间: 2024-01-22 07:02:29 浏览: 119
这里给出使用 C++ 实现的 LR(1) 分析器代码:
```cpp
#include <iostream>
#include <stack>
#include <unordered_map>
#include <vector>
using namespace std;
// LR(1) 分析表
unordered_map<int, unordered_map<char, string>> action = {
{0, {{'a', "s3"}, {'b', "s4"}, {'#', "acc"}}},
{},
{},
{3, {{'a', "s3"}, {'b', "s4"}, {'#', "r3"}}},
{},
{},
{},
{8, {{'a', "r3"}, {'b', "r3"}, {'#', "r3"}}},
{},
{9, {{'a', "r2"}, {'b', "r2"}, {'#', "r2"}}}
};
unordered_map<int, unordered_map<char, int>> goto_ = {
{0, {{'S', 1}, {'B', 2}}},
{},
{},
{3, {{'B', 5}}},
{},
{},
{},
{},
{8, {{'B', 8}}},
{}
};
// LR(1) 分析器
bool lr1_parser(string w) {
stack<int> stk; // 栈
stk.push(0); // 初始状态为 0
int i = 0; // 输入串指针
while (true) {
int s = stk.top(); // 栈顶状态
char a = (i < w.size() ? w[i] : '#'); // 当前输入符号(如果已经读完输入,则使用结束符号 #)
if (action[s].find(a) == action[s].end()) {
cout << "Error: 无法进行移入或规约操作" << endl;
return false;
} else if (action[s][a] == "acc") {
cout << "Accept: 分析成功" << endl;
return true;
} else if (action[s][a][0] == 's') { // 移入操作
stk.push(a); // 将当前输入符号移入栈中
stk.push(stoi(action[s][a].substr(1))); // 将新状态移入栈中
i++; // 输入指针向后移动一位
} else if (action[s][a][0] == 'r') { // 规约操作
int p = stoi(action[s][a].substr(1)); // 获取产生式编号
for (int j = 0; j < grammar[p].second.size(); j++) {
stk.pop(); // 弹出产生式右部符号
stk.pop(); // 弹出对应状态
}
int t = stk.top(); // 获取栈顶状态
stk.push(grammar[p].first); // 将产生式左部符号移入栈中
stk.push(goto_[t][grammar[p].first]); // 根据 GOTO 表转移到新状态
} else {
cout << "Error: 无法进行移入或规约操作" << endl;
return false;
}
}
}
int main() {
// 文法
vector<pair<char, vector<char>>> grammar = {
阅读全文