当前位置: 首页 > news >正文

AI开发C语言应用按步走,表达式计算器calc的第四步,交互式 REPL 模式

calc4 — 交互式 REPL 模式

1. 概述

本次迭代在 calc3 求值器基础上增加交互式 REPL 模式(Read-Eval-Print Loop),提供实时运算体验,并显示运算步骤。

运行模式对比

模式启动方式输出用途
批处理./calc "表达式"仅结果数字脚本调用、自动化测试
交互式./calc(无参数)运算步骤 + 结果手动输入探索

交互示例

$ ./build/calc calc> (90-18)/3+15 90 - 18 = 72 72 / 3 = 24 24 + 15 = 39 result: 39 calc> 3+5*2 5 * 2 = 10 3 + 10 = 13 result: 13 calc> exit

2. 变更清单

文件操作说明
eval.h编辑新增eval_set_print_steps(int enable)声明
eval.c编辑新增print_steps标志;parse_exprparse_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_tlen=strlen(buf);if(len>0&&buf[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;}

核心逻辑

  1. 打印calc>提示符(fflush确保立即显示)
  2. fgets读取一行用户输入
  3. 去掉末尾换行符
  4. 判断exit→ 退出循环
  5. 判断空行 → 跳过
  6. 调用eval_expr求值 → 输出结果
  7. 循环往复,直到 EOF 或exit

3.2 main() 分流

intmain(intargc,char*argv[]){if(argc>1){/* 批处理模式:从命令行参数读取 */returnparse_and_eval(argv[1]);}/* 交互模式 */returnrepl();}
  • 有参数 → 批处理(eval_set_print_steps(0),不输出步骤)
  • 无参数 → 交互式 REPL(eval_set_print_steps(1),输出步骤)

4. 运算步骤打印

4.1 eval_set_print_steps API

voideval_set_print_steps(intenable);

eval.c中通过print_steps静态变量控制,eval_expr每次调用时会重置eval_error保留print_steps标志。

4.2 步骤打印位置

parse_exprparse_term的每个二元运算完成后插入打印:

// parse_expr 中 —— 处理 + -intresult=left+right;if(print_steps)printf(" %d + %d = %d\n",left,right,result);left=result;// parse_term 中 —— 处理 * / %intresult=left*right;if(print_steps)printf(" %d * %d = %d\n",left,right,result);left=result;

4.3 优先级自动体现

利用递归下降的天然求值顺序——内层语法层先求值,外层后求值——步骤打印顺序自动反映运算符优先级:

输入步骤输出顺序说明
3+5*25 * 2 = 103 + 10 = 13*行先于+
(90-18)/3+1590 - 18 = 7272 / 3 = 2424 + 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/ └── calc

6. 测试验证

6.1 回归测试

批处理模式不受影响,make test9/9 全部 PASS:

$maketest============================================calc — 测试套件============================================PASS[1](90-18)/3+15 →39PASS[2]10%3 →1PASS[3]-5+3 →-2PASS[4]3+-5 →-2PASS[5](-3)-3PASS[6](-8+20)%-3 →0PASS[7]3+58PASS[8]3+@5 → error PASS[9]<empty>→ error============================================9passed,0failed,9total============================================

6.2 交互模式验证

$ ./build/calc calc> (90-18)/3+15 90 - 18 = 72 72 / 3 = 24 24 + 15 = 39 result: 39 calc> 3+5*2 5 * 2 = 10 3 + 10 = 13 result: 13 calc> 10%3 10 % 3 = 1 result: 1 calc> --5 result: 5 calc> exit

6.3 管道输入验证

$echo"(90-18)/3+15"|./build/calc calc>90-18=7272/3=2424+15=39result:39

7. 设计要点

  1. 双模式共存main()通过argc简单分流,两种模式互不干扰
  2. 步骤打印嵌入求值过程:在递归下降的每个二元运算点插入printf,无需额外遍历
  3. 打印顺序自动反映优先级:内层term先于外层expr求值,*/%的步骤行自然出现在+-之前
  4. 静默求值不受影响eval_set_print_steps(0)print_steps为假,不产生任何额外输出,批处理和测试路径完全透明
http://www.jsqmd.com/news/1227644/

相关文章:

  • AM275x ECC中断与CoreSight调试寄存器实战解析
  • AI编程助手实战对比:Codex与Claude Code的工程化配置与应用场景解析
  • 官网发布|2026万国官方售后细则,保养收费表、维修周期、正规网点清单全公开 - 亨得利售后服务官网
  • WPS整改解析:功能优化与云服务架构升级
  • GTA5线上模式内存操作框架设计与实现
  • 高通SA8295P芯片在智能座舱中的技术解析与应用
  • 为什么“最便宜“的大模型反而最烧钱?斯坦福等四机构论文揭开价格倒挂
  • AI纹理生成终极指南:从单张图片智能创建表面细节的完整教程
  • 通义千问:从零开始掌握开源大语言模型的终极指南
  • 基于Python的智能新闻聚合系统设计与实践
  • 终极实时屏幕翻译解决方案:Translumo如何打破语言障碍
  • AM275x AASRC时钟配置实战:从寄存器手册到稳定时钟生成
  • 3步免费找回加密压缩包密码:ArchivePasswordTestTool完整指南
  • 深入解析SoC时钟域管理:以TI Jacinto 6 Plus的CD_L3INIT为例
  • Whisper六大变体技术对比:速度、精度与部署场景全解析
  • VC++与GDI+实现高性能实时数据可视化系统开发指南
  • Unity游戏集成本地AI音乐生成:MusicGen与FastAPI实战指南
  • C++实战:从零构建视频点播系统,掌握网络编程与流媒体核心技术
  • 商业决策优化失效的根源:凸性诊断与实战指南
  • Qwerty Learner:打字与单词记忆的双重训练终极指南
  • 智能EFI配置革命:OpCore-Simplify自动化部署工具深度解析
  • 5分钟上手:AI多角度图像编辑工具的完整使用指南
  • Unity游戏实时翻译插件XUnity.AutoTranslator从零配置指南
  • NsEmuTools:Rust+Tauri+Vue3跨平台NS模拟器管理架构解析与高性能实现原理
  • Biotin-NTE-[Arg3]-Substance P;Bio-KYGGGGGGRPRPQQFFGLM-NH₂
  • 数字福建规划:数字经济核心产业增加值提升路径
  • 2026最新5款高性价比AI编程工具实测深度对比
  • TMS320F28P65x外设访问控制:多主控嵌入式系统的权限管理实战
  • 如何用开源智能脚本彻底解放你的游戏时间?MAA明日方舟自动化助手完全指南
  • WeChatMsg:从聊天记录到数字记忆库的完整数据保存方案