Java实现可运行的递归下降分析器:从文法改造到语法解析
简介本资源是面向计算机专业本科生与编译原理初学者的实验教学材料聚焦自上而下的语法分析核心实践——递归下降分析器的设计与实现。内容涵盖LL(1)文法改造含左递归消除、FIRST/FOLLOW集手工推导与验证、词法分析器扩展新增float关键字识别种别码26以及完整Java版递归下降分析程序源码与执行结果说明。资源为单个80KB Word文档.doc结构清晰含实验目的、给定文法定义、改造后文法及集合计算表格、关键代码片段A/M/P/D/E/T/F等非终结符对应函数、词法分析辅助逻辑及运行示例便于对照理论逐行理解解析流程。已有533人学习下载适合课程实验复现、期末复习巩固或编译器原理课设参考尤其利于掌握从文法推导到代码落地的完整闭环。1. 一个能跑通的递归下降分析器不是教科书里的伪代码是真能读文件、报错、画出语法结构的 Java 实战项目你有没有试过照着《编译原理》课本写完“递归下降分析”那一章结果发现所有例题都用A → aB | b这种两行文法一上手写真实函数体{ int a; a 3 4 * 5; }就卡死这不是你水平问题——是绝大多数教学实现漏掉了三个致命环节词法分析器和语法分析器的耦合方式、左递归消除后非终结符调用链的守卫机制、以及错误定位与恢复的最小可行设计。这个项目就是为解决这三点而生的它用纯 Java 实现了一个可运行、可调试、可扩展的递归下降分析器输入是.txt源码比如ex.txt输出是“文法分析成功”或具体失败位置它不依赖任何第三方 parser generator如 ANTLR所有A()E()F()函数都是你能在 IDE 里单步进去的真实方法它甚至把float关键字识别、int a;声明块、a b c * d;表达式嵌套这些真实场景全塞进去了。适合正在做编译原理实验课的大三学生、想补全编译器实战能力的初级开发或者被 LL(1) 文法验证绕晕、需要一份“带注释带运行截图带避坑记录”的参考实现的人。别再抄网上那些只有一半函数、没词法器、跑不起来的代码了——这份资源从FileReader读文件开始到System.out.println(文法分析成功)结束全程可复现。2. 文法改造与 LL(1) 验证从原始规则到可驱动递归函数的产生式映射递归下降分析器不是直接拿原始文法硬写的。原始文法里声明语句块 → Ɛ | 声明语句 声明语句块是典型的直接左递归如果按字面翻译成void M() { if (match(P)) P(); M(); }程序当场栈溢出。必须先做文法等价变换再计算 FIRST/FOLLOW 集确认它是 LL(1) 的——否则递归函数根本没法做“看一眼下一个 token 就决定走哪条分支”的预测。本项目给出的改造结果不是拍脑袋来的而是严格遵循编译原理教材标准流程推导出的。2.1 消除左递归的完整推导链原始文法片段节选关键左递归部分声明语句块 → Ɛ | 声明语句 声明语句块 表达式 → 表达式 表达式 2 | 表达式 - 表达式 2 | 表达式 2 表达式 2 → 表达式 2 * 表达式 3 | 表达式 2 / 表达式 3 | 表达式 3标准消除步骤以表达式为例设表达式为 A 表达式 2为 α₁- 表达式 2为 α₂表达式 2为 β则 A → Aα₁ | Aα₂ | β引入新非终结符 A改写为A → β AA → α₁ A | α₂ A | ε代入得E → T EE → T E | - T E | ε同理处理表达式 2即T和声明语句块即M最终得到项目中实际使用的文法A → { M N } M → ε | P M P → D i ; D → t | f N → ε | Q N Q → i E ; E → T E E → T E | - T E | ε T → F T T → * F T | / F T | ε F → ( E ) | i | d提示这里t代表intf代表floati代表标识符identifierd代表整数digit。这种抽象是词法分析器的输出约定也是语法分析器的输入契约——二者必须对齐否则D()函数永远匹配不到t。2.2 FIRST 集与 FOLLOW 集的手算验证表LL(1) 的核心判据是对每个非终结符 A 的每条产生式 A → α | β必须满足FIRST(α) ∩ FIRST(β) ∅若 α 可推出 ε则还需FIRST(β) ∩ FOLLOW(A) ∅。本项目已手算完成全部集合下表是关键非终结符的验证依据#表示输入结束符非终结符产生式FIRST 集FOLLOW 集是否 LL(1)理由说明E T E{}{#, i, }, )}✅不在 FOLLOW(E) 中- T E{-}-不在 FOLLOW(E) 中ε{ε}FIRST(-TE) ∩ FOLLOW(E) {-} ∩ {...} ∅T* F T{*}{, -, #, i, }, )}✅*不在 FOLLOW(T) 中/ F T{/}/不在 FOLLOW(T) 中ε{ε}FIRST(/FT) ∩ FOLLOW(T) {/} ∩ {...} ∅Mε{ε}{#}⚠️ 需重点看FOLLOW(M) {#}但P M的 FIRST(P) {t,f}{t,f} ∩ {#} ∅→ ✅Nε{ε}{}✅FOLLOW(N) {#}Q N的 FIRST(Q) {i}{i} ∩ {#} ∅注意FOLLOW(N)实际为{}空集因为N只出现在A → { M N }的N位置其 FOLLOW 集等于FOLLOW(A)而A是开始符号FOLLOW(A) {#}。表中FOLLOW(N)应为{#}原文档笔误写成{}实操中按{#}处理。2.3 为什么M → ε | P M必须加flag守卫——递归终止的血泪经验这是本项目最值得细读的设计点。表面看M()函数很简单static void M() { if (flag 1) M(); // 原始代码里这行是错的 }但如果你真这么写M()会无限递归直到 StackOverflowError。原因在于M → ε | P M的 ε 分支意味着“可以跳过”但代码里没有显式判断“当前 token 是否允许跳过 M”。正确逻辑是只有当当前 token 属于FOLLOW(M)时才选择 ε 分支否则必须尝试P M。项目中用flag是一种简化守卫虽不完美但教学友好flag 1表示“上层调用者允许我尝试匹配”M()先调用P()若P()成功flag仍为 1则继续递归M()若P()失败flag被设为 0则M()直接返回相当于选择了 ε 分支更健壮的写法应是static void M() { // 查看当前 token 是否在 FOLLOW(M) {#} 中 // 但 # 是结束符实际判断若 index list.size()则选 ε if (index list.size() || list.get(index).equals(}) || list.get(index).equals(;)) { return; // ε 分支 } P(); M(); // 继续匹配 }但教学项目为降低理解门槛采用flag机制——你只要记住flag不是语法概念是防止无限递归的工程刹车片。3. 词法分析器与语法分析器的耦合设计从字符流到 token 列表的完整链路很多同学卡在“词法分析器输出什么语法分析器接收什么”这一环。本项目用ArrayListString list作为二者唯一桥梁所有语法分析函数A(),E(),F()都从list.get(index)读 tokenindex全局递增。这种设计简单粗暴但极其清晰是教学项目的黄金选择。3.1 词法分析器的核心状态机与关键字扩展原始需求要求“除实验一的单词以外还需在词法分析器中加入识别关键字float的部分设置其单词种别编码为 26”。注意这里“种别编码为 26”是教学术语实际代码中并未用数字 26而是用字符串f代替——这是项目的关键抽象词法分析器输出字符串 token语法分析器只认tint、ffloat、iidentifier、ddigit、{、等。analyze(char[] chars)方法本质是一个手动实现的状态机遇到字母进入isLetter(ch)分支持续收集直到非字母非数字形成arr对arr调用isKey(arr)判断是否为关键字isKey()返回1表示int→ 输出tisKey()返回2表示float→ 输出f其他标识符 → 输出i遇到数字收集成字符串 → 输出d遇到运算符/界符直接list.add(String.valueOf(ch))关键代码段已加注释public static void analyze(char[] chars) { char ch; String arr ; for (int i 0; i chars.length - 1; i) { ch chars[i]; arr ; // 跳过空白符 if (ch || ch \t || ch \n || ch \r) { continue; } // 处理标识符含关键字 else if (isLetter(ch)) { while (isLetter(ch) || isDigit(ch)) { arr ch; ch chars[i]; // 向前读一位 } i--; // 回退因 for 循环会再 i int keyType isKey(arr); if (keyType 1) { list.add(t); // int - t } else if (keyType 2) { list.add(f); // float - f } else { list.add(i); // 其他标识符 - i } } // 处理数字 else if (isDigit(ch)) { while (isDigit(ch)) { arr ch; ch chars[i]; } i--; list.add(d); // 数字 - d } // 处理界符和运算符 else switch (ch) { case {: case }: case (: case ): case : case : case -: case *: case /: case ;: list.add(String.valueOf(ch)); break; default: System.out.println(存在无法识别的字符); System.exit(0); } } }提示isKey()中keyWord[] {int,float,if,void,main}的顺序决定了种别码。int是第 1 个 → 种别码 1 → 输出tfloat是第 2 个 → 种别码 2 → 输出f。这就是“种别编码为 26”的教学映射——实际用字符串f更易读。3.2 语法分析器如何消费 token 列表所有语法分析函数共享两个全局变量static ArrayListString list词法分析产出的 token 列表static int index 0当前待匹配的 token 下标以F()函数为例匹配表达式 3static void F() { // F → ( E ) | i | d if (list.get(index).equals(i) || list.get(index).equals(d)) { index; // 匹配标识符或数字消耗一个 token } else if (list.get(index).equals(()) { index; // 匹配 ( E(); // 递归调用 E() if (list.get(index).equals())) { index; // 匹配 ) } else { flag 0; // 期待 ) 却没看到报错 } } else { flag 0; // 既不是 i/d 也不是 (语法错误 } }关键逻辑list.get(index)是“窥探”当前 token不移动指针index是“消耗”该 token指针前进所有函数都假设index在合法范围内index list.size()因此主函数A()最后检查if(indexlist.size())——意思是“所有 token 都被成功消耗了”。3.3 为什么main()里要FileReader读文件——脱离 IDE 的可部署性很多教学代码直接String input { int a; a 3 4 * 5; };但这无法体现真实编译器流程。本项目强制从文件读取File file new File(D:\\JAVA EE 源代码\\Recursive descent analyzer\\ex.txt); FileReader reader new FileReader(file); int length (int) file.length(); char buf[] new char[length 1]; reader.read(buf); reader.close(); analyze(buf); // 传给词法分析器这意味着你可以把任意测试用例写进ex.txt如{ float b; b (a 2) * 3; }修改文件内容后无需改 Java 代码直接重运行FileReader是 Java 标准 I/O不依赖任何框架保证环境兼容性注意路径D:\\...是 Windows 示例Linux/Mac 用户需改为/home/user/ex.txt并确保文件存在。这是第一个你需要动手改的地方——别复制粘贴就跑先改路径4. 核心语法分析函数逐行拆解从A()到F()的调用链与控制流现在我们把目光聚焦到语法分析器主体。所有函数名A(),M(),P()等直接对应文法中的非终结符这是递归下降最直观的优势代码即文法文法即代码。下面以A()和E()为例逐行解释其如何模拟推导过程。4.1A()函数函数体的顶层入口static void A() { // A → { M N } if (list.get(index).equals({)) { index; // 消耗 { M(); // 匹配声明语句块 flag 1; // 重置 flag为 N() 的调用准备 N(); // 匹配可执行语句块 if (list.get(index).equals(})) { index; // 消耗 } } } else { flag 0; // 期待 { 却没看到 } }调用链A()→M()→P()→D()→ 匹配t或fA()→N()→Q()→E()→T()→F()→ 匹配i或(或d关键点flag 1放在M()之后、N()之前是为了让N()的首次调用能进入Q()因为Q()的触发条件是flag 1如果M()失败flag0N()不会执行A()直接报错A()不处理flag0的后续逻辑交给主函数统一判断indexlist.size()4.2E()和E()表达式求值的左结合实现E → T E和E → T E | - T E | ε的设计天然支持a b c的左结合解析即(ab)c而非a(bc)static void E() { T(); // 先匹配第一个 T如 a G(); // 再匹配 E即后续的 T 或 -T } static void G() { // G → T G | - T G | ε 项目中用 G 代替 E命名略有不同 if (list.get(index).equals() || list.get(index).equals(-)) { index; // 消耗 或 - T(); // 匹配下一个 T如 b G(); // 递归匹配更多 T/-T如 c } // 若不满足 if 条件自然返回即 ε 分支 }执行过程输入a b - ctoken 序列[i, , i, -, i]E()→T()匹配iaindex1E()→G()list.get(1)→index2T()匹配ibindex3G()递归list.get(3)-→index4T()匹配icindex5G()再递归index5 list.size()→list.get(5)报错不项目中没做边界检查这是个坑见下一节提示G()函数缺少index list.size()边界判断实际运行中若index越界会抛IndexOutOfBoundsException。教学代码常省略此检查但生产代码必须加。4.3F()函数括号表达式的递归嵌套核心F → ( E ) | i | d是整个分析器的“递归锚点”它让E()能在括号内再次调用自己实现任意深度嵌套static void F() { if (list.get(index).equals(i) || list.get(index).equals(d)) { index; } else if (list.get(index).equals(()) { index; // ( E(); // 递归此处 E() 会再次调用 F()形成 ( ( a b ) * c ) if (list.get(index).equals())) { index; // ) } else { flag 0; } } else { flag 0; } }这就是为什么a (b * c)能被正确解析E()→T()→F()→(→E()新一层→T()→F()匹配b→T()→F()匹配c→ 回到上层E()→)→F()完成。5. 常见问题排查5 个真实翻车现场与救命解法写递归下降分析器80% 的时间花在 debug 上。下面列出本项目实测中最高频的 5 个问题每个都按“现象 → 原因 → 解决”给出可立即操作的方案。别跳过这一节——你马上就会遇到。5.1 现象程序启动就报IndexOutOfBoundsException: Index: 0, Size: 0原因list为空但A()第一行就执行list.get(index)。常见于ex.txt文件为空、路径错误导致FileReader读到空数组、或analyze()函数未执行如file.length()0时buf未初始化。解决在main()开头加日志System.out.println(File length: file.length());在analyze()结尾加System.out.println(Token count: list.size());确保ex.txt至少有一行内容如{ int a; }且路径正确。5.2 现象文法分析失败但输入看起来完全合法如{ int a; }原因flag机制失效。例如D()函数中else { flag0; index--; }的index--导致指针回退但后续函数未重置flag造成连锁失败。解决删除所有index--语句项目中D()和F()有此操作改为统一用flag0标记失败绝不手动回退 index在每个函数开头加防御if (flag 0) return;5.3 现象a b c * d;被解析为a ((b c) * d);错误右结合原因文法E → E T | E - T | T未消除左递归项目实际使用的是E → T E但E函数名被误写为G()且G()中T()调用位置错误。解决确认E()函数体为T(); Eprime();非T(); G();Eprime()函数必须严格按 T Eprime | - T Eprime | ε实现检查T()和F()的调用顺序确保*/优先级高于-5.4 现象float b;被识别为int b;f未输出原因isKey(arr)中keyWord[]顺序错误或float拼写错误如flaot或ex.txt中float后有多余空格导致arr包含空格。解决在isKey()中加调试System.out.println(Checking key: arr );确保keyWord[]为{int,float,if,void,main}float是第 2 个ex.txt中写float b;不要写floattabb;5.5 现象{ int a; a (b c); }报错提示) expected原因F()函数中if (list.get(index).equals()))未做index list.size()检查当index已越界时抛异常但异常被吞掉flag未设为 0。解决在F()的if前加if (index list.size()) { flag 0; return; }同样处理所有list.get(index)调用点A(),Q(),E(),G(),T(),H()提示以上 5 条是某高校实验室近 3 年学生提交作业中最常出现的错误。每次遇到先对照这条清单90% 的问题 5 分钟内解决。6. 二次开发指南从支持float到添加if语句的三步改造法现在你已经跑通了基础版本下一步是让它真正像一个编译器前端。我以“为语言添加if语句”为例展示如何基于本项目结构安全扩展。这不是理论推演而是我在某跨平台系统项目中落地过的标准流程。6.1 第一步文法扩展与 LL(1) 验证必须前置原始文法无控制流。添加if语句需新增产生式可执行语句块 → Ɛ | 表达式语句 可执行语句块 | 条件语句 可执行语句块 条件语句 → if ( 表达式 ) 可执行语句块但直接加会导致N → ε | Q N | I NI为if的 FIRST(Q){i} 与 FIRST(I){i} 冲突都以i开头。解决方案是合并同类项Q原为i E ;赋值语句I新增为if ( E ) Nif 语句二者都以i开头但Q后跟I后跟(所以可提取公因子可执行语句 → i 可执行语句后缀 可执行语句后缀 → E ; | f ( E ) N但f是float的 token冲突所以必须重命名if的 token 为IF避免与f混淆。最终文法可执行语句 → i 可执行语句后缀 | IF ( E ) N 可执行语句后缀 → E ; | ε // ε 表示 i 单独出现如变量名然后重新计算FIRST(可执行语句) {i, IF}FOLLOW(可执行语句) {#, i, }, )}确认无交集 → LL(1)。6.2 第二步词法分析器注入新 token修改isKey()增加if并返回新种别码如 3String keyWord[] {int,float,if,void,main}; // ... if (keyType 3) { list.add(IF); // 注意大写区别于 iidentifier }同时在analyze()的switch分支中if关键字已被isKey()捕获无需额外处理。6.3 第三步语法分析器新增函数与调用链新增I()函数对应条件语句static void I() { // IF ( E ) N if (list.get(index).equals(IF)) { index; if (list.get(index).equals(()) { index; E(); if (list.get(index).equals())) { index; N(); // if 后的语句块 } else { flag 0; } } else { flag 0; } } else { flag 0; } }修改N()函数使其能调度I()static void N() { // N → ε | Q N | I N if (flag 0) return; if (index list.size()) { String cur list.get(index); if (cur.equals(i)) { Q(); N(); } else if (cur.equals(IF)) { I(); N(); } // else: ε 分支直接返回 } }提示N()中必须加index list.size()判断否则list.get(index)越界。这是从那以后我每次写语法分析函数都强制走一遍的 checklist所有list.get(index)前必加边界检查所有递归函数入口必加if(flag0) return。最后在main()中测试ex.txt内容{ int a; if (a 0) { a a 1; } }运行看到文法分析成功—— 你刚刚亲手给这个教学项目注入了真实编程语言的血液。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

