LL(1)语法分析器c++代码
时间: 2024-06-19 11:03:56 浏览: 137
LL(1)语法分析器是一种自顶向下的语法分析器,可以通过读入的文本串构造一个语法树,进而判断文本串是否符合语法规则。下面是一个简单的LL(1)语法分析器的C++代码示例:
```
#include <iostream>
#include <string>
using namespace std;
// 定义LL(1)分析表
char table = {
{' ', '+', '*', '$'},
{'E', 'T', ' ', ' '},
{' ', '+', '*', ' '},
{'T', 'F', ' ', ' '}
};
// 返回符号对应的行列数
int get_index(char c) {
if (c == '+') return 1;
if (c == '*') return 2;
if (c == '$') return 3;
if (c == 'E') return 0;
if (c == 'T') return 1;
if (c == 'F') return 3;
return -1;
}
// 判断是否为终结符
bool is_terminal(char c) {
return (c == '+' || c == '*' || c == '(' || c == ')' || c == 'i' || c == '$');
}
// LL(1)语法分析函数
bool analyze(string input) {
input += '$'; // 在输入串末尾加上$符号
string stack = "E$"; // 初始化分析栈
int i = 0, j = 0; // 初始化输入串和分析表指针
while (stack.back() != '$') {
char top = stack.back(); // 取出栈顶符号
if (is_terminal(top)) { // 如果栈顶是终结符
if (top == input[i]) { // 如果匹配成功,弹出栈顶符号和输入串指针后移
stack.pop_back();
i++;
} else { // 否则匹配失败,返回false
return false;
}
} else { // 如果栈顶是非终结符
j = get_index(input[i]); // 获取输入串当前字符在分析表中的列数
int k = get_index(top); // 获取栈顶符号在分析表中的行数
char next = table[k][j]; // 获取分析表中对应的下一个符号
if (next == ' ') { // 如果表中对应位置为空,则说明文本串不符合语法规则,返回false
return false;
} else if (next == 'E') { // 如果下一个符号是E,则将E替换为E->TE'的产生式右部
stack.pop_back();
stack += "E'";
stack += "T";
} else if (next == 'T') { // 如果下一个符号是T,则将T替换为T->FT'的产生式右部
stack.pop_back();
stack += "T'";
stack += "F";
} else if (next == 'F') { // 如果下一个符号是F,则将F替换为i或者(E)的产生式右部
stack.pop_back();
if (input[i] == 'i') {
stack += "i";
i++;
} else {
stack += ")";
stack += "E";
stack += "(";
i++;
}
} else { // 否则将对应符号压入栈中
stack.pop_back();
for (int p = next - 1; p >= 0; p--) {
stack += table[k][p];
}
}
}
}
return true; // 分析成功,返回true
}
int main() {
string input;
cout << "请输入待分析文本串:";
cin >> input;
if (analyze(input)) {
cout << "该文本串符合LL(1)文法规则!" << endl;
} else {
cout << "该文本串不符合LL(1)文法规则!" << endl;
}
return 0;
}
```
阅读全文