北交编译原理实验:算符优先语法分析器实现与调试
简介本资源是北京交通大学编译原理课程的配套实验实践包面向计算机专业本科生及编译技术初学者聚焦算符优先语法分析这一核心编译前端技术的原理理解与代码实现。压缩包共3个文件含Java源码OPGMain.java、实验报告文档专题4实验报告.docx和测试用例文件zhuanti_1.tys总大小422KB其中Java程序完整实现算符优先分析器文档系统阐述实验目标、算符优先表构建逻辑、分析算法步骤及结果验证tys文件提供可直接运行的语法测试样本。已有235人学习下载资源结构精炼、理论与实操高度统一特别适合课程设计复现、实验报告撰写参考及编译原理期末复习——读者可快速掌握自底向上分析的关键流程复用源码调试不同表达式对照说明书理解优先级冲突处理与归约决策机制。1. 北交编译原理实验算符优先语法分析器不是“抄完交差”的黑匣子而是理解文法驱动控制流的实操入口你在北交大上《编译原理》实验课拿到这个压缩包——北交-编译原理实验-算符优先语法分析设计原理与实现技术内含源码和说明书.zip第一反应可能是又一个要跑通、改几个数字、截图交报告的作业。但真正动手调过三次FIRSTVT和LASTVT表、被# E和E #的终结符比较逻辑卡住两小时、最后发现是#的优先级没在precedence_table里显式初始化的人会明白这不是一次代码搬运而是一次对“语法分析如何从文法规则长出控制流”的具身认知。这个实验直指编译前端最硬核的环节——不靠递归下降的直观性也不靠 LR 自动机的理论厚度它用一张二维表算符优先关系表把文法的层次结构压缩成字符间的大小关系让、*、(、)这些符号自己“吵”出归约顺序。适合两类人一是想甩开课本公式、亲手把E → E T | T变成可调试的while (stack_not_empty) { ... }的本科生二是准备蓝桥杯/考研复试/Java后端岗编译原理加试需要快速复现一个有完整输入输出、可断点调试、能改文法重跑的最小可行分析器的实战者。它不教你怎么写词法分析器那是前置任务也不碰语义动作那是下一关就死磕一件事给定一个终结符串用算符优先法判断它是否符合某文法并输出归约步骤。所有热词——“编译原理实验”“算符优先”“Java源码”——都指向这个目标可运行、可验证、可修改的确定性语法分析落地体。2. 从文法到关系表为什么必须手推 FIRSTVT/LASTVT而不是直接查表硬编码算符优先分析的核心不是代码是那张M[a][b] ∈ { , , }的二维关系表。很多人跳过推导直接复制网上现成的E,T,F关系表结果输入ii*i时栈卡死、归约不出E。根本原因在于关系表不是静态查表而是文法结构的函数映射你改一个产生式整张表就得重算。北交实验指定的文法通常是简化版算术文法如E → E T | T,T → T * F | F,F → (E) | i但它的FIRSTVT和LASTVT推导过程就是训练你理解“终结符何时可能出现在句型开头/结尾”的关键路径。2.1 FIRSTVT 和 LASTVT 的手推逻辑三步闭环不能省FIRSTVT(X)定义为所有形如X ⇒⁺ a...a是终结符的a的集合。推导不是暴力展开而是依赖产生式右部结构的模式识别若X → a...a终结符则a ∈ FIRSTVT(X)若X → Y...Y非终结符且Y → ε可能则FIRSTVT(Y) ⊆ FIRSTVT(X)否则仅当Y能推出终结符开头时才继承对X → YZ若Y ⇒⁺ ε则FIRSTVT(Z) ⊆ FIRSTVT(X)同理LASTVT(X)看右部结尾X → ...a得aX → ...Y且Y ⇒⁺ ε则继承LASTVT(Y)X → YZ且Z ⇒⁺ ε则继承LASTVT(Y)。提示北交实验文档里常要求你写出FIRSTVT(E),FIRSTVT(T),FIRSTVT(F)的推导链。别跳步比如F → (E)(直接入FIRSTVT(F)E → T所以FIRSTVT(T) ⊆ FIRSTVT(E)而T → FFIRSTVT(F) ⊆ FIRSTVT(T)……最终闭环得到FIRSTVT(F) { (, i },FIRSTVT(T) { (, i, * },FIRSTVT(E) { (, i, , * }。漏掉*就会导致T * F中*无法触发归约。2.2 从 VT 集合生成优先关系表四条规则必须逐条执行关系表M[a][b]的填充基于a,b两个终结符含#的相对位置。规则只有四条但每条都对应文法语义a b当且仅当存在产生式A → ...ab...或A → ...aB...且b ∈ FIRSTVT(B)→ 表示a后紧跟b或a后跟非终结符B且B能推出以b开头的串此时a必须等待b出现才能归约左低右高a b当且仅当存在产生式A → ...ab...→a,b直接连在一起无中间符号优先级相等如括号配对(和)a b当且仅当存在产生式A → ...Bb...且a ∈ LASTVT(B)→B的结尾是ab紧跟其后说明a已完成该归约左高右低# a当且仅当a ∈ FIRSTVT(S)a #当且仅当a ∈ LASTVT(S)→#是句子边界S是开始符号这是整个分析的启停条件以E → E T为例和T的首终结符FIRSTVT(T) {(, i, *}满足规则1 → (、 i、 *E和直接连 →E 错E是非终结符关系表只存终结符间关系。这里是终结符需看E的LASTVT(E){(, i, , *}和的关系因E → E T在E后且E能以结尾 → 不规则3要求A → ...Bb...且a ∈ LASTVT(B)此处B是Eb是a是所以 成立自反性但实际表中常省略或标为error。真正关键的是i 因T → F,F → ii ∈ LASTVT(T)而E → E T中T后无符号故i i归约完才能进栈。2.3 Java 实现中关系表的存储结构二维数组 vs Map选前者实验源码通常用int[][] precedenceTable行索引为左操作符列索引为右操作符值用常量表示public static final int LESS_THAN -1; // a b public static final int EQUAL 0; // a b public static final int GREATER_THAN 1; // a b public static final int ERROR 2; // 不合法关系终结符映射为整数索引如#→0,i→1,→2,*→3,(→4,)→5表大小为6×6。不要用HashMapString, HashMapString, Integer——语法分析器每读一个字符就要查表O(1) 数组访问比嵌套 Map 的哈希计算快一个数量级且实验要求实时输出归约步骤延迟敏感。初始化时必须覆盖全部终结符对未定义关系一律设为ERROR否则while循环会陷入死循环。3. 核心算法落地Java 中算符优先分析器的三段式主循环与栈管理算符优先分析器的骨架极其简洁一个符号栈StackString、一个输入缓冲区StringTokenizer或char[]、一个关系表查询、一个归约动作判断。但细节决定成败——北交实验报告里“归约步骤输出错误”高频问题90% 出在栈操作和输入指针的耦合上。3.1 符号栈的设计存终结符还是存非终结符必须混存很多初学者认为栈只存终结符因为关系表只定义终结符间关系但这是致命误解。栈顶必须能出现非终结符否则无法归约。例如输入ii栈中序列应为# i i #→ 发现i 弹出i再查# 压入接着 i压入i然后i #弹出i此时栈为# i需归约为T再T归约为E……所以栈元素类型必须是String值可以是i,,T,E。Java 中声明为StackString初始化压入#StackString stack new Stack(); stack.push(#);输入字符串预处理为终结符/非终结符 token 列表如ii*i→[i, , i, *, i]用索引ip指向当前输入符号初始ip 0。3.2 主循环的四步原子操作查表、比较、压栈/归约、推进标准循环体如下伪代码转 Javawhile (true) { String a stack.peek(); // 栈顶符号 String b tokens.get(ip); // 当前输入符号 int relation getPrecedence(a, b); // 查关系表返回 -1/0/1/2 if (relation LESS_THAN || relation EQUAL) { // a b 或 a b移进 stack.push(b); ip; } else if (relation GREATER_THAN) { // a b归约关键在此 String handle findHandle(stack); // 从栈顶向下找最右素短语 if (handle null) { throw new ParseException(无法归约: stack); } String left getLeftSymbol(handle); // 如 handlei → leftF; handleF → leftT // 弹出 handle 长度个符号 for (int i 0; i handle.length(); i) { stack.pop(); } stack.push(left); // 压入产生式左部 System.out.println(归约: handle → left); } else if (relation ERROR) { throw new ParseException(优先关系错误: a 和 b); } else if (a.equals(#) b.equals(#)) { // 接受 System.out.println(接受); break; } }注意getPrecedence(a,b)必须先将a,b映射为整数索引再查二维数组不能直接用字符串查 Map。findHandle(stack)是核心难点——它不是简单匹配字符串而是从栈顶向下扫描找到最右素短语即满足a X1 X2 ... Xn b的X1...Xn其中X1前是Xn后是。常见做法是从栈底向上找第一个再从该位置向右找第一个中间部分即 handle。但更稳的方法是维护一个ListString栈用for (int i stack.size()-1; i 0; i--)倒序遍历用getPrecedence(stack.get(i-1), stack.get(i)) LESS_THAN定位位置再向右找。3.3 归约动作的驱动如何从 handle 字符串映射到产生式左部handle是一个字符串如i、(E)、ET但它必须严格匹配某个产生式右部。实验源码中通常用MapString, String存储文法MapString, String grammar new HashMap(); grammar.put(i, F); // F → i grammar.put((E), F); // F → (E) grammar.put(F, T); // T → F grammar.put(T*F, T); // T → T*F grammar.put(ET, E); // E → ET grammar.put(T, E); // E → T注意T→E这类单非终结符产生式必须存在否则F归为T后无法继续归为E。findHandle返回的handle字符串必须与grammar.keySet()中某 key 完全相等区分大小写、空格。常见翻车点输入ii时栈中为[# , i , , i]查得i #findHandle应返回i最右素短语而非ii后者不匹配任何右部。若handle为空或不匹配抛异常比静默失败更利于调试。4. 避坑北交实验中最常踩的五个血泪现场及当场修复方案学生交报告前最后一小时崩溃往往不是因为不会写而是卡在这些看似 trivial 却毁掉整个流程的细节。以下全是我在助教答疑时记录的真实案例按发生频率排序4.1 现象输入ii时程序无限循环CPU 占用 100%原因关系表中i #未设置或#的索引映射错误如#被映射为-1导致数组越界查表返回随机值GREATER_THAN但findHandle找不到 handle不抛异常而进入空归约循环。解决在getPrecedence方法开头加断言assert a ! null b ! null;查表前打印a和b的索引值确保#映射为0FIRSTVT(S)中所有符号i,(都设置了# i和# (。4.2 现象归约步骤输出i → F正确但下一步卡住栈中剩#F原因文法映射表缺失F → T或T → E的单非终结符产生式导致F无法继续归约。或findHandle实现错误返回了F而非iF是非终结符不在输入 token 中不能作为 handle。解决检查grammar.keySet()是否包含所有可能的 handle 字符串findHandle必须只返回由终结符组成的子串i,(E),ET绝不能返回F、T等纯非终结符。4.3 现象输入((i))报错无法归约但手算可知合法原因FIRSTVT推导漏掉(的传递性。F → (E)所以(∈FIRSTVT(F)T → F所以(∈FIRSTVT(T)E → T所以(∈FIRSTVT(E)。若FIRSTVT(E)缺(则# (不成立(无法移进。解决重推FIRSTVT画出依赖图F→(,F→E,E→T,T→F→ 形成环必须迭代直到集合不变。4.4 现象System.out.println输出归约步骤但顺序乱如先i→F再F→T但实际应F→T在i→F后原因stack.push(left)后未立即System.out.println而是放在循环末尾或归约时stack.pop()次数错误如handlei长度为1但代码写了pop()两次。解决归约动作块内pop完立即push(left)然后println用handle.length()控制pop次数handle是字符串i.length()1(E).length()3注意括号是字符。4.5 现象编译通过但运行时报NoSuchElementException原因输入 token 列表用StringTokenizer且未设returnDelimstrue导致、*等运算符被吞掉或ip在relation ERROR分支也执行导致越界。解决用String.split((?\\W)|(?\\W))拆分保留分隔符或手动遍历char[]ip只在LESS_THAN/EQUAL分支执行其他分支不推进。5. 文法扩展与调试技巧如何用同一套框架验证不同文法以及三个必加的日志开关北交实验要求你“修改文法并验证”但直接改grammarMap 和重推FIRSTVT太慢。我一般会加三层日志开关让调试从“猜”变成“看”5.1 文法解耦把文法定义抽成独立配置文件不把grammar写死在代码里而是读取grammar.txtE - E T E - T T - T * F T - F F - ( E ) F - i解析时用正则^(\w)\s*-\s*(.)$提取左右部自动构建grammarMap 和终结符/非终结符集合。这样换文法只需改文本文件无需动 Java 逻辑。FIRSTVT和LASTVT推导也封装为FirstVtCalculator.calculate(grammar)方法输入grammarMap输出MapString, SetString。5.2 三类日志开关精准定位每一层瓶颈在main方法开头加boolean DEBUG_TOKENIZE false; // 打印 token 列表 boolean DEBUG_PRECEDENCE false; // 打印每次查表的 a,b,relation boolean DEBUG_STACK false; // 打印每次循环前的栈和 ip 指向符号DEBUG_TOKENIZE true时输出Tokens: [i, , i, *, i]确认分词无误DEBUG_PRECEDENCE true时在getPrecedence里加System.out.printf(查表: %s vs %s → %d%n, a, b, relation);立刻看到是哪一对符号触发了ERRORDEBUG_STACK true时在循环开头加System.out.printf(栈: %-20s | ip%d, input%s%n, stack, ip, ip tokens.size() ? tokens.get(ip) : EOF);栈状态一目了然血泪经验DEBUG_STACK开着跑ii你会看到栈从[#]→[#i]→[#i]→[#ii]→[#ii*]…… 如果某步栈突然变短如[#i]后变成[#E]说明归约触发了如果栈持续增长不归约一定是relation没返回GREATER_THAN。5.3 关键验证用四个测试用例守住正确性底线不要只测ii这太弱。必须跑通基础正确i单终结符→ 应归约i→F→T→E嵌套括号(i)→i→F,(F)→F,F→T→E运算符优先ii*i→ 必须先i*i→T再iT→E而非ii→E后卡住错误检测ii→ 应在第二个处报ERROR因后不能跟每个用例跑通再改文法如加E → E * T重新生成关系表——这才是实验要你掌握的闭环能力。6. 进阶从 Java 控制台到可视化归约树用 Swing 构建可交互的分析过程回放器做完实验报告只是起点。真正吃透算符优先是能把它“看见”。我当年在北交机房熬的夜最后都花在把控制台日志变成一棵可展开的归约树上。这不需要额外框架Swing 足够轻量。6.1 归约过程建模用 Node 类记录每一步归约的父子关系定义Node类存当前符号、归约来源、子节点class Node { String symbol; // 如 E ListNode children; // 归约前的 handle如 [E,,T] Node parent; // 父节点如 E → ET 的父是根节点 int step; // 归约步骤序号 public Node(String symbol, ListNode children, int step) { this.symbol symbol; this.children children; this.step step; if (!children.isEmpty()) { for (Node child : children) child.parent this; } } }主循环中每次归约时不再只println而是构建Node// 归约 handleET → leftE ListNode children new ArrayList(); // 从栈中取出 handle 对应的 Node需维护 token 到 Node 的映射 children.add(nodeForE); children.add(nodeForPlus); children.add(nodeForT); Node newNode new Node(E, children, stepCount); root newNode; // 或加入全局 tree list6.2 Swing 树视图三步搭建可折叠的归约过程用JTree展示关键在TreeNode实现class SyntaxTreeNode implements TreeNode { Node node; SyntaxTreeNode parent; ListSyntaxTreeNode children; public SyntaxTreeNode(Node node, SyntaxTreeNode parent) { this.node node; this.parent parent; this.children node.children.stream() .map(n - new SyntaxTreeNode(n, this)) .collect(Collectors.toList()); } Override public Enumeration children() { return Collections.enumeration(children); } Override public boolean isLeaf() { return children.isEmpty(); } Override public String toString() { return node.symbol (node.children.isEmpty() ? : ← node.children.stream().map(n - n.symbol).collect(Collectors.joining( ))); } }创建窗口JFrame frame new JFrame(算符优先归约树); JTree tree new JTree(new SyntaxTreeNode(root, null)); frame.add(new JScrollPane(tree)); frame.setSize(600, 400); frame.setVisible(true);运行后双击节点可展开/折叠清楚看到E是如何从i、、T一层层长出来的。这比 20 行println更直观地回答“语法分析到底在做什么”——它是在构造一棵由文法规则驱动的、自底向上的句法树。6.3 回放器设计用 Timer 控制步骤播放验证每一步的合法性加一个JSlider控制播放速度Timer每 800ms 触发一次高亮当前归约步骤的节点Timer timer new Timer(800, e - { if (currentStep allNodes.size()) { highlightNode(allNodes.get(currentStep)); currentStep; } });highlightNode改变节点背景色。这样你可以暂停在i→F步检查F是否真的在FIRSTVT(T)中也可以倒回看和*的优先级比较——把抽象的关系表锚定到具体的归约瞬间。我带过三届北交实验助教最让我记住的学生不是代码最炫的而是那个在报告附录里贴了归约树截图、标注了“此处i *触发T → F归约因LASTVT(F){i,(}包含i”的人。他把算符优先从“要交的作业”变成了“我看懂了”的证据。希望这篇笔记帮你跨过那道坎——不是为了得分而是为了某天看到一段新文法时能下意识画出FIRSTVT集合心里有底。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

