请帮我写一个统计文法非终结符和终结符次数的c语言代码
时间: 2023-05-21 13:06:36 浏览: 87
当然可以,以下是一个简单的实现:
```c
#include <stdio.h>
#include <ctype.h>
#define MAX_LEN 100
int main() {
char input[MAX_LEN];
int non_terminal = 0, terminal = 0;
printf("请输入字符串:");
fgets(input, MAX_LEN, stdin);
for (int i = 0; input[i] != '\0'; i++) {
if (isupper(input[i])) {
non_terminal++;
}
else if (islower(input[i])) {
terminal++;
}
}
printf("非终结符数量:%d\n", non_terminal);
printf("终结符数量:%d\n", terminal);
return 0;
}
```
其基本思路是读入一个字符串,然后逐个字符判断是否是大写字母(代表非终结符)或小写字母(代表终结符),统计它们的数量并输出。
我希望这个代码对您有帮助。
相关问题
LL(1)分析-判断非终结符是否可以推出空 C语言代码
LL(1)分析是一种自上而下的语法分析方法,可以用来判断一个文法是否符合LL(1)文法的要求。LL(1)文法要求在任何情况下,对于任何一个非终结符,它的每个可能的产生式的首符号集合都不相交。
在判断一个非终结符是否可以推出空的C语言代码时,可以先将该非终结符的所有产生式的首符号集合求出来,如果这些集合中有一个集合包含了空串(即该非终结符可以推出空串),则说明该非终结符可以推出空的C语言代码。
例如,对于以下的C语言代码的文法:
```
<statement> -> <assignment> | <if_statement> | ε
<assignment> -> <identifier> = <expression>
<if_statement> -> if (<condition>) <statement>
<identifier> -> a | b | c
<expression> -> 1 | 2 | 3
<condition> -> true | false
```
可以发现,在语法规则`<statement> -> ε`中,`<statement>`可以推出空串。因此,该文法中的非终结符`<statement>`可以推出空的C语言代码。
用C语言写一个消除文法左递归的代码
以下是一个简单的C语言代码示例,用于消除文法中的左递归:
```
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
int main() {
char prod[MAX_SIZE][MAX_SIZE], nonTerm[MAX_SIZE];
int n, i, j, k;
printf("Enter the number of productions: ");
scanf("%d", &n);
printf("Enter the productions: \n");
for(i=0; i<n; i++) {
scanf("%s", prod[i]);
}
printf("Enter the non-terminal: ");
scanf("%s", nonTerm);
for(i=0; i<n; i++) {
if(prod[i][0] == nonTerm[0]) {
char alpha[MAX_SIZE] = "", beta[MAX_SIZE] = "";
int flag = 0;
for(j=2; j<strlen(prod[i]); j++) {
if(prod[i][j] == '|' || j == strlen(prod[i])-1) {
if(j == strlen(prod[i])-1) {
strncat(beta, &prod[i][j], 1);
}
if(flag == 0) {
strcat(alpha, &prod[i][j+1]);
flag = 1;
} else {
strcat(beta, &prod[i][j+1]);
}
}
}
printf("%c' -> %s%c'\n", nonTerm[0], beta, nonTerm[0]);
for(j=0; j<n; j++) {
if(prod[j][0] == nonTerm[0]) {
char newProd[MAX_SIZE] = "";
strcat(newProd, alpha);
strcat(newProd, "'");
strcat(newProd, "|");
strcat(newProd, prod[j]+2);
printf("%c -> %s\n", nonTerm[0], newProd);
} else {
printf("%s\n", prod[j]);
}
}
printf("%c' -> epsilon\n", nonTerm[0]);
break;
}
}
if(i == n) {
printf("No left recursion found!\n");
}
return 0;
}
```
这个程序接受用户输入的文法产生式和非终结符,并使用以下算法消除文法中的左递归:
1. 扫描每个产生式,如果它的左部与输入的非终结符相同,则将其分解为两个子串 alpha 和 beta,其中 beta 开头的符号与输入的非终结符相同。
2. 使用新的非终结符替换原始产生式的左部,并生成两个新的产生式,一个是新的非终结符和 beta,另一个是新的非终结符和 alpha 后跟新的非终结符的符号。
3. 如果原始产生式右部结束,那么添加一个新的产生式,将新的非终结符替换为 epsilon。
这个程序只处理一个左递归的情况,如果文法中有多个左递归,需要对每个左递归运行该程序。