LL(1)语法分析程序中打印预测分析表C++
时间: 2024-05-07 19:19:22 浏览: 71
以下是一个简单的LL(1)语法分析程序,包括生成预测分析表C和打印预测分析表C的代码。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ROW 10
#define MAX_COL 10
char first[MAX_ROW][MAX_COL][MAX_COL];
int first_count[MAX_ROW][MAX_COL];
char follow[MAX_ROW][MAX_COL][MAX_COL];
int follow_count[MAX_ROW][MAX_COL];
char table[MAX_ROW][MAX_COL][MAX_COL];
int table_row_count[MAX_ROW];
void print_first(int non_terminal, int terminal) {
printf("FIRST[%d][%d] = { ", non_terminal, terminal);
for (int i = 0; i < first_count[non_terminal][terminal]; i++) {
printf("%c ", first[non_terminal][terminal][i]);
}
printf("}\n");
}
void print_follow(int non_terminal) {
printf("FOLLOW[%d] = { ", non_terminal);
for (int i = 0; i < follow_count[non_terminal][0]; i++) {
printf("%c ", follow[non_terminal][0][i]);
}
printf("}\n");
}
void print_table_row(int non_terminal) {
printf("C[%d] = { ", non_terminal);
for (int i = 0; i < table_row_count[non_terminal]; i++) {
printf("%c -> %s, ", table[non_terminal][i][0], table[non_terminal][i] + 2);
}
printf("}\n");
}
int main() {
// 初始化
for (int i = 0; i < MAX_ROW; i++) {
for (int j = 0; j < MAX_COL; j++) {
first_count[i][j] = 0;
follow_count[i][j] = 0;
table_row_count[i] = 0;
}
}
// TODO: 填充first, follow和table数组
// 打印预测分析表C
for (int i = 0; i < MAX_ROW; i++) {
if (table_row_count[i] > 0) {
print_table_row(i);
}
}
return 0;
}
```
其中,`first`数组用于存储非终结符和终结符的FIRST集,`first_count`数组用于记录每个FIRST集中元素的个数;`follow`数组用于存储非终结符的FOLLOW集,`follow_count`数组用于记录每个FOLLOW集中元素的个数;`table`数组用于存储预测分析表C,`table_row_count`数组用于记录每个非终结符的表项数目。
在填充完`first`、`follow`和`table`数组后,我们可以通过以下代码打印预测分析表C:
```c
// 打印预测分析表C
for (int i = 0; i < MAX_ROW; i++) {
if (table_row_count[i] > 0) {
print_table_row(i);
}
}
```
其中,`print_table_row`函数用于打印预测分析表C中某个非终结符对应的表项:
```c
void print_table_row(int non_terminal) {
printf("C[%d] = { ", non_terminal);
for (int i = 0; i < table_row_count[non_terminal]; i++) {
printf("%c -> %s, ", table[non_terminal][i][0], table[non_terminal][i] + 2);
}
printf("}\n");
}
```
该函数首先打印非终结符的编号,然后依次打印该非终结符的每个表项,每个表项包括一个终结符和对应的产生式。注意,在`table`数组中,每个表项的第一个字符为终结符,后面跟着一个箭头符号`->`和对应的产生式。因此,我们需要通过`table[non_terminal][i][0]`和`table[non_terminal][i] + 2`分别获取表项中的终结符和产生式,并将其打印出来。
综上,我们可以使用以上代码实现LL(1)语法分析程序,并打印预测分析表C。
阅读全文