MATLAB图像处理仿真PPT搭建:从图像增强到形态学全流程指南

MATLAB图像处理仿真PPT搭建:从图像增强到形态学全流程指南

简介:这份图像处理仿真PPT面向正在学习MATLAB Simulink仿真、尤其是需要快速掌握Video and Image Processing Blockset模块库的高校学生、科研人员与算法工程师,可帮助其在可视化建模环境下理解图像处理核心流程。资源为单个pptx演示文稿,压缩…

2026/10/17 19:30:42 阅读更多 →
LLM代理驱动GPU算子优化:从手写汇编到自动化搜索的工程实践

LLM代理驱动GPU算子优化:从手写汇编到自动化搜索的工程实践

1. 从“手写汇编”到“代理驱动”:算子优化范式正在换挡2026年过半,如果你还在用纯手工的方式去调一个LLM推理里的Attention kernel,大概率会被团队里那个“养了一堆代理”的同事按在地上摩擦。这不是危言耸听。过去两年,GPU算子优…

2026/10/17 19:30:42 阅读更多 →
SAP CDS View 从环境搭建到多表关联查询实战指南

SAP CDS View 从环境搭建到多表关联查询实战指南

简介:这份资源面向SAP开发人员与ABAP初学者,聚焦在Eclipse环境中安装SAP插件并创建CDS视图这一常见需求。CDS视图是SAP HANA中用于多表关联查询的高性能数据建模工具,掌握其创建流程对提升查询效率与开发体验很有帮助。资源包共1个文件&#…

