S->+SS |*SS |a 实现递归下降语法分析,合法的输入串输出“Yes”;不合法的输出“No”,并输出错误位置信息。用c语言实现
时间: 2024-02-06 13:12:20 浏览: 62
以下是基于输入字符串为 char* str 的递归下降语法分析的 C 语言代码(假设输入字符串以 '\0' 结尾):
```c
#include <stdio.h>
#include <stdlib.h>
char* str; // 全局变量,指向当前待分析的字符串位置
// E -> +EE | *EE | a
int E() {
if (*str == '+') {
++str;
int ret = E() && E();
if (!ret) {
printf("No at position %d\n", (int)(str - 1 - input));
return 0;
}
return 1;
} else if (*str == '*') {
++str;
int ret = E() && E();
if (!ret) {
printf("No at position %d\n", (int)(str - 1 - input));
return 0;
}
return 1;
} else if (*str == 'a') {
++str;
return 1;
} else {
printf("No at position %d\n", (int)(str - input));
return 0;
}
}
int main() {
str = input;
if (E() && *str == '\0') {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
}
```
其中,`E()` 函数对应文法中的非终结符号 E,以递归下降的方式进行分析。每次调用 `E()` 时,根据当前字符判断应该选择哪一条产生式进行推导。如果推导失败,输出错误信息并返回 0;否则返回 1。在 `main()` 函数中,先将 `str` 指针指向输入字符串的起始位置,然后调用 `E()` 进行语法分析。如果 `E()` 返回 1 且当前字符为 '\0',则说明输入字符串合法。否则,说明输入字符串存在语法错误,输出错误信息并返回 0。
阅读全文