用c语言写一个语法分析之递归下降法分析程序用来 判断文法: S->aSb|c|ε (2)分析句子:aabb
时间: 2024-03-13 16:46:17 浏览: 60
好的,下面是使用递归下降法对文法 S->aSb|c|ε 进行语法分析的 C 语言代码,用来判断句子 "aabb" 是否符合该文法规则:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str[100]; // 存储输入的句子
int index = 0; // 当前分析的字符位置
void S(); // 分析 S
void match(char c); // 匹配字符 c
int main() {
printf("请输入要分析的句子:");
scanf("%s", str);
S(); // 分析 S
if (index == strlen(str)) {
printf("句子 %s 符合文法规则\n", str);
} else {
printf("句子 %s 不符合文法规则\n", str);
}
return 0;
}
void S() {
if (str[index] == 'a') {
match('a');
S();
match('b');
} else if (str[index] == 'c') {
match('c');
} else {
// 空产生式
}
}
void match(char c) {
if (str[index] == c) {
index++;
} else {
printf("Error: 缺少字符 %c\n", c);
exit(1);
}
}
```
在上面的代码中,我们首先定义了一个字符串数组 `str` 来存储输入的句子,一个整数变量 `index` 来表示当前分析到的字符位置。然后,我们定义了两个函数 `S()` 和 `match()`,其中 `S()` 函数用来分析非终结符 S,`match()` 函数用来匹配字符。
在 `S()` 函数中,我们首先判断当前字符是否为 'a',如果是,则匹配 'a',然后递归调用 `S()` 函数,再匹配 'b';如果当前字符为 'c',则直接匹配 'c';如果当前字符为空,则表示 S 可以推导出空产生式,直接返回即可。
在 `match()` 函数中,我们判断当前字符是否与参数 c 相等,如果相等,则将 `index` 加 1,表示已经匹配过该字符;如果不相等,则输出错误信息并退出程序。
最后,在 `main()` 函数中,我们首先让用户输入要分析的句子,然后调用 `S()` 函数进行语法分析。如果分析完毕后,当前字符位置等于句子长度,则说明句子符合文法规则,输出相应的信息;否则,说明句子不符合文法规则,也输出相应的信息。
对于分析句子 "aabb",程序的运行过程如下:
1. 用户输入要分析的句子 "aabb"。
2. 程序开始分析 S,发现当前字符为 'a',匹配 'a'。
3. 递归调用 S() 函数,开始分析 S,发现当前字符为 'a',匹配 'a'。
4. 递归调用 S() 函数,开始分析 S,发现当前字符为 'a',匹配 'a'。
5. 递归调用 S() 函数,开始分析 S,发现当前字符为 'b',匹配 'b'。
6. 返回上一层递归,继续分析上一层的 S,发现当前字符为 'b',匹配 'b'。
7. 返回上一层递归,继续分析上一层的 S,发现当前字符已经分析完毕,返回。
8. 返回上一层递归,继续分析上一层的 S,发现当前字符已经分析完毕,返回。
9. 返回上一层递归,继续分析上一层的 S,发现当前字符已经分析完毕,返回。
10. 程序分析完毕,输出句子 "aabb" 符合文法规则。
因此,可以看出句子 "aabb" 符合文法规则。
阅读全文