AI开发C语言应用按步走,表达式计算器calc的第十三步,逻辑值、逻辑运算符、比较运算符(v2.0) 📅 2026/7/25 9:04:35 calc13 — 逻辑值、逻辑运算符、比较运算符v2.01. 概述本次迭代将 calc 升级至v2.0新增完整的逻辑运算和比较运算支持与 C 语言运算符语义一致。版本变化1.0→2.0新增功能类别运算符/关键字说明逻辑值true/false对应 1.0 / 0.0逻辑非!一元运算符!0 1!非0 0逻辑与二元运算符两者非零则 1逻辑或||二元运算符任一非零则 1相等/!比较两个值是否相等/不等关系///比较两个值的大小关系2. 变更清单文件操作说明Makefile编辑VERSION 2.0test 目标分隔符 parse.h编辑TokenType 枚举新增 10 个类型注释更新parse.c重写多字符运算符识别!||关键字true/false识别update_expect/token_name同步更新eval.c重写新增 4 层语法层expr_or/expr_and/expr_equality/expr_relationalfactor增加TRUE/FALSE分支unary增加!分支test.expr编辑新增 17 个逻辑/比较测试用例总数 31→483. 运算符优先级3.1 完整优先级表从低到高优先级语法层运算符结合性1 (最低)expr_or||左结合2expr_and左结合3expr_equality!左结合4expr_relational左结合5expr_additive-左结合6expr_multiplicative*/%左结合7unary-!右结合3.2 文法扩展expr → expr_or expr_or → expr_and ((||) expr_and)* expr_and → expr_equality (() expr_equality)* expr_equality → expr_relational (( | !) expr_relational)* expr_relational → expr_additive (( | | | ) expr_additive)* expr_additive → expr_multiplicative (( | -) expr_multiplicative)* expr_multiplicative → unary ((* | / | %) unary)* unary → (- | !) unary | factor factor → NUMBER | IDENTIFIER | TRUE | FALSE | ( expr )4. 词法分析器扩展4.1 多字符运算符识别在parse_next中单字符switch之前先检查多字符序列/* 多字符运算符 */if(*input_pos*(input_pos1)){tok.typeTOKEN_EQ;input_pos2;column2;...}if(*input_pos!*(input_pos1)){...}// !if(*input_pos*(input_pos1)){...}// if(*input_pos*(input_pos1)){...}// if(*input_pos*(input_pos1)){...}// if(*input_pos|*(input_pos1)|){...}// ||4.2 关键字识别在标识符读取之后检查是否为true或falseif(strcmp(tok.data.name,true)0){tok.typeTOKEN_TRUE;}elseif(strcmp(tok.data.name,false)0){tok.typeTOKEN_FALSE;}else{tok.typeTOKEN_IDENTIFIER;}5. 求值器扩展5.1 逻辑运算// expr_or — 逻辑或doubleresult(left!0.0||right!0.0)?1.0:0.0;// expr_and — 逻辑与doubleresult(left!0.0right!0.0)?1.0:0.0;// unary — 逻辑非doubleresult(val0.0)?1.0:0.0;5.2 比较运算// expr_equality — 相等/不等doubleresult(leftright)?1.0:0.0;// doubleresult(left!right)?1.0:0.0;// !// expr_relational — 关系比较doubleresult(leftright)?1.0:0.0;// doubleresult(leftright)?1.0:0.0;// doubleresult(leftright)?1.0:0.0;// doubleresult(leftright)?1.0:0.0;// 6. 测试验证6.1 回归测试$maketestcalc — 测试套件PASS[1](90-18)/315 →39... PASS[32]true→1PASS[33]false→0PASS[34]!true →0PASS[35]!false →1PASS[36]!!true →1PASS[37]33→1PASS[38]3!3→0PASS[39]35→1PASS[40]35→0PASS[41]33→1PASS[42]35→0PASS[43]truefalse→0PASS[44]true||false→1PASS[45](35)(33)→1PASS[46]!truefalse→0PASS[47]358→1PASS[48]35*213→148passed,0failed,48total6.2 优先级验证表达式结果验证点3581优先于true||falsefalse1优先于||!truefalse0!优先于(35)(33)1括号最高优先级35*2131*优先于优先于