C语言实现CFGG的可空变量集U,输入:CFGG={V,T,P,S},输出:G的可空变量集U。算法
时间: 2023-08-13 16:09:03 浏览: 42
算法如下:
1. 初始化可空变量集U为空集
2. 遍历所有产生式P,对于每个产生式p=(A,α),执行以下步骤:
1. 如果α为空串,则将A加入到U中
2. 否则,将A加入到U中,如果α首符号为非终结符B,则将B加入到U中
3. 重复执行步骤2直到所有产生式都被遍历完毕
4. 返回可空变量集U
具体实现代码如下:
```c
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 100
char V[MAX_SIZE]; // 非终结符集合
char T[MAX_SIZE]; // 终结符集合
char P[MAX_SIZE][MAX_SIZE]; // 产生式集合
char U[MAX_SIZE]; // 可空变量集合
int main() {
int i, j, flag;
char A, *alpha;
int n; // 产生式数量
// 输入CFG G = {V,T,P,S}
printf("Enter the grammar (V, T, P, S):\n");
printf("V = ");
scanf("%s", V);
printf("T = ");
scanf("%s", T);
printf("P = \n");
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%s", P[i]);
}
char S = P[0][0]; // 开始符号
// 初始化可空变量集合为空集
memset(U, 0, sizeof(U));
// 遍历所有产生式
do {
flag = 0;
for (i = 0; i < n; i++) {
A = P[i][0]; // 产生式左部非终结符
alpha = &P[i][2]; // 产生式右部串
if (strcmp(alpha, "ε") == 0) { // α为空串
if (U[A - 'A'] == 0) {
U[A - 'A'] = 1; // 将A加入到U中
flag = 1;
}
} else {
for (j = 0; j < strlen(alpha); j++) {
if (alpha[j] >= 'A' && alpha[j] <= 'Z') { // 非终结符
if (U[alpha[j] - 'A'] == 1) { // B已经在U中
continue;
} else {
break;
}
} else { // 终结符
break;
}
}
if (j == strlen(alpha)) { // α中所有符号都在U中
if (U[A - 'A'] == 0) {
U[A - 'A'] = 1; // 将A加入到U中
flag = 1;
}
}
}
}
} while (flag);
// 输出可空变量集合
printf("U = { ");
for (i = 0; i < strlen(V); i++) {
if (U[V[i] - 'A'] == 1) {
printf("%c ", V[i]);
}
}
printf("}\n");
return 0;
}
```
注:上述代码假设非终结符用大写字母表示,终结符用小写字母表示,空串用 ε 表示。