编译阶段
BON 解析器按以下七个阶段处理源文件:
阶段 0:参数注入
接收 CLI 或 API 传入的 $ 变量字典。
python
load("config.bon", params={"env": "prod", "debug": True})
阶段 1:词法/语法分析
- 识别并跳过注释
- 构建包含
$、if、for节点的抽象语法树(AST) - 收集所有顶层模板定义、类定义和变量定义
阶段 2:导入解析
- 递归加载所有
import文件 - 合并命名空间,检测循环依赖
阶段 3:符号解析
- 检查所有
$变量是否均已传入 - 若缺失,报错中止(
E009)
阶段 4:控制流展开
- 优先处理条件(
if):根据 truthiness 判定剪除不满足条件的分支 - 其次处理循环(
for):将循环体深拷贝展开为平铺的数据节点 - 如果循环体内包含
if,在展开过程中递归处理 - 迭代次数超过 10000 时报错中止(
E010)
阶段 5:模板展开
- 遇到
{template}或裸模板标识符时,执行深拷贝替换 - 模板内部若包含引用,递归展开(最大递归深度 100)
阶段 6:实例化与常量折叠
- 遇到
ClassName { ... }时,合并属性,绑定继承链 - 计算属性按依赖顺序求值
.method()调用立即执行,结果替换为字面量std.*函数计算结果直接替换原 AST 节点$var参数替换为传递的值
最终产物
完全展开、所有逻辑均已消除的纯 JSON 数据结构。
BON 源码
→ [参数注入]
→ [词法/语法分析]
→ [导入解析]
→ [符号解析]
→ [控制流展开] ← if/for 在此阶段处理
→ [模板展开]
→ [实例化与常量折叠]
→ 纯 JSON
IMPORTANT
BON 是编译期语言,所有逻辑在解析时完成。宿主程序拿到的永远是纯 JSON,不需要运行时依赖。
无论 BON 源码多么复杂,输出的 JSON 中将没有任何残留的 $、if 或 for 痕迹。