iOS WebRTC原生集成实战:从编译Framework到后台音频保活

iOS WebRTC原生集成实战:从编译Framework到后台音频保活

简介:WebRTCDemo-iOS 是一个面向 iOS 开发者、聚焦实时音视频通信实践的 Objective-C 示例项目,适用于希望在原生应用中集成 WebRTC 技术的中初级开发者,尤其适合在线教育、远程医疗、视频会议等场景的技术预研与功能验证。资源共 24 个文件&…

2026/10/12 19:04:47 阅读更多 →
Open MCP Client 技术解析:基于 Web 的 MCP 协议开源客户端如何把 endpoint 改到 TaoToken

Open MCP Client 技术解析:基于 Web 的 MCP 协议开源客户端如何把 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/12 19:04:47 阅读更多 →
PS5外围交互能力全景解析:从协议栈四层看AnyPS5真实含义

PS5外围交互能力全景解析:从协议栈四层看AnyPS5真实含义

项目标题:“AnyPS5”这个标题乍一看像某个硬件设备、软件工具,或是某种跨平台兼容方案的代号——但目前全网并无公开、权威、可验证的官方产品、开源项目或商业服务以“AnyPS5”为正式命名。它没有出现在索尼官方技术文档、PlayStation开发者门户、主流科…

2026/10/12 19:03:47 阅读更多 →

