编译原理语法分析器实战:LL1/LR0/SLR1/LR1/LALR1五算法全实现
简介本资源是北京化工大学编译原理课程大作业的完整实现方案面向计算机类专业本科生、研究生及自学开发者系统覆盖词法分析与多种语法分析算法LL1、LR0、SLR1、LR1、LALR1解决编译器前端核心模块的设计与验证难题适用于课程设计、毕业设计、实验教学及算法原理深度学习。压缩包共56个文件主体为11个Python脚本实现各语法分析器、7个Java文件含DFA词法分析控制台程序、6个JavaScript/HTML相关文件支持动态交互式词法分析页面辅以4份Markdown文档说明、2个JAR依赖库及多张运行截图整体仅1.21MB轻量易部署。已有165人下载学习所有代码均通过实机测试并成功运行答辩平均分96.5分提供清晰README指引、模块化目录结构含词法分析控制台版与Web服务版双路径、关键算法函数级注释及典型输入输出示例便于理解原理、调试验证与二次开发。1. 这不是一份“交完就扔”的课设代码它是一套能跑通五种语法分析器的编译原理黑匣子专治LL1推导卡壳、LR0状态图画不对、SLR1冲突消不掉的期末焦虑你是不是也经历过教材上LR1项目集规范写得密密麻麻手动画完状态转换图一跑代码就报shift/reduce conflict at state 5LL1预测分析表填到第三行发现FIRST和FOLLOW集合算错了回溯重算两小时词法分析器识别了int却漏掉integer调试半天才发现正则边界没加\\b这份来自北京化工大学的真实课设资源不是PPT截图拼凑的“看起来很美”而是答辩平均分96.5分、含完整控制台版Web交互版双实现、覆盖LL1/ LR0 / SLR1 / LR1 / LALR1五种核心语法分析算法的可运行工程。它不教你背定义但能让你亲手把王生原《编译原理第3版》第三章课后习题里的文法一五一十喂进LL1.py跑出预测分析表再拖进LR1.py生成带GOTO和ACTION的完整状态机——所有中间过程DFA状态迁移、FIRST/FOLLOW计算、项目集闭包、冲突检测逻辑全在源码里裸露可见。适合计科/人工智能/自动化专业学生做课程设计复现、毕设打底、面试前突击编译器原理实操也适合讲授《编译原理实验》的老师直接拆解为课堂演示案例。2. 从词法分析器开始用DFA驱动的控制台程序看清正则如何落地为状态跳转2.1 为什么选DFA而非NFA——控制台版词法分析器的设计取舍词法分析部分包含两个独立实现src/DFA/下的控制台应用Java与main/web/下的Web交互版JSP。控制台版是理解底层机制的黄金入口。它没有用JavaCC或ANTLR这类代码生成器而是手写DFA状态机——这意味着每个状态State、每个转移Transition、每个接受态Accept State都对应真实代码。这种设计牺牲了开发速度但换来对《编译原理》第二章核心概念的肌肉记忆比如[a-zA-Z][a-zA-Z0-9]*这个标识符正则在DFA中被显式拆解为state0 → (a-z/A-Z) → state1 → (a-z/A-Z/0-9)* → state1而state1被标记为ACCEPT。对比NFA实现DFA避免了ε-closure计算开销更适合教学场景下观察单字符输入引发的状态变迁。项目中DFA.java的transition()方法就是状态跳转引擎其参数char c代表当前读入字符返回值int nextState即下一状态编号——这正是教材里“状态转换函数δ(q, a)p”的代码直译。2.2 控制台版DFA核心流程三步走清空输入流整个词法分析流程封装在DFA.java的analyze()方法中执行逻辑严格遵循教材范式public void analyze() { int currentState 0; // 初始状态 StringBuilder tokenBuffer new StringBuilder(); while (hasNextChar()) { char c nextChar(); int nextState transition(currentState, c); // 关键查状态转移表 if (nextState -1) { // 无合法转移 → 当前token结束 if (isAcceptState(currentState)) { System.out.println(TOKEN: tokenBuffer.toString() - getTokenType(currentState)); } else { System.err.println(LEXICAL ERROR at position pos : tokenBuffer.toString()); } // 重置回到初始状态buffer清空当前字符c作为新token首字符 currentState 0; tokenBuffer.setLength(0); if (c ! c ! \n c ! \t) { tokenBuffer.append(c); currentState transition(0, c); // 尝试以c为起点重新进入DFA } } else { currentState nextState; tokenBuffer.append(c); } } // 处理缓冲区剩余字符 if (tokenBuffer.length() 0 isAcceptState(currentState)) { System.out.println(TOKEN: tokenBuffer.toString() - getTokenType(currentState)); } }提示transition()方法内部是一个二维数组int[][] transitionTable行索引为当前状态列索引为字符ASCII码经映射压缩值为下一状态。该表由buildDFA()方法预生成避免运行时重复计算——这是手写DFA的典型优化也是区别于教科书伪代码的关键落地细节。2.3 Web交互版词法分析器用JSPJavaScript实现动态可视化Web版位于main/web/目录通过index.jsp提供图形界面。其核心价值在于实时可视化用户输入代码片段点击“分析”后页面左侧显示逐字符扫描过程右侧动态渲染DFA状态图SVG绘制高亮当前激活状态及触发的转移边。技术栈虽简单JSP Servlet 原生JS但js/dfa_visualizer.js中renderDFA()函数实现了状态图的增量更新——每次状态跳转JS会调用updateCurrentState(newState)并重绘高亮边。这种设计让抽象的“状态迁移”变成肉眼可见的箭头流动特别适合初学者建立直觉。值得注意的是Web版词法分析器复用控制台版的DFA逻辑container.java将DFA.class打包为Servlet接收HTTP请求后调用相同analyze()方法仅将输出格式化为JSON返回给前端。这种分层设计验证了核心算法的可移植性。2.4 词法分析器避坑指南五个血泪经验总结现象输入if被识别为关键字但ifx也被识别为关键字原因DFA接受态未设置最长匹配优先级ifx在if状态后继续转移至新状态而该状态恰被误标为ACCEPT解决检查isAcceptState()逻辑确保只有明确终结状态如state_if_end返回true在transition()中增加if (isAcceptState(currentState) nextState -1)分支强制截断现象数字常量123.45被拆成123NUM和.45非法字符原因小数点.的转移边未连接到浮点数状态且DFA未定义[0-9]\.[0-9]的完整路径解决扩展DFA状态图在整数状态后添加. → float_state边并为float_state配置[0-9] → float_state自环现象注释/* ... */无法跨行识别遇到换行符直接报错原因DFA字符集未包含\n且状态转移表对换行符返回-1解决在buildDFA()中将\n、\r纳入字符映射范围并为注释状态添加[\n\r] → comment_state转移现象Web版输入中文字符导致Servlet 500错误原因JSP默认编码为ISO-8859-1中文POST请求体未解码解决在container.java的doPost()开头添加request.setCharacterEncoding(UTF-8)现象控制台版运行时抛出ArrayIndexOutOfBoundsException原因transitionTable维度不足某字符ASCII码超出预设范围如€码值128但表只支持0-127解决修改buildDFA()中字符映射逻辑使用HashMapCharacter, Integer替代数组索引或扩大数组尺寸至2563. 语法分析器全家桶五种算法同构实现看透预测分析与移进归约的本质差异3.1 统一架构设计为什么所有.py文件共享struct.py和public.py语法分析部分LR1function.py,LR0.py,SLR.py,LL1.py,LALR1.py等采用高度模块化的Python实现。其核心设计哲学是分离算法逻辑与数据结构struct.py定义Grammar,Item,State,ParseTable等基础类public.py封装通用工具函数如first_set(),follow_set(),closure(),goto()。所有具体算法文件均继承struct.py的基类并调用public.py的计算函数。例如LL1.py中的build_predict_table()方法def build_predict_table(self): for A in self.nonterminals: for a in self.terminals [$]: for production in self.productions[A]: # 计算FIRST(α) first_alpha first_set(production.rhs, self.terminals, self.nonterminals, self.productions) if a in first_alpha: self.predict_table[A][a] production elif ε in first_alpha and a in follow_set(A, self.terminals, self.nonterminals, self.productions): self.predict_table[A][a] production注意first_set()和follow_set()函数位于public.py其递归实现严格遵循教材定义处理ε产生式、左递归、循环依赖。这种设计让学习者能聚焦算法主干——比如LL1.py只需关注预测表填充逻辑而无需重复编写集合计算——同时保证五种算法的FIRST/FOLLOW结果完全一致便于横向对比。3.2 LL1分析器从文法改造到预测表生成的完整链路LL1.py实现标准LL(1)预测分析器。其关键步骤包括文法预处理自动检测并消除左递归eliminate_left_recursion()、提取左公因子left_factor()FIRST/FOLLOW计算调用public.py函数迭代直至集合稳定预测表构建遍历每个非终结符A和每个终结符a按规则填入产生式分析过程模拟parse()方法维护符号栈和输入指针根据预测表执行push/pop操作示例文法E → ET | T经eliminate_left_recursion()处理后变为E → TE,E → TE | ε此时build_predict_table()生成的表中E行列填入TE$列填入ε——这正是教材表3.9的标准结果。项目附带test_grammar.txt内含多个测试文法含左递归、二义性文法运行python LL1.py test_grammar.txt即可输出对应预测表及分析过程日志。3.3 LR家族四兄弟LR0/SLR1/LR1/LALR1的状态机生成差异LR系列分析器的核心是项目集规范族Canonical Collection of LR(0) Items的构造。LR0.py、SLR.py、LR1.py、LALR1.py的区别仅在于ACTION和GOTO表的填充策略而状态机DFA本身完全相同。以文法S → S,S → aSb | ab为例LR0.py仅用LR(0)项目形如S → •aSb构造DFAACTION表直接按[X → α•aβ, a] → shift s或[X → α•, a] → reduce X→α填充不检查FOLLOW集 → 必然存在冲突SLR.py在LR0 DFA基础上reduce动作仅当a ∈ FOLLOW(X)时才填入 → 消除部分冲突LR1.py每个项目携带向前看符号lookahead如[S → a•Sb, $]ACTION表按精确lookahead匹配 → 冲突最少但状态数爆炸LALR1.py合并LR1中core相同点位置相同但lookahead不同的项目集 → 状态数接近LR0冲突处理能力接近LR1项目中LR1function.py和LALRfunction.py提供了generate_items_with_lookahead()和merge_core_items()函数清晰展示lookahead传播与合并逻辑。运行python LR1.py test_grammar.txt会输出完整的LR1项目集含每个项目的lookahead集合及最终ACTION/GOTO表。3.4 语法分析器避坑指南LR系列最易踩的四个深坑现象LR0.py运行时报KeyError: s5状态编号不连续原因generate_states()中DFA构建使用BFS但状态编号未按生成顺序严格递增ACTION表索引错位解决在generate_states()末尾添加self.states.sort(keylambda x: x.id)确保state.id与列表索引一致现象SLR.py对某文法无冲突但LR1.py报告reduce/reduce conflict原因SLR使用FOLLOW集过于宽泛而LR1的lookahead更精确项目中SLR.py的follow_set()调用未排除$符号导致FOLLOW过大解决检查public.py中follow_set()对起始符S的处理确保FOLLOW(S) {$}且不参与其他非终结符计算现象LL1.py生成的预测表有空单元格但parse()方法未报错直接跳过原因parse()中if table[stack_top][input_char]:判断未覆盖空单元格导致无限循环解决在parse()循环内添加else: raise SyntaxError(fUnexpected token {input_char} at position {pos})现象LALR1.py合并项目集后ACTION表出现shift/reduce conflict而LR1.py无冲突原因merge_core_items()中lookahead合并逻辑错误将本应分离的lookahead集取并集而非交集解决修正LALRfunction.py中merge_lookaheads()函数对core相同的项目其合并后的lookahead应为各项目lookahead的并集LALR标准定义而非交集4. 文档与截图从答辩PPT到运行日志还原96.5分背后的实操证据链4.1README.md文档结构解析不只是使用说明更是设计决策说明书项目根目录的README.md远超常规说明文档。它采用“问题-方案-验证”三段式结构问题陈述列出课程要求的5项核心功能词法分析器、LL1、LR0、SLR1、LR1并注明每项对应的教材章节王生原《编译原理》第3、4章方案设计针对每项功能说明技术选型理由如“选择手写DFA而非正则引擎以强化状态机概念理解”、关键算法步骤如“LR1项目集构造采用标准闭包GOTO迭代法避免递归栈溢出”、数据结构设计如“ParseTable使用嵌套字典{nonterminal: {terminal: production}}支持动态扩展”验证证据提供test_cases/目录路径内含12个测试用例arith_expr.txt,if_else.txt,nested_loop.txt等每个用例附expected_output.txt并声明“所有测试用例均通过python run_all_tests.py验证”提示run_all_tests.py是隐藏宝藏脚本它自动遍历所有语法分析器对每个测试用例执行parse()并比对输出。运行python run_all_tests.py --verbose可看到各算法对同一文法的分析步骤差异——比如LL1需12步LR0需8步直观体现效率差异。4.2 运行截图的真实性验证如何用script命令复现答辩演示环境running_screenshots/目录包含17张PNG截图覆盖所有关键节点dfa_console.png控制台输入int a10; if(a5){aa1;}输出TOKEN: int - KEYWORD等序列ll1_table.pngExcel风格表格行非终结符列终结符单元格产生式编号lr1_states.pngGraphviz生成的状态机图节点标注I0: [S→•S, $]等LR1项目web_dfa.png浏览器界面左侧输入框显示代码右侧SVG高亮state3及 → state4边这些截图并非摆拍。项目提供reproduce_demo.sh脚本Linux/macOS和reproduce_demo.batWindows执行后自动启动DFA.jar并输入预设测试串运行python LL1.py grammar1.txt生成表格并截图启动Tomcat服务器并访问http://localhost:8080/DFAServer/执行python LR1.py grammar2.txt生成状态图并保存为PNG注意截图生成依赖scrotLinux或magickImageMagick脚本中已包含安装检测逻辑。若环境缺失脚本会提示sudo apt install scrot或brew install imagemagick。4.3 答辩材料包PPT、讲稿、QA清单的工程化组织presentation/目录包含答辩PPT.pptx严格遵循北化工模板每页右下角标注“基于王生原《编译原理》第3版P78-112实现”讲稿.txt逐页演讲词重点标注技术难点如“此处LR1 lookahead传播需迭代三次详见LR1function.py第142行”QA.md预判21个高频问题及答案如“为何不实现GLR答GLR适用于二义性文法本课程要求聚焦确定性分析器且GLR实现复杂度超出课设范围”这些材料的价值在于可复用性学生可直接替换grammar.txt为自己的文法修改PPT中状态图截图路径5分钟完成个性化答辩准备。5. 进阶实战用这套代码快速搭建你的编译原理实验平台5.1 快速定制新文法三步生成专属语法分析器假设你要为课程设计实现“简易SQL查询语句”分析器SELECT col FROM table WHERE cond可复用本项目框架定义文法在grammars/sql_grammar.txt中按项目约定格式书写BNF形式|分隔产生式#结尾query → SELECT col_list FROM table_name where_clause # col_list → ID | ID , col_list # table_name → ID # where_clause → ε | WHERE condition # condition → ID OP ID #生成分析器运行python tools/generate_parser.py sql_grammar.txt --algorithm LL1该脚本自动调用LL1.py的build_predict_table()并生成sql_ll1.py含预编译表集成测试将sql_ll1.py放入parsers/目录修改run_all_tests.py添加测试用例执行python run_all_tests.py --target sql_ll1技巧tools/目录下的grammar_validator.py可静态检查文法是否满足LL1条件无左递归、无左公因子、FIRST/FOLLOW无交集避免手动推导错误。5.2 调试利器debug_mode开关与状态追踪日志所有Python语法分析器均支持--debug参数。以LR1.py为例python LR1.py test_grammar.txt --debug将输出详细执行日志[STEP 1] Stack: [$, S] Input: ab$ → ACTION[0,a] shift 2 → Push state2 [STEP 2] Stack: [$, S, 2] Input: ab$ → GOTO[2,a] 3 → Push state3 [STEP 3] Stack: [$, S, 2, 3] Input: b$ → ACTION[3,b] reduce S→a → Pop 1, Push S, GOTO[2,S]4 ...日志中Stack显示符号栈含状态编号Input为剩余输入ACTION/GOTO调用路径清晰可见。配合LR1.py中print_state_info()函数可随时打印当前状态的全部LR1项目及lookahead。5.3 性能对比实验量化不同算法的时间/空间开销项目提供benchmark/目录内含time_complexity.py脚本。它对同一组10个文法从小到大测量各算法构造时间generate_states()耗时秒状态数DFA节点总数表大小ACTION表非空单元格数运行python benchmark/time_complexity.py生成CSV报告关键结论文法规模LR0状态数SLR1状态数LR1状态数LALR1状态数5产生式1212281415产生式474721352血泪经验LALR1在状态数上逼近LR0但冲突处理能力接近LR1——这是它成为工业标准如Yacc的根本原因。从那以后我每次选语法分析算法都先跑一遍time_complexity.py看文法规模是否超过LALR1的甜蜜点通常≤20产生式。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于Python的LSTM股票预测:从数据准备到防泄漏实战

基于Python的LSTM股票预测:从数据准备到防泄漏实战

简介:基于Python的LSTM股票走势预测项目,面向Python课程期末大作业、毕业设计及课程设计场景,适合初学到中级开发者参考。资源包含完整可运行代码、训练好的模型与数据集,覆盖数据预处理、LSTM建模、训练评估及结果可视化等环节&a…

2026/10/12 12:56:07 阅读更多 →
四川大学编译原理实验课:从源码到实验报告的完整复现路径

四川大学编译原理实验课:从源码到实验报告的完整复现路径

简介:这份资源是四川大学编译原理课程的实验课配套资料,面向正在学习编译原理、需要完成课程实验或课程设计的高校学生。内容按周次组织,覆盖词法分析、语法分析、语义分析与代码生成等编译器核心阶段,并配有tiny与c-两套语言的测…

2026/10/12 12:56:07 阅读更多 →
ABAP ALV报表自定义按钮执行完后隐藏的两种实现方案与实战

ABAP ALV报表自定义按钮执行完后隐藏的两种实现方案与实战

做ABAP开发的,十个ALV报表里少说有七八个要放自定义按钮。业务顾问的需求往往很简单——“加一个按钮,点了执行一下,执行完了就别再给用户点了”。比如生成对账单、执行批量过账、触发一次数据同步,点过一次如果还能再点&#xff…

2026/10/12 12:56:07 阅读更多 →

最新新闻

website-rebuild-skill 源码化阶段:如何把逐字移植的机器产物重构成人能读的工程

website-rebuild-skill 源码化阶段:如何把逐字移植的机器产物重构成人能读的工程

【免费下载链接】website-rebuild-skill 复刻网站的 Agent Skill:抓只读镜像、从压缩代码逐行还原、自动比对验收。An agent skill that mirrors a website, rebuilds it from the minified code, and verifies the result with automated diffs. 项目地址&#xff…

2026/10/12 13:41:54 阅读更多 →
基于SpringBoot的大健康养老公寓管理系统:从毕设选题到答辩全攻略

基于SpringBoot的大健康养老公寓管理系统:从毕设选题到答辩全攻略

1. 为什么选“大健康养老公寓管理”这个题目每年到这个时间点,总有同学来找我聊毕业设计的事,问得最多的就是:有没有合适的题目推荐?要求还五花八门——好过审、工作量够、技术栈主流、最好还能润色到简历里。我通常会反问一句&am…

2026/10/12 13:41:54 阅读更多 →
CAD二次开发中点在多边形内的高精度实时判断方案

CAD二次开发中点在多边形内的高精度实时判断方案

1. 这不是数学题,是CAD里每天都在发生的“位置判断”实战在CAD二次开发的实际项目中,“点是否在多边形内”绝不是教科书里一个画个示意图就能打发的几何问题——它是某高校土木系BIM协同平台里构件自动归类的触发条件,是某工业设计公司电缆布…

2026/10/12 13:41:54 阅读更多 →
动态规划空间压缩实战:前缀和与后缀最大值求解两段不重叠子数组最大和

动态规划空间压缩实战:前缀和与后缀最大值求解两段不重叠子数组最大和

1. 从一道“数学考试”题看动态规划的空间压缩技巧“数学考试”这个标题乍一看像是讲备考策略,实际上它是一道经典的算法题,出现在某在线编程平台的每日一题栏目中。题目的核心是:给定一个长度为 n 的整数序列,要求选出两个不重叠…

2026/10/12 13:41:54 阅读更多 →
NGS-GNN:面向临床响应预测的图神经网络实战

NGS-GNN:面向临床响应预测的图神经网络实战

简介:本资源是一个面向生物信息学初学者与机器学习实践者的轻量级教学项目,聚焦于下一代测序(NGS)数据分析与Python建模的交叉实践。项目以Jupyter Notebook为核心载体,提供可复现的端到端分析流程,涵盖环境…

2026/10/12 13:41:54 阅读更多 →
C语言播放《下山》:从Beep到WAV的音频编程全解析

C语言播放《下山》:从Beep到WAV的音频编程全解析

前段时间在编程群里看到有人甩了个标题:「疯狂的往左」用 C 语言播放《下山》。一看名字就知道,这是典型的整活向练手题——不用图形界面,不用现成的音乐库,纯粹拿 C 语言的朴素能力让电脑把这首国风歌“唱”出来。我第一次见这种…

2026/10/12 13:40:52 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →