AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN calc22 — 分号赋值链式修复、TOKEN_ASSIGN1. 概述本次迭代修复了a5;b6;ab分号链式赋值失败的 Bug并新增TOKEN_ASSIGN运算符 token使表达式求值器内部支持赋值操作。Bug 表现calc a5;b6;ab error: undefined variable b修复后calc a5;b6;ab a 5 b 6 5 6 11 result: 112. 变更清单文件操作说明parse.h编辑TokenType 新增TOKEN_ASSIGNparse.c编辑switch 增加case :update_expect/token_name同步更新eval.c编辑parse_factor中标识符后检测TOKEN_ASSIGN解析 RHS 并调用sym_setmain.c编辑is_assignment中使用TOKEN_ASSIGNparse_and_eval和repl中简单跳过is_assignment路径由eval_exprs处理3. Bug 根因分析3.1 问题路径输入a5;b6;ab在 REPL 中的执行路径is_assignment(a5;b6;ab) → 检测到第一个 var_nameaRHS5;b6;ab eval_exprs(5;b6;ab) → 解析 5 → OK → 遇到 ; → 继续 → 解析 b6 → 不是合法 token (TOKEN_ERROR) → parse_factor 未识别为赋值走变量查找 → sym_get(b) 返回 1 → 打印 undefined variable b3.2 三个叠加问题#问题位置1不是合法 token被解析为TOKEN_ERRORparse.c2parse_factor中标识符后遇不会识别为赋值eval.c3is_assignment只处理输入中第一个eval_exprs内部的分号后赋值不受理main.ceval.c4. 修复方案4.1 parse.h — 新增 TOKEN_ASSIGNTOKEN_ASSIGN,/** */4.2 parse.c — 识别为合法 tokencase:tok.typeTOKEN_ASSIGN;break;4.3 eval.c — parse_factor 中处理赋值在parse_factor的TOKEN_IDENTIFIER分支中检测TOKEN_ASSIGNif(next.typeTOKEN_ASSIGN){parse_consume();longdoublevalparse_expr();if(eval_error)return0.0;sym_set(t.data.name,val);if(print_steps)printf( %s %Lg\n,t.data.name,val);returnval;}4.4 main.c — 简单由 eval_exprs 处理is_assignment中使用TOKEN_ASSIGNif(*p*(p1)!){*opTOKEN_ASSIGN;return1;}parse_and_eval和repl中仅对复合赋值-等走is_assignment路径简单由eval_exprs统一处理。5. 测试验证$maketestcalc — 测试套件124passed,0failed,124total$ ./build/calca5;b6;ab11$printfa5;b6;ab\nexit\n|./build/calc calca5b65611result:11