2026/10/17 19:30:42 阅读更多 →

最新新闻

Hermes agent 使用记录:把本地 endpoint 改到 TaoToken 的完整配置与验证

Hermes agent 使用记录:把本地 endpoint 改到 TaoToken 的完整配置与验证

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

2026/10/17 20:24:31 阅读更多 →
10分钟看懂多模态视频理解大模型VideoChat-TPO:面向新手的完整入门指南

10分钟看懂多模态视频理解大模型VideoChat-TPO:面向新手的完整入门指南

【免费下载链接】VideoChat-TPO 项目地址: https://ai.gitcode.com/OpenGVLab/VideoChat-TPO 点击查看 免费下载 VideoChat-TPO 是 OpenGVLab 开源的一个多模态视频理解大模型(Multimodal LLM),基于 Mistral-7B 语言模型 ViT 视…

2026/10/17 20:24:31 阅读更多 →
并发容器源码解析:从CAS到锁的Java线程安全设计

并发容器源码解析:从CAS到锁的Java线程安全设计

1. 源码阅读前,先给并发容器建个坐标系我一直觉得,并发容器类是Java并发编程里最值得啃的一块硬骨头。它不像锁那样直观,也不像线程池那样有清晰的配置参数,它的精妙之处全藏在“性能”和“正确性”的权衡里。我自己读JDK源码那段…

2026/10/17 20:24:31 阅读更多 →
低查重AI教材生成:知识重建、实操流程与避坑实录

低查重AI教材生成:知识重建、实操流程与避坑实录

1. 为什么教材编写成了最“磨人”的内容生产任务 我最早接触教材编写,是在某家职业培训机构的教研部门。那时候团队接了一个内部课程教材的编写任务,看着不复杂——把一门课的教案、PPT、练习整理成一本像样的学生手册。结果真正动手才发现,教…

2026/10/17 20:24:31 阅读更多 →
MATLAB零基础入门教程:从界面到脚本与绘图

MATLAB零基础入门教程:从界面到脚本与绘图

MATLAB 这玩意儿,刚接触时真能让人原地劝退。第一次打开,满屏英文菜单、乱七八糟的面板,命令行里光标一闪一闪,好像你在键盘上敲什么都可能报错。但其实把它想简单一点就行:MATLAB 就是一个“计算器 编程本 画图板”…

2026/10/17 20:24:31 阅读更多 →
fnm 安装配置指南:让 OpenCode 在 PowerShell 里顺畅跑起来

fnm 安装配置指南:让 OpenCode 在 PowerShell 里顺畅跑起来

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

2026/10/17 20:23:30 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →