酷代码 AI
菜单
全部AI  /  AI写代码神器
服务商

递归下降语法分析程序举例 本例文法: g[<表达式>]: g[e]: <表达式>→<表达式>+<项>|<表达式>-<项>|<项> e→e+t|t <项>→<项>*<因式>|<项>/<因式>|<因式> t→t*f|f <因式>→<标识符>|<无符号整数>|(<表达式>) f→i|(e) #include <stdio.h> #include <dos.h> #include <stdlib.h> #include <string.h> char a[50],b[50],d[200],e[10];/*数组a存输入串,数组d存推导式,*/ char ch; int n1,i1=0,flag=1,n=5; /*flag=1处理非终结符,flag=0处理终结符*/ int total=0; /*步骤计数器*/ int e(); int e1(); int t(); int g();/*e’*/ int s();/*t’*/ int f(); void input(); void input1(

以下是为您补充的 3 点额外需要注意的逻辑点: 1. 对于输入字符串的处理,要确保格式的正确性和完整性,避免因输入错误导致程序异常。 2. 在递归调用各个函数时,要注意控制递归的深度,防止出现栈溢出的情况。 3. 对于符号的判断和处理要准确无误,特别是运算符的优先级和结合性。 以下是为您编写的递归下降语法分析程序的完整代码及 ```c #include <stdio.h> #include <dos.h> #include <stdlib.h> #include <string.h> char a[50], b[50], d[200], e[10]; /*数组 a 存输入串,数组 d 存推导式,*/ char ch; int n1, i1 = 0, flag = 1, n = 5; /*flag=1 处理非终结符,flag=0 处理终结符*/ int total = 0; /*步骤计数器*/ // 处理表达式 e int e() { if (t()) { // 先处理项 t if (ch == '+' || ch == '-') { // 如果后面是 + 或 - strcpy(d + strlen(d), "e->e"); // 记录推导式 strcat(d + strlen(d), e[total++] + '0'); // 步骤计数 strcat(d + strlen(d), " + t\n"); ch = a[i1++]; // 读取下一个字符 if (e1()) { // 处理表达式 e 的后续部分 return 1; } } else { return 1; } } return 0; } // 处理表达式 e 的后续部分 e1 int e1() { if (t()) { // 处理项 t if (ch == '+') { // 如果是 + strcpy(d + strlen(d), "e->e"); strcat(d + strlen(d), e[total++] + '0'); strcat(d + strlen(d), " + t\n"); ch = a[i1++]; if (e1()) { // 继续处理 e1 return 1; } } else if (ch == '-') { // 如果是 - strcpy(d + strlen(d), "e->e"); strcat(d + strlen(d), e[total++] + '0'); strcat(d + strlen(d), " - t\n"); ch = a[i1++]; if (e1()) { // 继续处理 e1 return 1; } } else { return 1; } } return 0; } // 处理项 t int t() { if (f()) { // 先处理因式 f if (ch == '*' || ch == '/') { // 如果后面是 * 或 / strcpy(d + strlen(d), "t->t"); strcat(d + strlen(d), e[total++] + '0'); strcat(d + strlen(d), " * f\n"); ch = a[i1++]; if (s()) { // 处理项 t 的后续部分 return 1; } } else { return 1; } } return 0; } // 处理项 t 的后续部分 s int s() { if (f()) { // 处理因式 f if (ch == '*') { // 如果是 * strcpy(d + strlen(d), "t->t"); strcat(d + strlen(d), e[total++] + '0'); strcat(d + strlen(d), " * f\n"); ch = a[i1++]; if (s()) { // 继续处理 s return 1; } } else if (ch == '/') { // 如果是 / strcpy(d + strlen(d), "t->t"); strcat(d + strlen(d), e[total++] + '0'); strcat(d + strlen(d), " / f\n"); ch = a[i1++]; if (s()) { // 继续处理 s return 1; } } else { return 1; } } return 0; } // 处理因式 f int f() { if (ch >= 'a' && ch <= 'z') { // 如果是标识符 strcpy(d + strlen(d), "f->i\n"); ch = a[i1++]; return 1; } else if (ch >= '0' && ch <= '9') { // 如果是无符号整数 strcpy(d + strlen(d), "f->n\n"); ch = a[i1++]; return 1; } else if (ch == '(') { // 如果是左括号 ch = a[i1++]; if (e()) { // 处理表达式 e if (ch == ')') { // 如果后面是右括号 ch = a[i1++]; strcpy(d + strlen(d), "f->(e)\n"); return 1; } } } return 0; } // 输入函数 void input() { printf("请输入表达式:"); scanf("%s", a); } int main() { input(); // 调用输入函数获取表达式 ch = a[i1++]; if (e() && ch == '\0') { // 进行表达式的分析 printf("分析成功\n"); printf("%s", d); // 输出推导式 } else { printf("分析失败\n"); } return 0; } ``` [2024-12-12 22:46:04 | AI写代码神器 | 1371点数解答]

热门AI查看更多
“AI写代码神器”擅长各种语言编程、解释代码、注解补充。 在这里填写你的问题。如:写出java冒泡排序算法。
一个入口掌握所有。 在这输入任何问题,或者要AI输出的内容。
将阿拉伯数字转为人明币大写,如:数字1000转换为壹仟。
AI生成爆文标题,能够快速创作出极具吸引力的标题,促使短视频、自媒体文章的点击率与阅读量迅猛攀升。 此处填写一个原始标题,如:一般人怎样打理自身的社交圈?
AI生成新闻评论。 在这里填入新闻内容。
AI生成内容摘要。 在此处填入需要生成摘要的内容,还可以输入4000字。
AI生成主持词,擅长团建、年会、婚礼、节日等场合的主持词编写。 在这里填入主持场景,如:运动会
AI快速生成周报、月报、日报、年终总结等各类总结报告。 在这里简单输入工作目标、指标、成果,没有任何格式或特殊需求。如:计划年销售业绩1000万,实际完成800万。
输入一个字,显示以这个字开头的歇后语
输入一个字,显示以这个字开头的成语
极速在线生成证件照
极速更换证件照红、蓝、白底色
实用工具查看更多
数独游戏 [娱乐类]
数独(Sudoku)是经典的9x9数字逻辑谜题。在有81个小格的九宫格内,玩家依据初始数字推理填入1 - 9的数字,要保证每行、每列以及每个3x3宫格中的数字都不重复。这款在线数独游戏有多难度可选,没有头绪时,可以点开答案看一下哦^_^
3D魔方 [娱乐类]
基于three.js的小游戏,锻炼玩家的眼力和反应力,非常不错
经典推箱子 [娱乐类]
基于H5的经典推箱子小游戏,锻炼玩家的眼力和反应力,非常不错
摸鱼五子棋 [娱乐类]
基于H5的五子棋人机对练,锻炼玩家的眼力和反应力,非常不错
速度打字机 [娱乐类]
打字速度挑战游戏可以训练玩家的打字速度与准确率。玩家要在给定时间内输入尽量多的单词或句子,从而在规定时间里争取获得最高分。
键盘打字 [娱乐类]
基于H5的键盘打字小游戏,锻炼玩家的眼力和反应力,非常不错
扫雷 [娱乐类]
基于H5的小游戏,锻炼玩家的眼力和反应力,非常不错
2048 [娱乐类]
H5版2048小游戏,锻炼玩家的前瞻力,非常不错
36万 进入2048
相关提问