求first集的c语言代码
时间: 2023-10-22 11:23:31 浏览: 207
下面是一个简单的C语言程序,用于计算给定文法的First集合:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_RULES 100
#define MAX_SYMBOLS 100
char rules[MAX_RULES][MAX_SYMBOLS]; // 存放产生式的数组
int num_rules = 0; // 产生式的数量
// 判断一个符号是否是终结符
int is_terminal(char c) {
return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c == '+' || c == '-' || c == '*' || c == '/');
}
// 计算符号c的First集合
void first(char c, char *result, int *num_results) {
int i;
char first_symbol;
// 如果c是终结符,则First集合只包含自己
if (is_terminal(c)) {
result[0] = c;
*num_results = 1;
return;
}
// 否则,遍历所有产生式
for (i = 0; i < num_rules; i++) {
// 如果产生式左部等于c,则计算右部第一个符号的First集合
if (rules[i][0] == c) {
first_symbol = rules[i][2];
first(first_symbol, result, num_results);
// 如果First集合包含空串,则还要计算右部第二个符号的First集合
if (result[0] == '\0') {
first_symbol = rules[i][3];
first(first_symbol, result, num_results);
}
}
}
}
int main() {
int i, j, num_results;
char result[MAX_SYMBOLS];
// 读入产生式
printf("请输入产生式,以空行结束:\n");
while (fgets(rules[num_rules], MAX_SYMBOLS, stdin) != NULL && rules[num_rules][0] != '\n') {
num_rules++;
}
// 计算每个非终结符的First集合
for (i = 0; i < num_rules; i++) {
for (j = 0; j < strlen(rules[i]); j++) {
if (!is_terminal(rules[i][j])) {
first(rules[i][j], result, &num_results);
printf("First(%c) = { ", rules[i][j]);
for (int k = 0; k < num_results; k++) {
printf("%c ", result[k]);
}
printf("}\n");
}
}
}
return 0;
}
```
该程序使用了递归的方式计算First集合。在计算某个非终结符的First集合时,需要遍历所有产生式,找到左部等于该非终结符的产生式,并计算右部第一个符号的First集合。如果该First集合包含空串,则还要计算右部第二个符号的First集合,以此类推。如果该符号是终结符,则它的First集合只包含自己。
阅读全文