对下列文法编写C++语言程序,用LL(1)分析法C对任意输入的符号串进行分析: (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FM (5)M->*FM|/FM (6)M->ε (7)F->(E) (8)F->i
时间: 2023-08-07 21:29:31 浏览: 130
基于C++构造LL(1)文法的预测分析表(编译原理)【100012214】
5星 · 资源好评率100%
好的,以下是使用C++语言编写的LL(1)分析程序:
```cpp
#include <iostream>
#include <string>
using namespace std;
// LL(1)分析表
char table[5][8] = {
{' ', ' ', ' ', ' ', 'T', ' ', 'T', ' '},
{'+', '-', ' ', ' ', ' ', 'ε', ' ', 'ε'},
{' ', ' ', '*', '/', 'F', ' ', 'F', ' '},
{'ε', 'ε', 'M', 'M', ' ', 'ε', ' ', 'ε'},
{' ', ' ', ' ', ' ', '(', 'E', ')', 'i'}
};
// 非终结符号枚举类型
enum nonterminal {
E = 0, G = 1, T = 2, M = 3, F = 4
};
// 终结符号枚举类型
enum terminal {
ADD = 0, SUB = 1, MUL = 2, DIV = 3, LPAREN = 4, RPAREN = 5, ID = 6, END = 7
};
// 读入的符号
terminal get_symbol(char c) {
switch (c) {
case '+': return ADD;
case '-': return SUB;
case '*': return MUL;
case '/': return DIV;
case '(': return LPAREN;
case ')': return RPAREN;
case 'i': return ID;
case '$': return END;
default: return END; // 其他输入均视为$
}
}
// LL(1)语法分析函数
bool analyze(string str) {
int i = 0; // 输入串指针
int j = 0; // 栈顶指针
char stack[100] = {'$', 'E'}; // 初始化栈
while (stack[j] != '$') {
char top = stack[j];
terminal sym = get_symbol(str[i]);
if (top == ' ') {
j--;
continue;
}
if (top == sym) { // 匹配成功
j--;
i++;
} else if (top >= 'A' && top <= 'Z') { // 栈顶为非终结符
char prod = table[top-'E'][sym];
if (prod == ' ') { // 分析表中无对应产生式
return false;
} else if (prod == 'ε') { // 使用空产生式
j--;
} else { // 使用对应产生式
int len = strlen(prod);
stack[j--] = ' ';
for (int k = len - 1; k >= 0; k--) {
stack[j--] = prod[k];
}
}
} else { // 栈顶为终结符,但不匹配
return false;
}
}
return true;
}
int main() {
string str;
cout << "请输入要分析的符号串:";
cin >> str;
if (analyze(str + "$")) {
cout << "符号串合法!" << endl;
} else {
cout << "符号串不合法!" << endl;
}
return 0;
}
```
该程序会先读入要分析的符号串,然后将其作为输入,调用LL(1)语法分析函数进行分析。在语法分析函数中,使用一个栈来模拟语法分析过程,同时根据LL(1)分析表来进行分析,最终判断输入串是否合法。如果合法,则输出“符号串合法!”;否则输出“符号串不合法!”
阅读全文