AI开发C语言应用按步走,表达式计算器calc的第四步,交互式 REPL 模式
📅 2026/7/20 10:48:14
👁️ 次浏览
calc4 — 交互式 REPL 模式1. 概述本次迭代在 calc3 求值器基础上增加交互式 REPL 模式Read-Eval-Print Loop提供实时运算体验并显示运算步骤。运行模式对比模式启动方式输出用途批处理./calc 表达式仅结果数字脚本调用、自动化测试交互式./calc无参数运算步骤 结果手动输入探索交互示例$ ./build/calc calc (90-18)/315 90 - 18 72 72 / 3 24 24 15 39 result: 39 calc 35*2 5 * 2 10 3 10 13 result: 13 calc exit2. 变更清单文件操作说明eval.h编辑新增eval_set_print_steps(int enable)声明eval.c编辑新增print_steps标志parse_expr和parse_term中每步运算插入步骤打印新增eval_set_print_steps实现main.c编辑新增repl()函数main()按参数有无分流批处理/交互模式其余文件无需改动parse.h/parse.c/Makefile/test.expr不变3. 交互模式设计3.1 main.c — REPL 循环staticintrepl(void){charbuf[MAX_INPUT];eval_set_print_steps(1);while(1){printf(calc );fflush(stdout);if(!fgets(buf,sizeof(buf),stdin))break;/* 去掉末尾换行符 */size_tlenstrlen(buf);if(len0buf[len-1]\n)buf[len-1]\0;if(strcmp(buf,exit)0)break;if(*buf\0)continue;intresult;if(eval_expr(buf,result)!0)continue;printf( result: %d\n,result);}return0;}核心逻辑打印calc提示符fflush确保立即显示fgets读取一行用户输入去掉末尾换行符判断exit→ 退出循环判断空行 → 跳过调用eval_expr求值 → 输出结果循环往复直到 EOF 或exit3.2 main() 分流intmain(intargc,char*argv[]){if(argc1){/* 批处理模式从命令行参数读取 */returnparse_and_eval(argv[1]);}/* 交互模式 */returnrepl();}有参数 → 批处理eval_set_print_steps(0)不输出步骤无参数 → 交互式 REPLeval_set_print_steps(1)输出步骤4. 运算步骤打印4.1 eval_set_print_steps APIvoideval_set_print_steps(intenable);在eval.c中通过print_steps静态变量控制eval_expr每次调用时会重置eval_error但保留print_steps标志。4.2 步骤打印位置在parse_expr和parse_term的每个二元运算完成后插入打印// parse_expr 中 —— 处理 -intresultleftright;if(print_steps)printf( %d %d %d\n,left,right,result);leftresult;// parse_term 中 —— 处理 * / %intresultleft*right;if(print_steps)printf( %d * %d %d\n,left,right,result);leftresult;4.3 优先级自动体现利用递归下降的天然求值顺序——内层语法层先求值外层后求值——步骤打印顺序自动反映运算符优先级输入步骤输出顺序说明35*25 * 2 10→3 10 13*行先于行(90-18)/31590 - 18 72→72 / 3 24→24 15 39括号内先求值无需额外排序逻辑打印顺序等于求值顺序。5. 目录结构更新后calc/ ├── Makefile # 构建脚本 ├── parse.h # tokenizer 头文件 ├── parse.c # tokenizer 实现 ├── eval.h # 求值器头文件含 eval_set_print_steps ├── eval.c # 递归下降求值器实现含步骤打印 ├── main.c # 入口程序批处理 REPL 双模式 ├── test.expr # 测试用例文件 ├── doc/ │ ├── calc1.md # 第一次构建tokenizer 基础 │ ├── calc2.md # 第二次构建取模、负号区分、测试套件 │ ├── calc3.md # 第三次构建表达式求值器 │ └── calc4.md # 本次构建交互式 REPL └── build/ └── calc6. 测试验证6.1 回归测试批处理模式不受影响make test9/9 全部 PASS$maketestcalc — 测试套件PASS[1](90-18)/315 →39PASS[2]10%3 →1PASS[3]-53 →-2PASS[4]3-5 →-2PASS[5](-3)→-3PASS[6](-820)%-3 →0PASS[7]35→8PASS[8]35 → error PASS[9]empty→ error9passed,0failed,9total6.2 交互模式验证$ ./build/calc calc (90-18)/315 90 - 18 72 72 / 3 24 24 15 39 result: 39 calc 35*2 5 * 2 10 3 10 13 result: 13 calc 10%3 10 % 3 1 result: 1 calc --5 result: 5 calc exit6.3 管道输入验证$echo(90-18)/315|./build/calc calc90-187272/324241539result:397. 设计要点双模式共存main()通过argc简单分流两种模式互不干扰步骤打印嵌入求值过程在递归下降的每个二元运算点插入printf无需额外遍历打印顺序自动反映优先级内层term先于外层expr求值*/%的步骤行自然出现在-之前静默求值不受影响eval_set_print_steps(0)时print_steps为假不产生任何额外输出批处理和测试路径完全透明
在编程语言的历史长河中,很少有语言能在诞生仅十余年就跻身主流,并成为云计算、微服务、高并发领域的“事实标准”。Go 语言做到了。从 Docker 到 Kubernetes,从 Prometheus 到 Istio,云原生生态的核心基础设施几乎全部用 Go 编写…
📅 2026/7/20 10:48:14
本系列的前十一篇文章已经覆盖了 CI/CD 的各个知识点:从工具选型、Pipeline 编写、多环境部署、质量门禁到制品管理。本篇将它们全部串联起来,构建一个从代码提交到生产部署的完整端到端案例。以 Spring Boot 应用为例,涵盖代码检查 → 单元测…
📅 2026/7/20 10:48:14
1. 项目概述与核心价值 在嵌入式系统开发,尤其是电机控制、数字电源这类对实时性和信号路由灵活性要求极高的领域,我们常常会遇到一个头疼的问题:芯片的引脚功能是固定的,但我们的硬件设计需求却是千变万化的。比如,你…
📅 2026/7/20 10:47:14
说实话,每次看到有人问“geo geo喜欢什么颜色”这个问题,我心里都挺复杂的。不是讨厌大家好奇,而是这种问题太容易被当成饭前茶后的闲聊素材,却忽略了背后那个鲜活的人。我认识geo挺久了,从刚认识那会儿到现在,他对颜色的偏好其实发生过几次挺大的变化。如果你只是想知道…
📅 2026/7/21 5:09:48
1. 项目概述:为什么数组与字符串是C的基石如果你刚开始学习C,或者已经写了一些代码但总觉得对数组和字符串的操作不够“得心应手”,那么你找对地方了。数组和字符串,这两个概念听起来基础得不能再基础,但恰恰是它们&am…
📅 2026/7/21 5:09:35
1. Android Native开发环境搭建概述对于需要高性能计算或复用现有C/C代码库的Android开发者来说,搭建Native开发环境是必经之路。我在过去五年中为多个游戏引擎和音视频处理项目配置过NDK环境,这里分享一套经过验证的搭建方案。Native开发主要涉及三个核…
📅 2026/7/21 5:09:35
1. 项目概述:当AI成为你的“初级程序员” 最近在折腾一个光线追踪渲染器的个人项目,核心目标是想实现一个软渲染器,能实时渲染一些简单的几何体,带点反射和折射效果。作为一个图形学爱好者,我深知光线追踪的核心性能瓶…
📅 2026/7/21 5:09:35
1. 项目概述:为什么你需要深入理解priority_queue?在C的日常开发中,尤其是处理需要“按优先级处理”的场景时,std::priority_queue(优先级队列)是一个绕不开的容器适配器。你可能在刷算法题时见过它&#x…
📅 2026/7/21 5:09:35
1. 项目概述:为什么是C? 如果你在金融科技圈子里待过几年,尤其是跟交易系统、行情软件打过交道,那你一定对C这个名字不陌生。它不像Python那样在数据分析领域遍地开花,也不像Java那样在企业级应用中无处不在࿰…
📅 2026/7/21 5:09:35
本文关键词:geo geo测试你是不是也遇到过这种奇葩事?明明你的网站内容写得比同行好,图片更清晰,甚至价格还更低,但在搜索结果里就是排不进去。特别是做本地生意的老板,那种看着隔壁老王明明啥也不是,却天天坐在收银台数钱的滋味,真的憋屈。我最近为了搞懂这个所谓的“地…
📅 2026/7/21 0:00:39
1. Octane Render与C4D的黄金组合:为什么选择这个方案?在三维创作领域,渲染器的选择往往决定了作品的最终呈现质量和工作效率。作为Cinema 4D(C4D)用户,Octane Render的GPU加速特性与实时预览功能ÿ…
📅 2026/7/21 0:00:41
1. GPMC接口设计:从硬件连接到软件配置的全局视角在嵌入式系统开发中,尤其是基于TI Sitara系列如AM263x这类高性能微控制器的项目里,外部存储器的扩展几乎是绕不开的一环。无论是存放大量非易失性代码的NOR Flash,还是作为高速数据…
📅 2026/7/21 0:00:41
1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…
📅 2026/7/21 1:04:03
1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…
📅 2026/7/21 1:04:03
更多请点击:
https://intelliparadigm.com
第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…
📅 2026/7/21 1:04:03
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/20 7:03:19
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/20 17:03:45
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/21 5:04:16