news 2026/7/3 4:56:18

运算表达式求值(递归下降分析法)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
运算表达式求值(递归下降分析法)

author: hjjdebug
date: 2026年 01月 12日 星期一 15:12:49 CST
descrip: 运算表达式求值(递归下降分析法)


运算是简单的,但分析是复杂的,需要应对各种用户的输入,并给出结果或错误提示!
怎么应对用户的灵活输入, 那就是3个分析函数. 并且是递归下降的.
所谓下降,就是一个套一个,越向下级别越低.(实际是优先级更高)
递归,则是自己直接或间接调用自己. 当然了,参数肯定要不一样了.

代码特点:
实现了完整的递归下降解析器,包含加减解析、乘除解析和因子解析三个解析函数 符合编译原理中的经典解析方法
支持浮点数操作
支持负数和正数符号处理
具备完善的错误处理机制,包括非法字符检测、括号匹配检查、除零错误等
支持连续计算和退出命令
包含详细的注释说明各个功能模块的作用

200行代码,就是逐级分析实现句法功能.

附录: 完整代码

$cat main.c#include<stdio.h>#include<stdlib.h>#include<ctype.h>//for isdigit#include<string.h>#include<math.h>//for fabs// 全局变量char*expression;intpos;inthasErr;//基本函数// 跳过空格voidskipSpaces(){while(expression[pos]==' '){pos++;}}// 检查是否为操作符intisOperator(charc){return(c=='+'||c=='-'||c=='*'||c=='/');}// 把分析进一步分割为分析加减法,分析乘除法,分析基本项// 它们构成递归下降分析. 上层只需要调用顶层即可.doubleparseAdd();doubleparseMultiple();doubleparseItem();// 解析因子(处理数字和括号)doubleparseItem(){if(hasErr)return0.0;skipSpaces();// 处理负号if(expression[pos]=='-'){pos++;skipSpaces();return-parseItem();}// 处理正号if(expression[pos]=='+'){pos++;returnparseItem();}// 处理括号if(expression[pos]=='('){pos++;doubleresult=parseAdd();if(hasErr)return0.0;skipSpaces();if(expression[pos]!=')'){printf("错误: 缺少右括号\n");hasErr=1;return0.0;}pos++;returnresult;}// 处理数字(包括浮点数)if(isdigit(expression[pos])||expression[pos]=='.'){doublenum=0.0;doubledecimalBase=0.1;// 处理整数部分while(isdigit(expression[pos])){num=num*10+(expression[pos]-'0');pos++;}// 处理小数部分if(expression[pos]=='.'){pos++;while(isdigit(expression[pos])){num+=(expression[pos]-'0')*decimalBase;decimalBase*=0.1;pos++;}}returnnum;}// 处理非法字符if(expression[pos]!='\0'&&!isOperator(expression[pos])&&expression[pos]!=')'){printf("错误: 非法字符 '%c'\n",expression[pos]);hasErr=1;return0.0;}printf("错误: 表达式格式错误\n");hasErr=1;return0.0;}// 解析项(处理乘法和除法)doubleparseMultiple(){if(hasErr)return0.0;doubleresult=parseItem();while(expression[pos]=='*'||expression[pos]=='/'){charop=expression[pos];pos++;skipSpaces();doubleright=parseItem();if(hasErr)return0.0;if(op=='*'){result*=right;}else{if(fabs(right)<1e-10){// 浮点数比较printf("错误: 除零错误\n");hasErr=1;return0.0;}result/=right;}}returnresult;}// 解析表达式(处理加法和减法)doubleparseAdd(){if(hasErr)return0.0;doubleresult=parseMultiple();while(expression[pos]=='+'||expression[pos]=='-'){charop=expression[pos];pos++;skipSpaces();doubleright=parseMultiple();if(hasErr)return0.0;if(op=='+'){result+=right;}else{result-=right;}}returnresult;}// 主函数intmain(){charinput[1000];printf("递归下降表达式求值程序(支持浮点数)\n");printf("支持 +, -, *, /, (), 负数, 浮点数\n");printf("输入 'quit' 退出程序\n\n");while(1){printf("请输入表达式: ");if(!fgets(input,sizeof(input),stdin)){break;}// 去除换行符input[strcspn(input,"\n")]=0;// 检查退出命令if(strcmp(input,"quit")==0){printf("程序退出\n");break;}// 初始化全局变量expression=input;pos=0;hasErr=0;// 检查空输入skipSpaces();if(expression[pos]=='\0'){printf("错误: 空表达式\n\n");continue;}// 解析表达式doubleresult=parseAdd();// 检查是否有多余的字符skipSpaces();if(expression[pos]!='\0'&&!hasErr){printf("错误: 表达式格式错误,多余字符 '%c'\n",expression[pos]);}elseif(!hasErr){printf("结果: %.6f\n",result);}printf("\n");}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 13:39:27

从零开始使用PDF-Extract-Kit镜像,轻松提取公式与表格

从零开始使用PDF-Extract-Kit镜像&#xff0c;轻松提取公式与表格 引言 在学术研究和工程实践中&#xff0c;处理PDF文档中的公式和表格是一项常见且繁琐的任务。传统的手动提取方式不仅耗时费力&#xff0c;还容易出错。为了解决这一痛点&#xff0c;我们引入了PDF-Extract-K…

作者头像 李华
网站建设 2026/6/23 16:42:22

零代码玩转AI分类器:云端可视化工具,2块钱体验高级功能

零代码玩转AI分类器&#xff1a;云端可视化工具&#xff0c;2块钱体验高级功能 引言&#xff1a;电商店主的新利器 作为电商店主&#xff0c;你是否每天被海量商品评论淹没&#xff1f;好评、差评、咨询、投诉混杂在一起&#xff0c;手动分类不仅耗时费力&#xff0c;还可能错…

作者头像 李华
网站建设 2026/7/1 23:03:53

SpringBoot + LangChain4j + Ollama:本地大模型接入 Java 应用,智能客服快速落地

传统客服的痛点 在我们的日常开发中,经常遇到这样的需求: 客服每天重复回答同样的问题:"我的订单怎么还没到?" 客服人手不够,高峰期响应慢 人工客服培训成本高,服务质量参差不齐 节假日人力成本高,但业务不能停 传统的人工客服不仅成本高,而且效率低下。…

作者头像 李华
网站建设 2026/6/16 20:36:56

10分钟教你完全掌握防火墙配置!!!!!

今日提问 1.防火墙支持那些NAT技术&#xff0c;主要应用场景是什么&#xff1f; 2.当内网PC通过公网域名解析访问内网服务器时&#xff0c;会存在什么问题&#xff0c;如何解决&#xff1f;请详细说明 3.防火墙使用VRRP实现双机热备时会遇到什么问题&#xff0c;如何解决&#…

作者头像 李华
网站建设 2026/6/14 4:58:19

万能分类器图像分类实战:云端GPU 10分钟出结果,3块钱玩整天

万能分类器图像分类实战&#xff1a;云端GPU 10分钟出结果&#xff0c;3块钱玩整天 1. 为什么你需要云端GPU分类器&#xff1f; 作为一名摄影师&#xff0c;你可能遇到过这样的烦恼&#xff1a;数万张照片堆积在硬盘里&#xff0c;手动分类耗时耗力。家用电脑跑不动AI大模型&…

作者头像 李华
网站建设 2026/6/25 13:12:52

AI分类数据增强:万能分类器+GAN联动实战教程

AI分类数据增强&#xff1a;万能分类器GAN联动实战教程 引言 在AI模型训练中&#xff0c;数据就像燃料一样重要。但现实中我们常常遇到数据不足、样本不均衡的问题&#xff0c;就像厨师想做满汉全席却发现食材种类太少。这时候数据增强技术就能派上大用场&#xff0c;它能让有…

作者头像 李华