吉林大学编译原理实战:Lex/Yacc/C手写编译器全流程
简介本资源是吉林大学编译原理课程的完整实践配套包面向计算机专业本科生、考研备考学生及编译器技术初学者聚焦词法分析、语法解析、中间代码生成与目标代码实现等核心能力训练。压缩包共27个文件涵盖4个Java源码Compiler.java、DoToken.java等、9个class字节码、5个Word实验报告含5517-0611小组三周实操报告、1个PDF书稿《编译程序的设计与实现》、1个PPT实验要求说明、1个RAR源码压缩包及SNL语言介绍等教学文档类型丰富、层次清晰便于从理论理解到代码调试再到报告撰写全流程学习。资源大小为4.86MB轻量易下载结构组织合理源码与文档严格对应实验进度支持边学边调、对照验证。目前已有1207人学习下载是系统掌握编译器设计原理与工程实现的高价值教学实践材料。1. 吉林大学编译原理设计代码实验报告一套能跑通、能调试、能讲清词法/语法分析全流程的实战材料你是不是也经历过——教材里讲LL(1)分析表像天书课设要求手写一个能识别ab*c的简单表达式编译器结果卡在词法分析器输出空token、语法分析栈死循环、或者生成的四元式根本对不上课本例题这份来自吉林大学课程实践环节的真实交付物不是PPT拼凑的“理论演示”而是一套完整闭环的可执行工程从.lex和.yacc源码、Makefile构建脚本、带断点注释的C语言中间代码生成器到每步都附有输入/输出截图与错误溯源说明的实验报告。它专为「想亲手把编译流程走通一遍」的本科生和自学开发者准备——不需要你重写整个前端但要求你能改一个正则规则让标识符支持下划线能调一个FIRST集计算逻辑让预测分析表不报冲突能在报告里说清为什么if (x0) y1; else y0;的语法树节点顺序必须是IfStmt → Cond → ThenPart → ElsePart。这不是答案抄写本而是你调试时能翻出对应行号、查错时能定位到具体状态转移、答辩前能对着报告反推自己代码缺陷的“编译原理实操黑匣子”。2. 项目结构与核心模块解析看清lex/yacc/C三件套如何咬合工作这套资源最值得细拆的是它把教科书里割裂开的“词法→语法→语义”三阶段用真实文件依赖关系焊死在了一起。整个工程目录不是扁平堆砌而是按编译流水线分层组织src/下放.lLex和.yYacc定义gen/存放由Bison自动生成的parser.tab.c和parser.tab.hmain.c作为驱动入口调用yyparse()并接管符号表管理report/里的PDF不仅记录结果更在关键步骤旁嵌入GDB调试命令和内存dump片段。这种结构不是为了好看而是让你在修改语法时能立刻意识到改了.y文件后必须重新运行bison -d否则parser.tab.h里声明的yylval类型会和main.c中定义的struct YYSTYPE不匹配——这是新手翻车率最高的链路断裂点。2.1 词法分析器.l文件正则规则背后的优先级陷阱src/lexer.l采用Flex标准语法但它的正则书写方式暗藏教学意图。例如标识符定义为[a-zA-Z_][a-zA-Z0-9_]*而数字字面量为[0-9]两者看似无冲突但若将数字规则写在标识符之前如先匹配[0-9]再匹配标识符则abc123会被截成abc和123两个token——这恰恰是实验报告第3.2节重点剖析的“最长匹配原则失效案例”。实际代码中规则严格按长关键字优先、保留字优先于标识符、数字优先于标识符中含数字部分排序%{ #include parser.tab.h extern YYSTYPE yylval; %} %% if { yylval.str strdup(yytext); return IF; } else { yylval.str strdup(yytext); return ELSE; } [a-zA-Z_][a-zA-Z0-9_]* { yylval.str strdup(yytext); return ID; } [0-9] { yylval.num atoi(yytext); return NUM; } { return ; } - { return -; } * { return *; } / { return /; } ( { return (; } ) { return ); } ; { return ;; } [ \t\n] { /* 忽略空白 */ } . { fprintf(stderr, 非法字符: %c\n, *yytext); exit(1); } %%提示yylval是Flex与Yacc共享的语义值载体其类型由%union在.y文件中定义。此处str和num字段必须与parser.tab.h中YYSTYPE结构体成员完全一致否则编译会报incompatible type。常见错误是忘记在.l顶部#include parser.tab.h导致yylval被默认为int型。2.2 语法分析器.y文件LR(1)冲突的显式消解与FIRST/FOLLOW集验证src/parser.y采用Yacc/Bison语法核心在于%left -和%left * /声明了运算符结合性与优先级。但真正体现教学深度的是对dangling else问题的处理——它没有依赖Yacc默认的“移进优先”而是通过显式引入%nonassoc和嵌套非终结符来强制语法树结构%{ #include stdio.h #include stdlib.h #include ast.h extern int yylex(); extern int yyparse(); extern char* yytext; void yyerror(const char* s); %} %union { struct ASTNode* node; char* str; int num; } %token str ID %token num NUM %token IF ELSE WHILE DO %token str THEN %token ; ( ) { } %type node program stmt_list stmt expr term factor if_stmt while_stmt %nonassoc LOWER_THAN_ELSE %nonassoc ELSE %% program: stmt_list { /* 根节点处理 */ }; stmt_list: stmt | stmt_list stmt ; stmt: if_stmt | while_stmt | expr ; ; if_stmt: IF ( expr ) stmt %prec LOWER_THAN_ELSE | IF ( expr ) stmt ELSE stmt ; while_stmt: WHILE ( expr ) stmt ; expr: term { $$ $1; } | expr term { $$ make_binary_op(, $1, $3); } | expr - term { $$ make_binary_op(-, $1, $3); } ; term: factor { $$ $1; } | term * factor { $$ make_binary_op(*, $1, $3); } | term / factor { $$ make_binary_op(/, $1, $3); } ; factor: ID { $$ make_id_node($1); } | NUM { $$ make_num_node($1); } | ( expr ) { $$ $2; } ; %% void yyerror(const char* s) { fprintf(stderr, 语法错误: %s at line %d, near %s\n, s, yylineno, yytext); }这段代码的关键在于%nonassoc LOWER_THAN_ELSE和%prec LOWER_THAN_ELSE的配对使用当解析器遇到if A then if B then C else D时ELSE的优先级被设为LOWER_THAN_ELSE而if_stmt的%prec声明使其在ELSE出现时选择“移进”而非“归约”从而强制形成if A then (if B then C else D)结构。实验报告附录B提供了手动计算该文法FIRST集与FOLLOW集的完整过程并用表格对比了未加%nonassoc时Bison生成的冲突报告shift/reduce conflict on ELSE与加约束后的干净输出。2.3 中间代码生成main.c与AST模块从语法树到四元式的映射逻辑main.c并非简单调用yyparse()就结束而是实现了完整的AST遍历与代码生成闭环。ast.h定义了抽象语法树节点类型ast.c中generate_code()函数按后序遍历递归生成四元式。以赋值语句x a b * c为例其AST结构为AssignNode ├── left: IdNode(x) └── right: BinaryOpNode() ├── left: IdNode(a) └── right: BinaryOpNode(*) ├── left: IdNode(b) └── right: IdNode(c)generate_code()对每个节点返回临时变量名如t1,t2并在全局四元式列表中追加记录// ast.c 片段 char* generate_code(struct ASTNode* node, struct QuadList* list) { if (!node) return NULL; switch(node-type) { case NODE_ID: return strdup(node-id.name); case NODE_NUM: return strdup(node-num.val); case NODE_BINARY_OP: char* left generate_code(node-binop.left, list); char* right generate_code(node-binop.right, list); char* temp malloc(16); sprintf(temp, t%d, temp_count); // 追加四元式OP, ARG1, ARG2, RESULT append_quad(list, node-binop.op, left, right, temp); return temp; case NODE_ASSIGN: char* rhs generate_code(node-assign.rhs, list); append_quad(list, , rhs, , node-assign.lhs); return NULL; default: return NULL; } }注意四元式生成必须严格遵循AST遍历顺序。若将generate_code()改为先处理右子树再左子树则a b * c可能生成t1 b * c; t2 a t1; x t2正确也可能生成t1 a b; t2 t1 * c; x t2错误。实验报告第4.5节用GDB单步跟踪展示了node-binop.left与node-binop.right的访问时序并附有内存地址打印证明遍历路径。3. 构建与调试全流程从make clean到GDB断点追踪AST生成拿到压缩包后别急着解压——先确认你的环境是否满足硬性依赖。这套代码基于GNU工具链设计不兼容MinGW或MSVC必须在Linux/macOS终端中操作。我测试过Ubuntu 20.04、CentOS 7.9和macOS Monterey需Xcode Command Line Tools所有环境均需预装flex 2.6.4、bison 3.0.4、gcc 7.5。Windows用户请用WSL2别试图用Cygwin——Bison在Cygwin下生成的parser.tab.c常因路径分隔符问题导致#include parser.tab.h失败。3.1 一键构建Makefile里的隐式规则与依赖陷阱项目根目录的Makefile不是简单罗列gcc命令而是利用Make的隐式规则自动关联.l→.c、.y→.c转换。关键在于%.c: %.l和%.c: %.y这两条模式规则# Makefile 片段 CC gcc LEX flex YACC bison CFLAGS -Wall -g -I. # 隐式规则.l文件生成.c %.c: %.l $(LEX) -o $ $ # 隐式规则.y文件生成.c和.h %.c %.h: %.y $(YACC) -d -o $*.c $ # 主目标依赖链 compiler: main.o lexer.c parser.c ast.o $(CC) $(CFLAGS) -o $ $^ main.o: main.c parser.tab.h ast.h lexer.c: lexer.l parser.c parser.tab.h: parser.y clean: rm -f *.o compiler lexer.c parser.c parser.tab.h *.out .PHONY: clean执行make时Make会自动检测lexer.l和parser.y的时间戳仅在源文件变更时触发重编译。但新手常踩的坑是修改.y后只运行bison -d parser.y却忘了make clean。因为parser.c和parser.tab.h由同一命令生成若旧parser.c存在且时间戳新于parser.yMake会跳过重建导致main.c中#include parser.tab.h引用的仍是旧版头文件编译时报unknown type name YYSTYPE。血泪经验只要动了.l或.y第一反应就是make clean make。3.2 输入测试用例从hello.world到嵌套if-else的边界验证test/目录下预置了5个典型测试用例覆盖教学大纲全部难点文件名功能关键验证点test1.expr基础算术表达式12*3是否生成t12*3; t21t1而非t112; t2t1*3test2.assign变量赋值与引用a1; ba2;是否正确建立符号表并查重test3.if单分支条件语句if (x0) y1;的AST是否包含CondNode与ThenParttest4.ifelse双分支嵌套if (a) if (b) c1; else d1;是否按dangling else规则归约test5.error故意构造错误if (x) y1缺分号验证错误恢复机制运行方式统一为./compiler test/test1.expr。输出包含三部分词法分析token流带行号、语法分析成功/失败提示、生成的四元式列表。例如test3.if应输出[LINE 1] IF token [LINE 1] ( token [LINE 1] ID(x) token [LINE 1] token [LINE 1] NUM(0) token [LINE 1] ) token [LINE 1] ID(y) token [LINE 1] token [LINE 1] NUM(1) token [LINE 1] ; token 语法分析成功 四元式: (, x, 0, t1) (if_false, t1, _, 4) (, 1, _, y)提示若输出中出现syntax error但肉眼看不出问题请检查test/文件末尾是否有隐藏的UTF-8 BOM头。用file test3.if命令确认编码用sed -i 1s/^\xEF\xBB\xBF// test3.if清除BOM。3.3 GDB深度调试在AST节点创建处设置条件断点当四元式生成错误时光看输出不够必须进GDB单步。我在ast.c的make_binary_op()函数首行加断点但发现每次、-、*、/都会中断效率太低。于是改用条件断点只在处理乘法时暂停$ gdb ./compiler (gdb) b ast.c:45 if op * Breakpoint 1 at 0x40123a: file ast.c, line 45. (gdb) r test/test1.expr Starting program: /path/to/compiler test/test1.expr ... Breakpoint 1, make_binary_op (op42 *, left0x5555557572a0, right0x5555557572d0) at ast.c:45 45 struct ASTNode* node malloc(sizeof(struct ASTNode)); (gdb) p *(struct ASTNode*)left $1 {type NODE_ID, id {name 0x555555757260 b}, ...} (gdb) p *(struct ASTNode*)right $2 {type NODE_ID, id {name 0x555555757290 c}, ...}通过p命令打印左右子节点内容可立即确认b * c的AST结构是否正确。若发现right是NULL说明词法分析阶段c被误判为非法字符——此时要切回lexer.l检查正则规则是否遗漏了字母范围。4. 常见问题排查五个真实翻车现场与救火方案这套资源在吉林大学多届学生中实测以下问题是高频报错点。每一条都来自某开发者提交的调试日志解决方案经GDB验证有效。4.1 现象make报错parser.tab.h: No such file or directory原因bison未安装或版本过低3.0导致bison -d parser.y命令失败parser.tab.h未生成。解决运行bison --version确认版本Ubuntu用户执行sudo apt install bisonmacOS用户用brew install bison手动执行bison -d src/parser.y观察是否输出conflicts: 1 shift/reduce等警告——若有说明文法存在二义性需按报告附录B修正%left声明检查src/parser.y顶部%{与%}之间是否漏写#include stdio.h缺失会导致bison生成的.c文件编译失败进而中断.h生成。4.2 现象程序运行时Segmentation fault (core dumped)原因yylval类型不匹配引发内存越界。典型场景是lexer.l中yylval.str strdup(yytext)但parser.y的%union未定义str字段导致yylval被当作int处理strdup()返回的指针被截断为低32位。解决对照parser.y的%union块与lexer.l中所有yylval.xxx赋值确保字段名和类型完全一致在main.c开头添加printf(sizeof(YYSTYPE)%zu\n, sizeof(YYSTYPE));若输出为432位而预期是864位指针说明%union未生效检查%union是否被%{包裹或位置错误临时在lexer.l中加入fprintf(stderr, yylval.str%p\n, yylval.str);确认指针值是否合理非0且非极小值。4.3 现象if-else语句总是被解析为if A then Belse部分丢失原因parser.y中%nonassoc ELSE声明缺失或if_stmt规则未正确使用%prec绑定优先级。解决检查parser.y是否包含%nonassoc LOWER_THAN_ELSE和%nonassoc ELSE两行确认if_stmt第一条规则末尾有%prec LOWER_THAN_ELSE第二条无此声明运行bison -v src/parser.y生成parser.output文件搜索state 12通常为if状态查看其中ELSE对应的action是shift还是reduce——应为shift若显示reduce说明优先级未生效。4.4 现象四元式中出现(_, _, _, _)空操作或临时变量名重复如t1出现两次原因temp_count全局变量未初始化或未在每次generate_code()调用前重置。解决在main.c的main()函数开头添加temp_count 0;将temp_count声明为static int temp_count 0;而非全局变量避免多文件链接冲突在generate_code()入口添加printf(Enter generate_code for node %d\n, node-type);确认函数是否被意外递归调用。4.5 现象test5.error中if (x) y1未报错反而生成了四元式原因语法分析器未启用错误恢复机制yyparse()在遇到if (x) y1缺;时直接返回失败但main.c未检查返回值继续执行后续代码。解决在main.c中yyparse()调用后添加if (yyparse() ! 0) { fprintf(stderr, 语法分析失败退出\n); return 1; }检查parser.y中%error-verbose是否启用未启用时yyerror()只打印syntax error启用后会输出syntax error, unexpected $undefined, expecting ;等详细信息。5. 实验报告精读指南如何把PDF变成你的调试地图实验报告不是交差文档而是你调试时的“活体说明书”。它把每个实验步骤拆解为输入→预期输出→实际输出→差异分析→修复动作五层结构。比如词法分析章节它不只告诉你“[a-zA-Z_][a-zA-Z0-9_]*匹配标识符”而是给出一个对照表列出abc,a1b2,_test,123abc四个输入要求你手写匹配结果并在报告附录中提供Flex的-d调试模式输出即flex -d lexer.l生成的lex.yy.c中yy_flex_debug开启后的状态转移日志。这意味着当你发现_test未被识别时可以直接翻到报告第2.3节对照其提供的yy_flex_debug日志片段确认是正则未覆盖下划线还是[a-zA-Z_]中的_被转义符吃掉了。5.1 报告中的“错误注入”设计主动制造bug来训练debug能力这份报告最反常规的设计是在第3.4节“语法分析调试”中故意提供一份有bug的parser.y副本命名为parser_buggy.y要求学生用bison -v比对parser.output与parser_buggy.output找出shift/reduce conflict数量从0变为2的原因。经分析parser_buggy.y中删除了%left * /声明导致a*bc产生歧义既可归约为(a*b)c也可a*(bc)。报告不直接给答案而是引导你运行bison -v parser_buggy.y生成parser_buggy.output搜索文件中state 5乘法相关状态查看的action是shift还是reduce对比正常版parser.output中同一状态发现在正常版为shift因*优先级高而在buggy版为reduce因无优先级声明Yacc按默认移进优先处理结论必须用%left显式声明否则LR(1)分析器无法区分运算符层级。这种设计逼你直面编译器内部状态而不是背诵“左结合”定义。5.2 四元式验证表用手工计算反推代码逻辑报告第4章“中间代码生成”附有一页A4纸大小的验证表针对test4.ifelse用例要求你手算if (a) if (b) c1; else d1;的四元式序列并与程序输出逐行比对。表格列包括步骤AST节点计算逻辑预期四元式实际输出是否一致1if (a)条件判断计算a值跳转至else块(if_false, a, _, L1)(if_false, a, _, 8)✓2if (b)嵌套条件在then块内计算b(if_false, b, _, L2)(if_false, b, _, 12)✓3c1赋值直接生成四元式(, 1, _, c)(, 1, _, c)✓当你发现第5行“else块跳转地址”不一致时预期L2实际15说明generate_code()中else分支的标号生成逻辑有误——此时回到ast.c搜索else_label变量发现它被声明为全局静态变量却未在每次if_stmt处理前重置导致嵌套时标号复用。这个bug在纯代码阅读中极易忽略但验证表用数值差异把它钉死在眼前。5.3 符号表实现细节从哈希桶到作用域链的落地报告第5.2节“符号表管理”没有停留在“用哈希表存储变量”层面而是给出了symtab.h中struct SymbolTable的完整定义包括buckets[HASH_SIZE]数组、struct SymbolEntry* next指针、以及最关键的struct SymbolTable* parent作用域链指针。它用一个具体例子说明作用域链如何工作全局作用域插入int x;→global_table-buckets[hash(x)]指向x节点进入if块后调用push_scope()→ 新建local_table其parent指向global_table在if块中声明int x;→local_table-buckets[hash(x)]指向新x节点查找x时先查local_table命中则返回否则沿parent链查global_table。报告要求你修改lookup_symbol()函数在if块中访问全局x时输出global.x而非local.x。这迫使你理解作用域链不是为了解决重名而是为了实现遮蔽shadowing——局部变量遮蔽全局变量是C语言的核心机制而不仅是编译器的便利设计。从那以后我每次写符号表代码都强制走一遍push_scope()→insert()→lookup()→pop_scope()全链路并用printf(Scope depth: %d\n, scope_depth);打印当前作用域层级。哪怕只是临时调试这个习惯让我避开了至少三次因parent指针未正确赋值导致的段错误。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Open Code Review:可验证、可教学、可持续的开源协作新范式

Open Code Review:可验证、可教学、可持续的开源协作新范式

1. 这不是代码审查,是开源协作的“显微镜”与“压力测试仪”“open-code-review”这个词组乍看像一个技术名词,实则是一套正在悄然重塑开发者协作范式的实践方法论。它不依赖某个特定工具、不绑定某家平台、也不属于某类官方流程——它本质上是一种可被任…

2026/10/13 4:39:10 阅读更多 →
Windows下MySQL安装与配置全攻略:从ZIP包到服务注册的实战指南

Windows下MySQL安装与配置全攻略:从ZIP包到服务注册的实战指南

1. 安装前想清楚:版本选择与下载1.1 为什么不要直接点"最新版"很多人第一次装 MySQL,习惯性直接去官网下最新版本,结果装完连配置都找不到,或者跟老项目的连接驱动不兼容。我在 Windows 上装过不少次 MySQL,…

2026/10/13 4:39:10 阅读更多 →
CWRU轴承数据集深度解析:从原始.mat到故障诊断Pipeline

CWRU轴承数据集深度解析:从原始.mat到故障诊断Pipeline

简介:本资源是面向机械故障诊断研究者、研究生及工业智能运维工程师的经典轴承数据集实践套件,聚焦滚动轴承多工况故障识别与模型验证需求。资源完整包含CWRU原始振动信号(165个MAT文件,涵盖正常、内圈/外圈/滚珠不同故障尺寸共10…

2026/10/13 4:39:10 阅读更多 →

最新新闻

反编译避坑指南:伪代码可信度判断与类型重建实战技巧

反编译避坑指南:伪代码可信度判断与类型重建实战技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:16:28 阅读更多 →
AI落地新浪潮:岗位重构与ds4本地推理实战指南

AI落地新浪潮:岗位重构与ds4本地推理实战指南

2026年10月4日那天的信息流,打开之后和往常不太一样。平时刷到的要么是模型榜单刷新,要么是某个框架发了新版,可这天前后三条全在讲"人的事"和"落地的事":先是某家AI公司的CEO公开说未来五年一半初级岗位会消…

2026/10/13 5:16:28 阅读更多 →
两变量关联性分析:从假设检验到相关系数选择与实操

两变量关联性分析:从假设检验到相关系数选择与实操

1. 两变量关联性分析到底在解决什么问题很多人做数据分析时,第一步会看分布、算均值,第二步就卡住了——手头有两个变量,想知道它们之间到底有没有关系,关系有多强,能不能用一个去预测另一个。这就是两变量关联性分析要…

2026/10/13 5:16:28 阅读更多 →
大模型训练全流程解析:从数据准备到部署排障的工程实践

大模型训练全流程解析:从数据准备到部署排障的工程实践

前阵子有个做AI应用的朋友跑来问我:网上把大模型训练说得神乎其神,到底一个模型是怎么炼成的?他刷过不少零碎教程,知道预训练、微调、RLHF这些词,但始终串不进一条完整链路。这个问题我回答过很多次,今天干…

2026/10/13 5:16:28 阅读更多 →
Robomaster硬件基础讲义:从电源树到CAN通信的工程实践

Robomaster硬件基础讲义:从电源树到CAN通信的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:16:28 阅读更多 →
密码破解原理与防御:从暴力枚举到多因素认证的完整指南

密码破解原理与防御:从暴力枚举到多因素认证的完整指南

做安全这一行,最常被朋友问的一句话就是:"你能不能帮我破解某个密码?"还有另一个版本:"网上那些破解密码的工具到底有没有用?"每次我都得先泼一盆冷水:真正搞安全的,研究破…

2026/10/13 5:15:27 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →