AI开发C语言应用按步走,表达式计算器calc的第十九步,注释、表达式分隔符、long double 精度

📅 2026/7/27 18:59:50
AI开发C语言应用按步走,表达式计算器calc的第十九步,注释、表达式分隔符、long double 精度
calc19 — 注释、表达式分隔符、long double 精度1. 概述本次迭代新增三项功能并对全局数值类型进行了精度升级注释支持—#开头到行尾的内容被忽略表达式分隔符—;分隔多个表达式返回最后一个的值long double 精度— 全局double→long double提升运算精度2. 变更清单文件操作说明parse.h编辑新增TOKEN_SEMICOLONToken.value类型double→long doubleparse.c重写#注释跳过;解析为TOKEN_SEMICOLONstrtold/strtoul替换strtodeval.h编辑API 参数double*→long double*新增eval_exprs声明eval.c重写全部double→long doublefmod→fmodl新增eval_exprs实现sym.h编辑API 参数double→long doublesym.c编辑SymEntry.valuedouble→long double%Lgfunc.h编辑API 参数double*→long double*func.c重写args/valdouble→long doublesinl/cosl等l后缀数学函数main.c重写double→long double%Lg调用eval_exprs替代eval_exprtest.expr编辑修复溢出测试值新增#注释测试修复0b1010/0777解析3. 注释支持在parse_next中当遇到#时跳过直到行尾或字符串结束if(*input_pos#){while(*input_pos*input_pos!\n){column;input_pos;}if(*input_pos\n){line;column1;input_pos;}returnparse_next();/* 递归获取下一个 token */}示例calc 3 5 # 这是注释 84. 表达式分隔符4.1 新增eval_exprsAPIinteval_exprs(constchar*input,longdouble*result);循环解析多个以;分隔的表达式返回最后一个的值inteval_exprs(constchar*input,longdouble*result){parse_init(input);eval_error0;longdoubleval0.0;while(!eval_error){valparse_expr();if(eval_error)return1;Token tparse_peek();if(t.typeTOKEN_SEMICOLON){parse_consume();continue;}if(t.type!TOKEN_END){print_error_context(t.col);fprintf(stderr, error: unexpected token after expression\n);return1;}break;}*resultval;return0;}4.2 使用$ ./build/calc1; 2; 334.3 默认切换parse_and_eval和repl均改为调用eval_exprs因此;分隔符在所有模式下均可使用。5. long double 精度升级5.1 涉及范围组件类型变更影响Token 数值double→long double解析和存储求值器double→long double全部运算符号表double→long double变量值函数表double→long double参数和返回值主程序double→long double输出格式%Lg5.2 数学函数后缀所有math.h函数调用改为l后缀版本函数原版long double 版正弦sinsinl余弦coscosl正切tantanl平方根sqrtsqrtl幂运算powpowl取模fmodfmodl绝对值fabsfabsl5.3 精度提升类型尾数位数十进制精度最大值double53 bits~15 位~1.79e308long double64 bits~19 位~1.19e49326. 测试验证$maketestcalc — 测试套件PASS[1](90-18)/315 →39... PASS[30]1e5000*1e5000 → error... PASS[61]0b1010 →10PASS[62]0777 →511... PASS[122]35# comment → 8122passed,0failed,122total