四川大学编译原理实验课:从源码到实验报告的完整复现路径
简介这份资源是四川大学编译原理课程的实验课配套资料面向正在学习编译原理、需要完成课程实验或课程设计的高校学生。内容按周次组织覆盖词法分析、语法分析、语义分析与代码生成等编译器核心阶段并配有tiny与c-两套语言的测试用例便于对照验证各阶段实现效果。压缩包共53个文件、约2.24MB以txt测试用例、h头文件、c与c-源码、tny样例、makefile构建脚本为主另有docx说明文档、pptx课程设计讲稿和README.md项目概述源码与文档相互配套方便理解工程结构与实验要求。目前已有158人学习。读者可借助各周实验的源码与说明文档梳理从记号流到抽象语法树再到目标代码的完整实现路径结合测试用例调试自己的分析器与代码生成模块并参考课程设计讲稿把握实验重点与提交要求适合作为课程作业参考与期末复习的实践材料。1. 四川大学编译原理实验课从源码到实验报告的完整复现路径如果你正在搜“四川大学编译原理课程-实验课相关代码与实验报告”大概率是三种人之一正在上这门课、被 lex/yacc 或递归下降卡住的学生想拿一套完整实现对照自己代码的开发者或者准备把这套实验当作编译原理入门练手项目的自学者。这个标题背后其实是一套典型的编译原理实验体系词法分析、语法分析、语义分析、中间代码生成外加一份把设计思路和测试结果写清楚的实验报告。它解决的核心问题是——让你不用从零猜“老师到底想要什么”而是有一份可运行、可对照、可改参数的参考实现。适合谁适合已经学过形式语言与自动机、但一动手就不知道从哪写起的同学也适合想用 Python 或 Java 把编译前端跑通、顺便理解符号表和语法制导翻译的工程师。下面我按“先跑通、再改对、最后写明白”的顺序把这条路拆开讲。2. 编译原理实验课到底在做什么四类实验与选型逻辑2.1 词法分析、语法分析、语义分析、代码生成各自的任务边界编译原理实验课通常不是让你写一个完整编译器而是把前端拆成几个可独立验证的模块。词法分析负责把字符流切成 token输出类型, 值序列语法分析负责按文法把 token 序列组织成语法树语义分析负责填符号表、做类型检查代码生成负责把语法树或中间表示翻译成四元式、三地址码或目标汇编。这四步的输入输出必须严格对齐否则后面全崩。常见做法是词法分析输出 token 文件语法分析读 token 文件建 AST语义分析遍历 AST 填符号表代码生成再遍历一次 AST 输出中间代码。每一步都留一个可单独测试的入口这样调试时不用每次从头跑。选型上词法分析可以用手写状态机也可以用 lex/flex语法分析可以用递归下降、LL(1)、LR(1)也可以用 yacc/bison。四川大学这类课程实验通常要求手写递归下降或 LL(1)因为能逼你理解 FIRST/FOLLOW 集和预测分析表。如果你只是想快速跑通用 Python 的 PLY 或 Java 的 JavaCC 也能交差但报告里最好写清楚你用的是工具生成还是手写避免答辩时被追问“预测分析表怎么构造的”答不上来。2.2 为什么先跑通词法语法再补语义和代码生成血泪经验一上来就同时写四个模块最后一定是一锅粥。正确顺序是先让词法分析能正确切出所有 token再用这些 token 喂给语法分析确认能建出正确的语法树。这两步跑通后语义分析和代码生成才有稳定的输入。具体操作先写一个lexer.py读源文件输出 token 列表再写一个parser.py读 token 列表输出 AST 的 JSON 或缩进树然后写semantic.py遍历 AST输出符号表和类型检查结果最后写codegen.py输出四元式。每一步都写一个main函数支持命令行传文件名。这样你可以单独测试每一步比如只跑词法分析看 token 对不对不用每次都跑完整流程。参数上词法分析要定义好关键字表、运算符表、界符表以及标识符和常数的正则。语法分析要定义好文法产生式并计算 FIRST 和 FOLLOW 集。语义分析要定义符号表结构通常用栈式符号表或哈希表加作用域链。代码生成要定义四元式的格式比如(op, arg1, arg2, result)。这些结构一旦定下来后面改起来成本很高所以最好在实验报告里先写清楚你的设计再动手写代码。2.3 实验报告里必须写清楚的五个部分实验报告不是代码的附属品它要能独立说明你的设计。常见结构是实验目的、实验环境、实验设计文法、数据结构、算法描述、实验步骤关键代码和测试用例、实验结果与分析正确性、边界情况、复杂度。其中实验设计部分要放文法产生式、FIRST/FOLLOW 集、预测分析表或 LR 分析表实验步骤要放核心代码片段和输入输出示例实验结果要放至少三组测试用例包括正常程序、含错误的程序、边界情况空文件、只有注释、超长标识符。如果你用的是 Python可以在报告里贴lexer.py和parser.py的关键函数如果用的是 Java贴类图和核心方法。注意报告里不要只贴代码不解释每段代码后面要写清楚它对应哪个算法步骤、参数怎么设、为什么这么设。3. 用 Python 手写递归下降从源码到可运行的最小闭环3.1 词法分析器的状态机实现与 token 定义先定义一个 token 类包含类型和值。然后写一个Lexer类维护当前位置、行号、列号。核心是一个next_token方法用 while 循环跳过空白和注释然后根据当前字符判断是标识符、数字、字符串还是运算符。标识符用[a-zA-Z_][a-zA-Z0-9_]*数字用[0-9]运算符和界符用字典匹配。关键字在标识符识别后查表转换类型。# lexer.py import re class Token: def __init__(self, type_, value, line, col): self.type type_ self.value value self.line line self.col col class Lexer: def __init__(self, text): self.text text self.pos 0 self.line 1 self.col 1 self.keywords {if, else, while, int, float, return} def next_token(self): while self.pos len(self.text): ch self.text[self.pos] if ch in \t\r: self._advance() elif ch \n: self.line 1 self.col 1 self.pos 1 elif ch / and self.pos 1 len(self.text) and self.text[self.pos1] /: while self.pos len(self.text) and self.text[self.pos] ! \n: self._advance() else: break if self.pos len(self.text): return Token(EOF, , self.line, self.col) ch self.text[self.pos] if ch.isalpha() or ch _: return self._read_identifier() if ch.isdigit(): return self._read_number() return self._read_operator() def _advance(self): self.pos 1 self.col 1 def _read_identifier(self): start self.pos while self.pos len(self.text) and (self.text[self.pos].isalnum() or self.text[self.pos] _): self._advance() value self.text[start:self.pos] type_ KEYWORD if value in self.keywords else ID return Token(type_, value, self.line, self.col - len(value)) def _read_number(self): start self.pos while self.pos len(self.text) and self.text[self.pos].isdigit(): self._advance() return Token(NUM, self.text[start:self.pos], self.line, self.col - (self.pos - start)) def _read_operator(self): for op in [, !, , , , ||]: if self.text.startswith(op, self.pos): self.pos len(op) self.col len(op) return Token(OP, op, self.line, self.col - len(op)) ch self.text[self.pos] self._advance() return Token(OP, ch, self.line, self.col - 1)这段代码的逻辑是先跳过空白、换行和单行注释然后根据首字符判断是标识符、数字还是运算符。标识符识别后查关键字表决定是KEYWORD还是ID。数字只处理整数浮点数可以扩展。运算符优先匹配双字符运算符再匹配单字符。参数上keywords集合可以根据你的文法调整_read_operator里的运算符列表也要和文法保持一致。测试时输入一段简单程序打印所有 token检查类型和值是否正确。3.2 递归下降语法分析表达式、语句与语法树节点递归下降的核心是每个非终结符对应一个函数。比如parse_expr处理加减parse_term处理乘除parse_factor处理括号和数字。语句层面parse_stmt根据当前 token 决定是赋值、if、while 还是 return。语法树节点用类表示比如BinOp、Num、Assign、If。# parser.py from lexer import Lexer, Token class ASTNode: pass class BinOp(ASTNode): def __init__(self, left, op, right): self.left left self.op op self.right right class Num(ASTNode): def __init__(self, value): self.value value class Assign(ASTNode): def __init__(self, name, expr): self.name name self.expr expr class Parser: def __init__(self, lexer): self.lexer lexer self.current self.lexer.next_token() def eat(self, type_): if self.current.type type_: self.current self.lexer.next_token() else: raise SyntaxError(fExpected {type_}, got {self.current.type} at line {self.current.line}) def parse(self): stmts [] while self.current.type ! EOF: stmts.append(self.parse_stmt()) return stmts def parse_stmt(self): if self.current.type ID: name self.current.value self.eat(ID) self.eat(OP) # 假设赋值是 expr self.parse_expr() return Assign(name, expr) elif self.current.type KEYWORD and self.current.value if: self.eat(KEYWORD) self.eat(OP) # ( cond self.parse_expr() self.eat(OP) # ) body self.parse_stmt() return (if, cond, body) else: raise SyntaxError(fUnexpected token {self.current.type} at line {self.current.line}) def parse_expr(self): node self.parse_term() while self.current.type OP and self.current.value in (, -): op self.current.value self.eat(OP) right self.parse_term() node BinOp(node, op, right) return node def parse_term(self): node self.parse_factor() while self.current.type OP and self.current.value in (*, /): op self.current.value self.eat(OP) right self.parse_factor() node BinOp(node, op, right) return node def parse_factor(self): if self.current.type NUM: value self.current.value self.eat(NUM) return Num(value) elif self.current.type OP and self.current.value (: self.eat(OP) node self.parse_expr() self.eat(OP) # ) return node else: raise SyntaxError(fUnexpected token {self.current.type} at line {self.current.line})这段代码的逻辑是parse循环读取语句直到 EOFparse_stmt根据当前 token 判断语句类型parse_expr和parse_term处理二元运算的优先级parse_factor处理数字和括号。参数上运算符优先级由函数调用层次决定parse_expr处理最低优先级parse_term处理较高优先级。测试时输入x 1 2 * 3打印 AST检查乘号是否在加号下面。注意这里假设赋值符号是实际实验里可能是:或其他需要根据文法调整。3.3 语义分析符号表填充与类型检查的最小实现语义分析遍历 AST维护一个符号表。符号表可以用字典加作用域链或者简单的列表。每个变量声明时插入符号表使用时查找。类型检查可以简单到只检查变量是否声明、赋值左右类型是否一致。# semantic.py class SymbolTable: def __init__(self): self.scopes [{}] def enter_scope(self): self.scopes.append({}) def exit_scope(self): self.scopes.pop() def declare(self, name, type_): if name in self.scopes[-1]: raise SemanticError(fVariable {name} already declared) self.scopes[-1][name] type_ def lookup(self, name): for scope in reversed(self.scopes): if name in scope: return scope[name] raise SemanticError(fVariable {name} not declared) class SemanticAnalyzer: def __init__(self): self.symtab SymbolTable() def analyze(self, node): if isinstance(node, Assign): type_ self.analyze(node.expr) self.symtab.declare(node.name, type_) elif isinstance(node, BinOp): left_type self.analyze(node.left) right_type self.analyze(node.right) if left_type ! right_type: raise SemanticError(fType mismatch: {left_type} vs {right_type}) return left_type elif isinstance(node, Num): return int else: raise SemanticError(fUnknown node type {type(node)})这段代码的逻辑是SymbolTable用栈维护作用域declare在当前作用域插入变量lookup从内到外查找。SemanticAnalyzer遍历 AST赋值时先分析表达式类型再声明变量二元运算要求左右类型一致。参数上类型系统可以扩展为int、float、bool等。测试时输入x 1 2应该能声明x为int输入x 1 y应该报y未声明。注意这里没有处理变量重复声明和未使用变量实际实验里可能需要。4. 语法分析选型递归下降、LL(1) 与 LR(1) 的取舍与参数4.1 三种方法的适用场景与实验报告里的对比写法递归下降适合手写代码直观但需要消除左递归和提取左公因子。LL(1) 适合用预测分析表需要计算 FIRST 和 FOLLOW 集适合文法简单的语言。LR(1) 功能最强能处理几乎所有上下文无关文法但分析表构造复杂通常用工具生成。实验报告里可以列一个对比表方法、优点、缺点、适用文法、实现难度。比如方法优点缺点适用文法实现难度递归下降代码直观易调试需要消除左递归LL(1)低LL(1)表驱动结构清晰文法限制多LL(1)中LR(1)功能强适用广表构造复杂LR(1)高选型建议如果实验要求手写优先递归下降如果要求用工具可以用 yacc/bison 生成 LR 分析器。报告里要写清楚你为什么选这种方法以及你的文法是否满足该方法的要求。4.2 FIRST/FOLLOW 集计算与预测分析表构造LL(1) 的核心是 FIRST 和 FOLLOW 集。FIRST(A) 是 A 能推导出的首终结符集合FOLLOW(A) 是 A 后面可能紧跟的终结符集合。计算规则对于产生式 A → αFIRST(α) 加入 FIRST(A)如果 α 能推导出 ε则 FOLLOW(A) 加入 FOLLOW(A)。预测分析表 M[A, a] 填产生式 A → α其中 a 在 FIRST(α) 中或者 a 在 FOLLOW(A) 中且 α 能推导出 ε。# first_follow.py def compute_first(grammar): first {nt: set() for nt in grammar} changed True while changed: changed False for nt, prods in grammar.items(): for prod in prods: if not prod: if not in first[nt]: first[nt].add() changed True else: for sym in prod: if sym in grammar: before len(first[nt]) first[nt].update(first[sym] - {}) if not in first[sym]: break if len(first[nt]) before: changed True else: if sym not in first[nt]: first[nt].add(sym) changed True break return first def compute_follow(grammar, first, start): follow {nt: set() for nt in grammar} follow[start].add($) changed True while changed: changed False for nt, prods in grammar.items(): for prod in prods: for i, sym in enumerate(prod): if sym in grammar: rest prod[i1:] if rest: first_rest set() for s in rest: if s in grammar: first_rest.update(first[s] - {}) if not in first[s]: break else: first_rest.add(s) break before len(follow[sym]) follow[sym].update(first_rest) if len(follow[sym]) before: changed True if all(s in grammar and in first[s] for s in rest): follow[sym].update(follow[nt]) else: follow[sym].update(follow[nt]) return follow这段代码的逻辑是compute_first迭代计算每个非终结符的 FIRST 集直到不再变化compute_follow根据产生式右部计算 FOLLOW 集。参数上grammar是字典键是非终结符值是产生式列表每个产生式是符号列表。测试时用一个简单文法验证比如E → T EE → T E | εT → F TT → * F T | εF → ( E ) | id。注意这里没有处理左递归实际使用前要先消除左递归。4.3 用 PLY 或 JavaCC 快速生成分析器的配置要点如果不想手写可以用 PLYPython Lex-Yacc或 JavaCC。PLY 的用法是定义 token 列表和文法规则然后调用yacc.yacc()生成分析器。配置要点token 列表要和词法分析器一致文法规则用函数定义每个函数对应一个产生式优先级用precedence元组定义。JavaCC 需要写.jj文件定义 token 和产生式然后生成 Java 代码。参数上PLY 的yacc.yacc()可以传debugTrue输出分析过程JavaCC 可以配置LOOKAHEAD参数解决冲突。注意工具生成的分析器虽然快但实验报告里要写清楚你用的是工具以及工具生成的代码和你手写的部分如何衔接。5. 避坑与排查编译原理实验里最容易翻车的五个点5.1 词法分析把关键字识别成标识符现象输入iftoken 类型是ID而不是KEYWORD。原因关键字表没有在标识符识别后查表或者查表时大小写不一致。解决在_read_identifier里读完标识符后立即查keywords集合如果在里面就返回KEYWORD否则返回ID。注意关键字表要和文法里的关键字完全一致不要漏掉else、while等。5.2 语法分析遇到左递归直接栈溢出现象递归下降分析器在解析表达式时无限递归报RecursionError。原因文法里有左递归比如E → E T。解决消除左递归改成E → T EE → T E | ε。然后在代码里对应修改parse_expr和parse_expr_prime。注意消除左递归后语法树的结合性会变需要调整代码保证左结合。5.3 语义分析符号表作用域没退出导致变量泄漏现象在 if 块里声明的变量出了块还能访问。原因enter_scope和exit_scope没有成对调用或者exit_scope没有弹出作用域。解决在遍历块语句时进入块前调用enter_scope离开块后调用exit_scope。注意函数参数也要在当前作用域声明不要漏掉。5.4 代码生成四元式顺序错乱导致结果不对现象生成的中间代码执行结果和预期不符。原因遍历 AST 时先生成了结果四元式后生成了操作数四元式。解决后序遍历 AST先处理子节点再生成当前节点的四元式。注意临时变量编号要全局唯一不要重复使用。5.5 实验报告里测试用例太少被扣分现象报告只贴了一个正常程序没有错误处理和边界情况。原因只关注正确路径忽略了异常路径。解决至少准备三组测试用例正常程序含赋值、运算、if、while、错误程序含语法错误、语义错误、边界情况空文件、只有注释、超长标识符、嵌套括号。每组用例都要贴输入和输出并分析结果。6. 从能跑到能交实验报告的验证方法与一个具体技巧最后一章说一个我反复用的技巧把实验报告当成“可复现的说明书”来写而不是“代码的注释”。具体做法是在报告里放一个“一键复现”章节写清楚运行环境、依赖安装、编译命令、测试命令。比如# 安装依赖 pip install ply # 运行词法分析 python lexer.py test.c # 运行语法分析 python parser.py test.c # 运行完整流程 python main.py test.c然后放一个测试用例表列出输入文件、预期输出、实际输出、是否通过。这样答辩时老师可以直接照着跑不用猜你的代码怎么用。验证方法上除了自己测还可以用“交叉验证”用你的词法分析器输出 token再用工具生成的词法分析器输出 token对比两者是否一致。如果一致说明你的词法分析基本正确如果不一致看是关键字表不同还是正则不同。另一个技巧是“错误注入”故意在测试程序里加一个语法错误看你的分析器能不能报出正确的行号和错误类型。很多实验只要求能分析正确程序但实际编译器必须能处理错误。如果你的分析器遇到错误就崩溃报告里要写清楚你做了什么错误恢复比如跳过当前语句直到分号。我自己的习惯是每写完一个模块先写一个最小的测试用例跑通后再写下一个模块。这样出问题时能快速定位是哪个模块的锅。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

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

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

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

2026/10/12 12:56:07 阅读更多 →
红酒质量预测实战:线性回归三求解器对比与工业部署

红酒质量预测实战:线性回归三求解器对比与工业部署

简介:本资源是一份面向Python机器学习初学者与数据科学实践者的线性回归实战教学包,聚焦红酒质量预测这一经典回归任务,帮助读者掌握从数据清洗、探索性分析到模型训练与评估的完整建模流程。压缩包共6个文件(3个Python脚本、2个C…

2026/10/12 12:55:06 阅读更多 →
Python实现基于商品的协同过滤图书推荐系统:ItemCF从数据到Top-N

Python实现基于商品的协同过滤图书推荐系统:ItemCF从数据到Top-N

简介:一份基于商品的协同过滤算法实现的图书推荐系统完整工程,面向计算机相关专业学生、毕设开发者及推荐算法初学者。项目依托豆瓣图书与评分数据,基于items协同过滤思想设计推荐逻辑,以Django搭建Web框架并配合MySQL存储&#x…

2026/10/12 12:55:06 阅读更多 →

最新新闻

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 阅读更多 →