AI开发C语言应用按步走,表达式计算器calc的第一步,中缀表达式词法分析
calc1 — 中缀表达式词法分析器1. 项目概述构建一个 C 语言中缀表达式词法分析器tokenizer将中缀表达式字符串拆分为独立的 token 序列包括数字、四则运算符和圆括号。输入示例(90-18)/315输出示例( LEFT_PAREN 90 NUMBER - MINUS 18 NUMBER ) RIGHT_PAREN / SLASH 3 NUMBER PLUS 15 NUMBER2. 目录结构calc/ ├── Makefile # 构建脚本gcc -Wall -Wextra -stdc99 -pedantic ├── parse.h # 头文件TokenType 枚举、Token 结构体、API 声明 ├── parse.c # 词法分析器实现 ├── main.c # 入口程序输入源选择 解析打印 └── build/ ├── calc # 可执行文件 ├── parse.o # 编译目标文件 └── main.o # 编译目标文件3. 文件说明3.1 parse.h定义三个核心类型和三个 API 函数TokenType 枚举枚举值对应字符说明TOKEN_NUMBER—整数字面量TOKEN_PLUS加号TOKEN_MINUS-减号TOKEN_STAR*乘号TOKEN_SLASH/除号TOKEN_LPAREN(左括号TOKEN_RPAREN)右括号TOKEN_END—输入结束TOKEN_ERROR—非法字符Token 结构体typedefstruct{TokenType type;// token 类型intvalue;// 数值仅 TOKEN_NUMBER 有效intcol;// 在输入字符串中的列号1-based}Token;API 函数voidparse_init(constchar*input);// 初始化解析器Tokenparse_next(void);// 读取下一个 tokenconstchar*token_name(TokenType type);// 将类型转为可读字符串3.2 parse.c词法分析器实现采用静态状态机模式内部状态input_pos当前扫描游标、line行号保留、column列号1-basedparse_init将游标指向输入字符串起始位置重置行列号parse_next核心逻辑跳过空白字符isspace同步更新列号遇到\0→ 返回TOKEN_END遇到0-9→ 用strtol连续读入数字返回TOKEN_NUMBER遇到-*/()→ 返回对应类型其他字符 → 返回TOKEN_ERRORtoken_name将枚举值映射为可读字符串设计要点零动态内存分配纯游标扫描无需malloc。3.3 main.c入口程序分为两个函数parse_and_printstatic 函数staticintparse_and_print(constchar*input);职责空输入校验 →parse_init→ 循环调用parse_next打印每个 token → 遇到TOKEN_ERROR时输出错误位置并返回 1。main函数intmain(intargc,char*argv[]);职责输入源选择argv[1]优先否则从stdin读取→ 调用parse_and_print并返回其状态码。3.4 Makefile沿用项目中nslist/的构建风格C99 严格模式目标作用all编译生成build/calc可执行文件run运行build/calc需传入EXPR...clean删除build/目录编译选项-Wall -Wextra -stdc99 -pedantic -g -O24. 构建与运行# 编译$cdcalc $makemkdir-pbuild gcc-Wall-Wextra-stdc99-pedantic-g-O2-I.-cparse.c-obuild/parse.o gcc-Wall-Wextra-stdc99-pedantic-g-O2-I.-cmain.c-obuild/main.o gcc-Wall-Wextra-stdc99-pedantic-g-O2build/parse.o build/main.o-obuild/calc# 命令行参数运行$ ./build/calc(90-18)/315# 管道输入运行$echo(90-18)/315|./build/calc# 通过 Makefile 运行$makerunEXPR(90-18)/315# 清理$makeclean5. 测试验证5.1 基本表达式$ ./build/calc(90-18)/315(LEFT_PAREN90NUMBER - MINUS18NUMBER)RIGHT_PAREN / SLASH3NUMBER PLUS15NUMBER5.2 带空格$ ./build/calc 3 5 3NUMBER PLUS5NUMBER5.3 非法字符$ ./build/calc353NUMBER PLUS col3: ERROR — illegal character5.4 空输入$ ./build/calcerror: empty input5.5 管道输入$echo10-2|./build/calc10NUMBER - MINUS2NUMBER6. 设计要点零动态内存分配词法分析器使用纯游标扫描不依赖malloc适合嵌入式或资源受限环境C99 严格模式编译启用-stdc99 -pedantic确保跨平台兼容列号定位每个 token 记录输入中的列号支持精确的错误位置报告模块分离parse.h/parse.c为纯词法分析模块main.c仅负责输入输出编排职责清晰两种输入方式支持命令行参数和标准输入管道方便脚本集成