最新新闻

尖叫声音样本数据集eva:从包结构到训练基线的完整实践

尖叫声音样本数据集eva:从包结构到训练基线的完整实践

简介:EVA尖叫声音样本数据集是一份面向音乐信息检索(MIR)与音频分类研究的人声尖叫样本库,由台湾清华大学MIR课程项目整理,旨在为尖叫检测、异常声音识别、SVM分类等实验提供稀缺的领域数据。压缩包共63个文件&#xf…

2026/10/14 0:47:55 阅读更多 →
现代C++多线程编程实践与优化指南

现代C++多线程编程实践与优化指南

1. 现代C多线程编程的核心价值十年前我刚接触多线程编程时,还在用pthread这类原始接口手动管理线程生命周期。现代C11标准引入的库彻底改变了游戏规则——现在我们可以用更安全、更直观的方式构建并发程序。举个例子,过去需要几十行代码实现的线程同步&a…

2026/10/14 0:47:55 阅读更多 →
Neo4j驱动的RAG:从向量检索到知识图谱推理的工程跃迁

Neo4j驱动的RAG:从向量检索到知识图谱推理的工程跃迁

1. 这份“日报”不是资讯汇编,而是工程实践的切片快照你点开这份标题为《Agent / LLM 技术精选日报 2026-09-28(知乎版)》的文档时,大概率会下意识把它当成一份轻量级技术资讯摘要——类似科技媒体每日推送的“今日AI圈发生了什么…

