1、根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。 2、构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。 3、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 4、如果遇到错误的表达式,应输出错误提示信息。 5、对下列文法,用LL(1)分析法对任意输入的符号串进行分析: (1) E->TG (2) G->+TG]- -TG (3) G-> e (4) T->FS (5) S->*FSl/FS(6) S-> e (7) F->(E) (8) F->i
时间: 2023-07-16 10:13:44 浏览: 84
下面是实现LL(1)分析的程序:
```
#include <iostream>
#include <string>
#include <stack>
using namespace std;
const int N = 9;
const int M = 8;
string grammar[N] = {"E->TG", "G->+TG", "G->-TG", "G->e", "T->FS", "S->*FSl", "S->/FS", "S->e", "F->(E) | i"};
int P[N][M] = {
{0, 0, 0, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 1, 1, 0},
{1, 0, 0, 0, 0, -2, -2, 0},
{2, 3, 3, 2, 0, 3, 3, 0},
{4, 0, 0, 0, 0, 4, 4, 0},
{0, 5, 6, 0, 0, 5, 6, 0},
{7, 0, 0, 0, 0, -1, -1, 0},
{8, 0, 0, 0, 0, 8, 8, 0},
{0, 0, 0, 0, 0, 0, 0, 0}
};
char VT[] = "+-*/i()#";
char VN[] = "EGTSF";
int get_index(char c, char* arr, int n) {
for (int i = 0; i < n; i++) {
if (c == arr[i]) {
return i;
}
}
return -1;
}
int main() {
stack<char> stk;
stk.push('#');
stk.push('E');
string input;
cout << "请输入要分析的符号串:";
cin >> input;
input += '#';
int i = 0;
bool flag = true;
while (flag) {
char cur = stk.top();
char nxt = input[i];
int cur_index = get_index(cur, VN, 5);
int nxt_index = get_index(nxt, VT, 8);
if (cur_index == -1 || nxt_index == -1) {
cout << "错误的符号: " << cur << " 或 " << nxt << endl;
flag = false;
} else {
if (P[cur_index][nxt_index] == 0) {
if (cur == nxt) {
stk.pop();
i++;
} else {
cout << "错误的符号: " << cur << " 或 " << nxt << endl;
flag = false;
}
} else if (P[cur_index][nxt_index] > 0) {
stk.pop();
string prod = grammar[P[cur_index][nxt_index] - 1];
for (int j = prod.size() - 1; j >= 3; j--) {
stk.push(prod[j]);
}
} else {
cout << "错误的符号: " << cur << " 或 " << nxt << endl;
flag = false;
}
}
if (cur == '#' && nxt == '#') {
flag = false;
}
}
if (i == input.size() - 1) {
cout << "分析成功!" << endl;
} else {
cout << "分析失败!" << endl;
}
return 0;
}
```
输入符号串后,程序会将其存入一个字符串中,并在末尾加上一个结束符号 `#`。然后,程序会将栈初始化为 `#E`,其中 `#` 表示栈底符号。
程序的主要逻辑是一个循环,每次循环取出栈顶符号和输入串中的下一个符号,根据预测分析表进行处理。如果栈顶符号和输入符号相同,则将它们都弹出;如果预测分析表中的值是正数,则用相应的产生式将栈顶符号替换成非终结符的推导式;如果预测分析表中的值是负数,则说明出现了错误。如果栈顶符号为 `#` 且输入符号也为 `#`,则分析成功;否则,分析失败。
预测分析表 `P` 是一个二维数组,其中第 i 行第 j 列的值表示使用非终结符 `VN[i]` 推导出终结符 `VT[j]` 的产生式编号。如果值为 0,则表示在该位置上无法进行推导;如果值为正数 k,则表示推导使用的是编号为 k 的产生式;如果值为负数,则表示出现了语法错误。在本例中,使用 -1 表示错误。
下面是程序的一些运行示例:
```
请输入要分析的符号串:i+i*i#
分析成功!
```
```
请输入要分析的符号串:(i+i*i)
分析成功!
```
```
请输入要分析的符号串:i+i*#
错误的符号: # 或 #
分析失败!
```
```
请输入要分析的符号串:i+i*i)
错误的符号: ) 或 #
分析失败!
```
```
请输入要分析的符号串:i+i**i#
错误的符号: * 或 *
分析失败!
```