请帮我写一个统计文法非终结符和终结符次数的c语言代码
时间: 2023-05-21 11:06:36 浏览: 120
当然可以,以下是一个简单的实现:
```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;
}
```
其基本思路是读入一个字符串,然后逐个字符判断是否是大写字母(代表非终结符)或小写字母(代表终结符),统计它们的数量并输出。
我希望这个代码对您有帮助。
相关问题
上下无关文法输入统计终结符及非终结符C语言代码
上下文无关文法(Context-Free Grammar, CFG)是一种用于描述编程语言、算法等结构的规则系统。在C语言中,虽然直接编写统计终结符和非终结符的代码不是常见的需求,但如果你需要分析或生成语法树,可以利用数据结构如堆栈或队列,结合递归-descent解析或词法分析器库(例如Flex + Bison)来间接处理。
以下是一个简单的伪代码示例,展示了如何在C语言中处理上下文无关文法的基本步骤:
```c
typedef enum { Terminal, NonTerminal } SymbolType;
// 定义符号表
struct Grammar {
char* terminalSymbols[/*数量*/];
char* nonTerminalSymbols[/*数量*/];
int startSymbolIndex;
};
// 统计终结符和非终结符
void countSymbols(struct Grammar* grammar) {
int terminals = 0, nonTerminals = 0;
for (int i = 0; i < sizeof(grammar->terminalSymbols)/sizeof(char*); i++) {
if (grammar->terminalSymbols[i]) {
if (grammar->symbolType[i] == Terminal)
terminals++;
} else if (grammar->nonTerminalSymbols[i]) {
if (grammar->symbolType[i] == NonTerminal)
nonTerminals++;
}
}
printf("终结符数量: %d\n", terminals);
printf("非终结符数量: %d\n", nonTerminals);
}
// 示例中的其他函数,用于处理文法解析和构建树形结构,这里省略
int main() {
// 初始化和填充语法信息...
countSymbols(grammar);
// 其他语法处理代码...
return 0;
}
```
请注意,这只是一个简化的例子,并未包括真正的语法分析逻辑。实际操作中会涉及到更复杂的解析算法和库支持。
给定文法G[H]:(H1为非终结符) H-> MH1 H1-> ;MH1|空串 M-> d|aHb 编写该文法非终结符的递归下降子程序代码,用c语言,匹配指令使用Match()
以下是该文法的非终结符的递归下降子程序代码,使用C语言编写,其中Match()函数用于匹配指令:
```c
#include <stdio.h>
#include <ctype.h>
char lookahead;
void Match(char c)
{
if (lookahead == c)
lookahead = getchar();
else
printf("error\n");
}
void H()
{
M();
H1();
}
void H1()
{
if (lookahead == ';')
{
Match(';');
M();
H1();
}
else
return;
}
void M()
{
if (lookahead == 'd')
{
Match('d');
}
else if (lookahead == 'a')
{
Match('a');
H1();
Match('b');
}
else
printf("error\n");
}
int main()
{
lookahead = getchar();
H();
if (lookahead != '\n')
printf("error\n");
return 0;
}
```
阅读全文