AI开发C语言应用按步走,表达式计算器calc的第二十三步,多行输入、进制输出、错误恢复、常量折叠、配置加载等

calc23 --- 多行输入、进制输出、错误恢复、常量折叠、配置加载等

1. 概述

本次迭代完成了 features.md 中 I1~I7 共 7 项建议,涵盖 REPL 体验增强、错误恢复、测试覆盖、性能优化和配置管理。

完成项:

编号 功能 类型
I1 REPL 行编辑(!! 重复命令) 用户体验
I2 多行输入支持(括号未闭合时续行) 用户体验
I3 进制输出命令(hex/oct/bin/dec) 新功能
I4 错误恢复(分号分隔表达式错误后继续) 健壮性
I5 测试 ; 分隔符功能 测试覆盖
I6 常量折叠(表达式结果缓存) 性能优化
I7 配置文件支持(~/.calcrc) 配置管理

2. 变更清单

文件 操作 说明
main.c 编辑 多行输入、!! 命令、进制输出、配置文件、常量折叠缓存
eval.c 编辑 eval_exprs 错误恢复:错误后跳过到 ; 继续
test_semicolon.sh 新建 7 个分号分隔符测试用例

3. I1 --- REPL 行编辑

新增 !! 命令重复执行最后一条历史记录:

复制代码
calc> 3+5*2
  5 * 2 = 10
  3 + 10 = 13
  result: 13
calc> !!
  >> 3+5*2
  5 * 2 = 10
  3 + 10 = 13
  result: 13

4. I2 --- 多行输入

当括号未闭合时,自动显示 ...> 续行提示:

复制代码
calc> (3 + 5
...> ) * 2
  3 + 5 = 8
  8 * 2 = 16
  result: 16

实现:unclosed_brackets() 函数检测括号平衡,REPL 循环中自动续行。

5. I3 --- 进制输出命令

新增 hex、oct、bin、dec 命令切换输出进制:

复制代码
calc> dec
  output base: dec
calc> 255
  255
calc> hex
  output base: hex
calc> 255
  0xFF

print_value() 函数处理各种进制输出格式。

6. I4 --- 错误恢复

eval_exprs 中错误后自动跳过到下一个 ;,继续执行后续表达式:

复制代码
calc> 1/0; 3+5
  error: division by zero
  3 + 5 = 8
  result: 8

7. I5 --- 测试分隔符

新建 test_semicolon.sh 测试脚本,7 个测试用例覆盖分号分隔符功能:

bash 复制代码
$ sh test_semicolon.sh
PASS: '1;2;3' → 3
PASS: 'a=5;b=6;a+b' → 11
...
=== 完成 ===

8. I6 --- 常量折叠

实现 16 条目的表达式结果缓存。相同表达式重复求值时直接返回缓存值,避免重复解析和计算:

c 复制代码
#define CACHE_SIZE 16
typedef struct { char expr[64]; long double val; } CacheEntry;
static CacheEntry expr_cache[CACHE_SIZE];

9. I7 --- 配置文件支持

启动时自动加载 ~/.calcrc 文件,支持变量预设和以 # 开头的注释:

复制代码
# .calcrc --- calc 配置文件
PI = 3.141592653589793
E = 2.718281828459045

10. 测试验证

bash 复制代码
$ make test
============================================
  calc --- 测试套件
============================================
  124 passed, 0 failed, 124 total
============================================

$ sh test_semicolon.sh
PASS: '1;2;3' → 3
...
=== 完成 ===
相关推荐
小小龙学IT5 小时前
Go 泛型(Generics)深度解析:从类型参数到生产实践
开发语言·数据库·golang
hold?fish:palm5 小时前
45 二叉树的右视图
开发语言·c++·算法
MI_farmer5 小时前
Anaconda 安装在 D 盘但虚拟环境跑到 C 盘,以及 Conda PermissionError: WinError 5 的解决方法
c语言·开发语言·conda
“AI国潮设计-小江”5 小时前
[AIGC实战] 基于Stable Diffusion的潮汕非遗IP自动化生成工作流(附Python批量处理脚本)
开发语言·人工智能·python·prompt·aigc
布莱克6056 小时前
在C++中,构造函数能不能是虚函数?析构函数为什么要虚?
开发语言·c++·构造函数·析构函数·虚函数
落魄实习生6 小时前
Agent Scope Java 2.x 系列【1】核心架构
java·开发语言·架构
一水鉴天6 小时前
三套语言:STL SPL/ SQL 20260928(元宝)
开发语言
Sarvartha6 小时前
数组基础知识
java·开发语言
泡海椒6 小时前
金融报表开发:jquick-pdf K 线图 PDF 可视化解决方案
java·开发语言·金融·pdf
孙启超7 小时前
【AI开发之Rust】第 17 课:项目总览与核心架构 —— AI 助手 Rust 核心从 0 到 1
开发语言·后端·rust