Genex架构全景一条规则从文本到字节码的完整旅程【免费下载链接】genex-cj生成表达式Generate Expression简称Genex或GE是一款用于按照指定语法规则随机或固定生成数据的功能库。主要适用于依赖规则数据的应用场景例如应用测试、模板数据生成等。Genex基于伪随机的生成器确保在规则和随机种子相同的前提下生成一致的随机结果。项目地址: https://gitcode.com/Cangjie-SIG/genex-cjGenex生成表达式Generate Expression是一款按照指定语法规则随机或固定生成数据的功能库广泛应用于应用测试与模板数据生成场景。它的核心设计是编译与运行分离GenexC编译器把规则文本如[a-z]{3}编译为字节码GenexR运行时基于伪随机种子执行字节码并输出数据。本文将带你走完全程——从词法分析、语法分析、AST 构建、字节码生成到虚拟机逐条执行看懂一条规则文本变成最终输出的完整旅程 。一、架构总览GenexC 与 GenexR 两大模块Genex 采用嵌入语言 前后端分离的经典编译器架构可以把它理解为一个数据生成垂直领域内的微型脚本语言。整体分为两大块模块职责源码位置GenexC规则编译器词法 → 语法 → 语义 → 字节码src/compiler/GenexR规则运行时加载字节码执行虚拟指令集src/runtime/两者的交接点非常干净——只需一段字节码字符串或内存指令集。这意味着你可以提前离线编译规则应用端只引入轻量的GenexR既减小打包体积也提升了规则的安全性 。编译器内部又细分为 5 个阶段恰好构成一条流水线lex/词法分析把字符流切分为 Tokenparser/语法分析基于优先级构建表达式树ast/抽象语法树节点定义与遍历semantics/语义处理对节点做语义校验generate/字节码生成把 AST 翻译为虚拟机指令二、旅程第一站词法分析Lexical Analysis一切始于 src/compiler/lex/lex.cj。Lexer逐字符扫描规则文本将其切分为 25 种TokenType词法单元例如GE_DOT.随机一个字符、GE_MUL*数量控制GE_MBL/GE_MBR[...]范围区间GE_IDd/GE_IDw\d、\w等范围转义符GE_NUM数值、GE_STR字符串每个 Token 都携带类型、内容和位置三元信息位置信息是后续错误诊断第几个字符出错了的基础。值得一提的是TokenType通过e2Num/num2e方法支持枚举 ⇄ 数值互转lex.cj这正是字节码跨平台一致性的第一块基石词法类型被编码为固定数值。三、旅程第二站语法分析与 AST 构建Token 流交给 src/compiler/parser/parser.cj 处理。Parser 采用了简洁而经典的递归下降 优先级解析方案通过三张函数映射表注册了解析能力前缀表达式parser.cj#L69-L84字符串、数值、.、(、[、的开头解析中缀表达式|或、-范围连接后缀表达式parser.cj#L92-L99、*、?、{n,m}等数量限定符核心解析循环在parserExpressionparser.cj#L156-L187中先取前缀表达式再不断预读下一个 Token只要其优先级高于当前上下文就继续包裹中缀/后缀表达式——这就是[a-z]{3}能正确理解{3}修饰[a-z]而非整个表达式的原理。解析产物是一棵 AST。每种语法结构对应一个节点类存放于 src/compiler/ast/节点文件对应语法str.cj固定字符串num.cj数值范围n,mrule_text.cj.、转义符等随机文本mlr.cj / blr.cj / alr.cj[...]、(...)、...三种区间limit.cj、*、?数量限定llr.cj{n,m}重复区间or.cj|或运算四、旅程第三站字节码生成Code GenerationAST 就绪后src/compiler/genex_c.cj 中只需一句astRoot.execute(astp)就完成整个语义 生成过程semantics/阶段如 sem_limit.cj对每个节点做语义校验错误写入错误管理器generate/阶段如 gen_limit.cj、gen_str.cj把节点翻译为虚拟机指令追加到CmdManager指令集中。GenexC提供两种字节码形态这是架构上很精妙的一个设计 ⚡内存指令集getByteCode()返回CmdManager零转换、效率高字符串编码getStrCode()genex_c.cj#L72-L74把指令集编码为字符串便于跨进程传输、存储甚至可叠加自定义加密。五、旅程终点虚拟机逐条执行字节码GenexR 接收字节码后generate()方法genex_r.cj#L71-L80会重置运行状态进入主执行循环 exeRun每轮取一条指令分发给对应的处理函数直到指令耗尽。整个运行时只需11 条指令就能表达所有生成逻辑指令集定义在 src/global/vm_cmd.cj指令含义CMD_PUSH_STR字符串入栈Base64 编码CMD_PUSH_RANGE/CMD_PUSH_NRANGE字符范围 / 数值范围入栈CMD_GENERATE/CMD_GN_S按范围生成一次文本 / 按数量限定生成CMD_JUMP/CMD_JP_R/CMD_JP_GN定步跳转 / 随机跳转 / 计数型跳转CMD_CALL调用开发者注册的扩展函数CMD_STK_MERGE_S/CMD_STK_MERGE_E栈合并起止标志可以看到、*、{n,m}这类数量控制最终都落在CMD_GN_S与跳转指令的组合上而|或则通过CMD_JP_R随机跳转实现二选一。伪随机性由 rcg_random.cj 提供的随机源驱动——只要规则与种子一致任何平台Windows、Linux、HarmonyOS、Android、iOS…都会输出完全相同的结果这对应用测试中的问题复现至关重要 ✅。扩展能力同样内建通过GenexR.registerFun()genex_r.cj#L105-L117注册自定义函数后规则中即可用函数名,参数调用它实现姓名、手机号、时间等复杂数据生成。六、总结这条旅程为什么值得学习回顾全文Genex 的架构可以浓缩为一句话词法切分 → 优先级解析 → AST 执行 → 指令翻译 → 11 指令虚拟机。对新手而言它是学习编译器如何工作的绝佳小型样本每个阶段职责单一、文件一一对应lex/parser/ast/generate 目录即阶段名对普通用户而言前后端分离 种子复现 函数注册三个特性让它能直接落地到测试数据生成、模板渲染等真实场景。 想深入细节推荐按以下路径阅读设计文档doc/design.mdGenexC/GenexR 完整 API 说明功能与 API 文档doc/feature_api.md、doc/api/GenexC.md、doc/api/GenexR.md编译器入口src/compiler/genex_c.cj运行时入口src/runtime/genex_r.cj指令执行核心src/runtime/execute/execute.cj【免费下载链接】genex-cj生成表达式Generate Expression简称Genex或GE是一款用于按照指定语法规则随机或固定生成数据的功能库。主要适用于依赖规则数据的应用场景例如应用测试、模板数据生成等。Genex基于伪随机的生成器确保在规则和随机种子相同的前提下生成一致的随机结果。项目地址: https://gitcode.com/Cangjie-SIG/genex-cj创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考