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

AI开发C语言应用按步走,表达式计算器calc的第十一步,Token 联合体、哈希表满报错、批处理变量赋值

calc11 — Token 联合体、哈希表满报错、批处理变量赋值

1. 概述

本次迭代基于 suggestions.md 中的建议,完成了三项代码改进:

  1. Token 联合体— 将valuename字段合并为联合体,减少内存占用
  2. 哈希表满报错— 变量符号表满时输出错误提示,而非静默丢失
  3. 批处理变量赋值./calc "x = 5"现在可直接在批处理模式中赋值

2. 变更清单

文件操作说明
parse.h编辑Token 结构体改用联合体union { double value; char name[32]; } data;新增MAX_NAME 32
parse.c编辑tok.valuetok.data.valuetok.nametok.data.name
eval.c编辑t.valuet.data.valuet.namet.data.name
sym.c编辑sym_set循环结束后添加满表报错"symbol table is full"
main.c编辑parse_and_eval增加is_assignment检测,支持批处理变量赋值
test.expr编辑x=5/y=10从错误用例改为成功用例(退出码 0)

3. Token 联合体

3.1 改造前

typedefstruct{TokenType type;doublevalue;// 每个 Token 占 8 字节intcol;charname[32];// 每个 Token 占 32 字节}Token;// 总计 48 字节

3.2 改造后

#defineMAX_NAME32typedefstruct{TokenType type;intcol;union{doublevalue;// TOKEN_NUMBER 时使用charname[MAX_NAME];// TOKEN_IDENTIFIER 时使用}data;}Token;// 总计 40 字节(节省 8 字节)

valuename共享同一块内存,type字段决定访问哪个成员。

3.3 涉及的文件

所有访问tok.value/t.valuetok.name/t.name的地方均改为tok.data.value/t.data.valuetok.data.name/t.data.name,涉及parse.ceval.c

4. 哈希表满报错

sym.csym_set函数中,线性探测循环结束后添加:

/* 表满 */fprintf(stderr," error: symbol table is full, cannot set '%s'\n",name);

此前sym_set在 256 个桶全满时静默返回,赋值丢失且无任何提示。

5. 批处理变量赋值

5.1 改造前

parse_and_eval仅支持普通表达式求值,./calc "x=5"报错退出。

5.2 改造后

parse_and_eval中调用is_assignment检测赋值模式:

staticintparse_and_eval(constchar*input){charvar_name[32];if(is_assignment(input,var_name,sizeof(var_name))){constchar*p=input;while(*p&&*p!='=')p++;constchar*rhs=p+1;while(*rhs&&isspace((unsignedchar)*rhs))rhs++;doubleresult;if(eval_expr(rhs,&result)!=0)return1;sym_set(var_name,result);printf("%g\n",result);return0;}doubleresult;if(eval_expr(input,&result)!=0)return1;printf("%g\n",result);return0;}

5.3 使用示例

$ ./build/calc"x = 5 + 3"8

注意:批处理模式每次调用是独立进程,变量表不跨进程持久化。链式变量引用(如y = x * 2)需在 REPL 会话中完成。

6. 目录结构

calc/ ├── Makefile ├── parse.h / parse.c # Token 联合体 ├── eval.h / eval.c ├── sym.h / sym.c # 哈希表满报错 ├── main.c # 批处理变量赋值 ├── test.expr # 29 个测试用例 ├── doc/ │ ├── readme.md │ ├── calc1.md ~ calc10.md │ └── calc11.md # 本次构建 └── build/ └── calc

7. 测试验证

$maketest============================================calc — 测试套件============================================PASS[1](90-18)/3+15 →39... PASS[23]x=55PASS[24]y=1010...============================================29passed,0failed,29total============================================

批处理变量赋值测试通过:x=5输出5y=10输出10

http://www.jsqmd.com/news/1254683/

相关文章:

  • 基于MSP432E401Y的工业以太网网关设计:从硬件选型到软件实现
  • 基于无刷直流电机的电子机械制动执行器非线性动力学建模与仿真研究(Simulink仿真实现)
  • AI API 中转别只看能不能连通,先看第一次调用有没有“回执”
  • 把闲置NAS变成育儿中控台:BabyBuddy部署与远程记录实战
  • 高性能SAR ADC评估套件深度解析:从硬件设计到软件实操
  • Windows C++项目部署实战:从VS构建到打包分发的完整指南
  • 适配 Microsoft 365 的内联邮件安全架构部署与风险防控研究
  • stack/queue---入门OJ题
  • 【计算机毕业设计案例】基于 Django 框架的智慧校园学生宿舍信息化管理系统 高校宿舍人员入住退宿管理系统设计(程序+文档+讲解+定制)
  • 零基础玩转bWAPP靶场(十六):SQL 注入(POST/选择型)
  • TPS65988双端口Type-C PD控制器PCB布局布线实战指南
  • Agentic AI 看着能自主执行,为什么一进团队协作就频频翻车?
  • 古代情绪调控技术:鬼谷子七术与现代心理学的融合
  • 2026武汉江汉家用空调维修二手空调回收清洗攻略 - LYL仔仔
  • 2026 年 7 月最新 —— 青岛市南防水补漏哪家正规?从检测报价质保合同 4 项看 - 超人防水
  • 把喇叭贴在麦克风边上,还能全双工通话?——AU-60把“不可能”变成了“常规操作”
  • 网盘解除限速?速度可以拉满,2026亲测满速可用!
  • 眉山食品纸箱厂,居然踩坑3次才找到靠谱的?
  • AI工具paperxie如何提升学术论文写作效率
  • 分清督促与管控的界限,减少束缚保留孩子自主空间
  • 深圳欧米茄维修售后服务中心 2026 年 7 月更新:深圳欧米茄手表维修店地址在哪里 + 售后电话 400-883-8097 - 欧米茄中国售后中心
  • 2026 年保定名表回收市场稳步发展 恒益奢品汇规范服务信息公示 - 米諾
  • 深入解析TI ADS7851评估套件:从硬件设计到软件实操的全流程指南
  • Docker容器内操作MySQL的实战指南
  • 【老视频修复AI实战指南】:20年影像工程师亲授3大修复瓶颈突破法,90%画质提升实测有效
  • Unity安卓开发:调用C/C++ .so库实现高性能与SDK集成
  • 用户讨论:小鹏图灵芯片量产前,智能底座负责人为何离职
  • Godot逆向工程实战:GDSDecomp工作流与资源提取全解析
  • AI如何革新学术PPT制作:从耗时排版到智能生成
  • AIENC+AEC+BF三核加持,AU-60如何重新定义语音模组的“工程天花板”?