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


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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1149520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上下文图谱(Context Graphs):从0到1构建AI时代的决策系统,程序员必看收藏

下文图谱(Context Graphs)&#xff1a;从0到1构建AI时代的决策系统&#xff0c;程序员必看收藏 上下文图谱是AI时代的下一个万亿美元机遇。它将智能体执行时的决策痕迹&#xff08;为什么这么做&#xff09;捕获下来&#xff0c;形成可搜索的图谱&#xff0c;成为企业新的&quo…

万能分类器+云端GPU:个人开发者的性价比之选

万能分类器云端GPU&#xff1a;个人开发者的性价比之选 作为一名独立开发者&#xff0c;接外包项目时经常遇到客户需要AI功能的需求。但自己购买高端显卡不仅成本高&#xff0c;回本周期还长。本文将介绍如何利用云端GPU资源和万能分类器技术&#xff0c;以最低成本实现AI功能…

中文实体识别新利器|AI 智能实体侦测服务镜像上线

中文实体识别新利器&#xff5c;AI 智能实体侦测服务镜像上线 随着自然语言处理&#xff08;NLP&#xff09;技术的不断演进&#xff0c;命名实体识别&#xff08;Named Entity Recognition, NER&#xff09;作为信息抽取的核心任务之一&#xff0c;在智能客服、知识图谱构建、…

Java实习模拟面试之蚂蚁金服后端校招一面:深入考察日志、并发、事务与算法

Java实习模拟面试之蚂蚁金服后端校招一面&#xff1a;深入考察日志、并发、事务与算法 关键词&#xff1a;蚂蚁金服、Java后端、校招一面、死锁、线程安全、事务隔离、螺旋矩阵、原地去重 前言 大家好&#xff0c;我是正在备战互联网大厂后端开发岗位的应届生。最近我进行了一…

万能分类器多模态应用:图文分类云端一键部署,3步搞定

万能分类器多模态应用&#xff1a;图文分类云端一键部署&#xff0c;3步搞定 引言&#xff1a;当产品经理遇上多模态AI 作为产品经理&#xff0c;你是否经常遇到这样的困境&#xff1a;需要评估图像和文本分类功能在产品中的应用可能性&#xff0c;但技术团队资源紧张&#x…

防坑指南:购买AI分类服务前必做的5项测试

防坑指南&#xff1a;购买AI分类服务前必做的5项测试 引言 在企业数字化转型浪潮中&#xff0c;AI分类服务已成为提升运营效率的利器。但很多采购负责人都有过这样的经历&#xff1a;供应商演示时效果惊艳&#xff0c;实际部署后却大打折扣。这不仅造成资金浪费&#xff0c;更…

术语干预+上下文理解,HY-MT1.5让翻译更智能

术语干预上下文理解&#xff0c;HY-MT1.5让翻译更智能 1. 引言&#xff1a;翻译模型的智能化演进 随着全球化进程加速&#xff0c;跨语言沟通需求激增&#xff0c;传统机器翻译已难以满足复杂场景下的精准表达。尽管大模型在自然语言处理领域取得显著进展&#xff0c;但在术语…

图像分类新选择:万能分类器实测,云端GPU比本地快5倍

图像分类新选择&#xff1a;万能分类器实测&#xff0c;云端GPU比本地快5倍 引言&#xff1a;为什么你需要关注这个分类器&#xff1f; 作为一名计算机视觉爱好者&#xff0c;你可能经常遇到这样的困扰&#xff1a;想测试最新的图像分类算法&#xff0c;但家用显卡性能有限&a…

运算表达式求值c代码(用栈实现)

author: hjjdebug date: 2026年 01月 12日 星期一 14:27:03 CST descrp: 运算表达式求值c代码(用栈实现) 文章目录1. 运算是计算机的强项2 字符串解析函数3. 代码说明:4. 代码计算机与人的接口. 让计算机理解人的意图.计算机最擅长固定的操作, 它的要素是存储数据,对数据运算.人…

AI智能实体侦测服务核心优势解析|高精度NER+动态彩色高亮

AI智能实体侦测服务核心优势解析&#xff5c;高精度NER动态彩色高亮 在信息爆炸的时代&#xff0c;非结构化文本数据如新闻、社交媒体内容、企业文档等呈指数级增长。如何从这些杂乱无章的文字中快速提取关键信息&#xff0c;成为提升信息处理效率的核心挑战。传统的关键词匹配…

别只看不练!30+程序员2个月转行大模型,2w+offer经验全分享,收藏这篇就够了!

30程序员2个月转行大模型&#xff0c;2woffer经验全分享&#xff0c;收藏这篇就够了&#xff01; 一位30北漂程序员在十年工作后感到职业瓶颈&#xff0c;决定转行大模型领域。文章详细分析了大模型两类岗位&#xff08;算法工程师和应用工程师&#xff09;&#xff0c;选择了…

大学生不要一边做一边怀疑

你有没有过这样的经历&#xff1a;面对一个任务&#xff0c;还没开始做就已经在心里反复纠结“我这样对吗&#xff1f;”“这样做能行吗&#xff1f;”结果时间一点点过去&#xff0c;事情却没多少进展。 我见过那些做事高效的人&#xff0c;他们的秘诀其实很简单——先动手&am…

避坑!AI分类器环境配置:为什么99%新手会失败

避坑&#xff01;AI分类器环境配置&#xff1a;为什么99%新手会失败 引言 作为一名自学AI的程序员&#xff0c;你是否经历过这样的噩梦&#xff1a;花了两周时间配置环境&#xff0c;结果各种版本冲突、依赖缺失、CUDA报错接踵而至&#xff1f;根据我的实战经验&#xff0c;9…

如何高效部署多语言翻译模型?HY-MT1.5镜像快速上手

如何高效部署多语言翻译模型&#xff1f;HY-MT1.5镜像快速上手 在跨语言交流需求日益增长的今天&#xff0c;高质量、低延迟的机器翻译能力已成为智能应用的核心基础设施。腾讯开源的 HY-MT1.5 系列翻译模型&#xff0c;凭借其“小模型快部署、大模型强性能”的双轨设计&#…

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

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

视觉代理新体验|Qwen3-VL-WEBUI助力Dify平台实现GUI操作自动化

视觉代理新体验&#xff5c;Qwen3-VL-WEBUI助力Dify平台实现GUI操作自动化 在AI技术快速演进的今天&#xff0c;多模态大模型正从“能看懂图像”迈向“能操作界面”的全新阶段。传统的视觉理解系统大多停留在图文描述、OCR识别或内容摘要层面&#xff0c;而新一代视觉语言模型…

AI视觉新突破:MiDaS单目深度估计实战应用与性能评测

AI视觉新突破&#xff1a;MiDaS单目深度估计实战应用与性能评测 1. 引言&#xff1a;从2D图像到3D空间感知的AI跃迁 在计算机视觉领域&#xff0c;如何让机器“理解”真实世界的三维结构一直是一个核心挑战。传统方法依赖双目立体视觉或多传感器融合&#xff08;如LiDAR&…

高效多语言互译新选择|基于HY-MT1.5大模型镜像实战解析

高效多语言互译新选择&#xff5c;基于HY-MT1.5大模型镜像实战解析 1. 引言&#xff1a;多语言翻译的工程挑战与HY-MT1.5的破局之道 在全球化数字服务快速发展的背景下&#xff0c;高质量、低延迟的机器翻译能力已成为企业出海、内容本地化和跨语言协作的核心基础设施。然而&…

AI分类竞赛夺冠秘籍:弹性GPU+万能分类器调优

AI分类竞赛夺冠秘籍&#xff1a;弹性GPU万能分类器调优 引言&#xff1a;为什么你需要这套方案&#xff1f; 参加Kaggle等AI竞赛时&#xff0c;决赛阶段往往面临一个关键挑战&#xff1a;当其他选手都在使用复杂模型集成和大量数据增强时&#xff0c;如何让自己的方案脱颖而出…

AI分类模型解释性:万能分类器决策可视化云端工具

AI分类模型解释性&#xff1a;万能分类器决策可视化云端工具 引言 在金融风控领域&#xff0c;AI分类模型已经成为不可或缺的分析工具。但传统模型往往存在一个痛点&#xff1a;它们能给出"是什么"的答案&#xff0c;却无法解释"为什么"。想象一下&#…