发布时间:2026/7/19 9:16:43
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仅负责输入输出编排职责清晰两种输入方式支持命令行参数和标准输入管道方便脚本集成

相关新闻

2026/7/19 9:16:43

Python标准库核心模块详解与应用实践

1. Python模块学习概述作为一名Python开发者,掌握标准库中的核心模块是必备技能。本周我们将深入探讨Python中15个最常用的标准模块,这些模块涵盖了时间处理、随机数生成、系统操作、数据序列化、配置文件解析、加密算法、子进程管理等重要功能。这些模块…

2026/7/19 9:11:43

6.1 项目背景与需求分析(双语绘本速记单词智能体开发)

《扣子编程:从零开始搭建智能体 卢欣欣 清华大学出版社》【摘要 书评 试读】- 京东图书 《扣子编程:从零开始搭建智能体》全书案例持续更新-CSDN博客 6.1.1 业务场景描述 自2001年秋季开始,英语课程率先在城市及县城小学逐步落地&#xff…

2026/7/19 9:11:43

深入解析SPI多引脚模式与高级配置:从基础到MibSPI实战

1. 项目概述与核心价值 在嵌入式系统开发中,串行外设接口(SPI)是连接微控制器与各类传感器、存储器和显示模块的“血管”。它简单、高效,一个时钟加两根数据线就能搞定通信,这是它最初吸引我的地方。但当你真正开始设计…

2026/7/19 14:57:10

数据结构基础代码study log

线性表顺序表创建表静态表代码#include <stdio.h> #define MAXSIZE 10 typedef struct {int data[MAXSIZE];int length; }SqList;//静态表void InitList(SqList * L) {/*for(int i0;i<MAXSIZE;i)L.data[i]0;*/L->length0; }int main() {SqList L;InitList(&L);…

2026/7/19 14:57:10

一、网络基础

网络结构模式 C/S结构 简介服务器 - 客户机&#xff0c;即 Client - Server&#xff08;C/S&#xff09;结构。C/S 结构通常采取两层结构。服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器&#xff0c;服务器则是提供信息…

2026/7/19 14:57:10

C语言程序设计第一天/ASCⅡ码与转义字符/入门语句

ASCⅡ码表字符AZ的ASCII码值从65-90字符az的ASCII码值从97-122对应的大小写字符(a和A)的ASCII码值的差值是32数字字符09的ASCII码值从4857换行\n的ASCII值是:10在这些字符中ASCII码值从0~31这32个字符是不可打印字符&#xff0c;无法打印在屏幕上观察#include <stdio.h> …

2026/7/19 14:52:10

免费解锁Wand专业版:3步实现无限游戏修改体验

免费解锁Wand专业版&#xff1a;3步实现无限游戏修改体验 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand-Enhancer是一款专为Wand&#xff08…

2026/7/19 0:00:15

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/19 0:00:15

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/18 16:50:29

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…