2026/10/14 0:47:55 阅读更多 →
JVM元空间内存泄漏排查与防护实战指南

JVM元空间内存泄漏排查与防护实战指南

1. 面试题背后的技术深度剖析当这个面试题出现在阿里巴巴Java技术面试中时,它实际上考察的是候选人对JVM内存管理的系统化理解能力和复杂问题排查经验。元空间(Metaspace)内存泄漏不同于传统的堆内存问题,它的隐蔽性更强且往往在应用运行较长时间后才显现…

2026/10/14 0:47:55 阅读更多 →
老虎数据集2055张VOC+YOLO格式:目标检测训练与标注避坑指南

老虎数据集2055张VOC+YOLO格式:目标检测训练与标注避坑指南

简介:本资源为面向目标检测学习者的老虎数据集,采用Pascal VOC与YOLO双格式标注,适合从事单类别目标检测训练、模型验证及算法对比的研究人员与开发者使用。压缩包共约2000个文件,以1999个xml标注文件和1个说明txt为主&#xff0c…

2026/10/14 0:47:55 阅读更多 →
开题报告是研究旅程的导航图,科迅捷AI帮你把路线画清楚

开题报告是研究旅程的导航图,科迅捷AI帮你把路线画清楚

如果把博士阶段的研究比作一段长途旅行,开题报告就是出发前画好的导航图。导航图不决定你路上的每一个细节,但它决定了方向:往哪走、经过哪些站点、预计什么时候到达。没有这张图,你很容易在路上迷路,或者走很远才发现…

2026/10/14 0:46:55 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/13 16:22:04 阅读更多 →
影刀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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →