diff --git a/Doc/compiler/阶段3-语言层V2.md b/Doc/compiler/阶段3-语言层V2.md new file mode 100644 index 0000000..0a0d6c1 --- /dev/null +++ b/Doc/compiler/阶段3-语言层V2.md @@ -0,0 +1,43 @@ +# 阶段 3:编译器语言层 V2(计划与待定项) + +> 状态:**计划中**。阶段 3 = 编译器语言侧 V2 化(Lexer/Parser/Typecheck/Linker/codegen_test)。 +> 生成侧(MachineConfig/Codec/Stb/Codegen)已在阶段 2 完成。本文记录待定决策点, +> **逐个解决**,解决后更新状态并落到代码/规格文档。 + +## 1. 目标 + +| 子模块 | V1 现状 | V2 目标 | +|---|---|---| +| Lexer | 25 关键字 + 8 FB 名 Tok;INT/TIME 字面量 | 19 类型关键字、15 FB 名、浮点字面量、进制前缀 | +| Parser | TypeKind{Bool,Int,Time,FbBuiltin,FbUser} | 类型引用覆盖 19 类型;LitReal | +| Typecheck | TType 3 种硬编码 | 禁隐式转换、BOOL 0/1 强制、字面量适配、FB 校验查 toml | +| Linker | FbField.type 用 TypeKind | 字段类型字符串化(与类型系统一致) | +| codegen_test | V1,剥离中 | V2 重写(去 isa 依赖) | + +## 2. 待定决策点(逐个解决) + +| # | 问题 | 草案/结论 | 状态 | +|---|---|---|---| +| L1 | 内建 FB 类型名校验来源 | 查 machine.toml `[[fb]]` 表(15 条,替换 V1 硬编码 8 Tok);**用户 FB 类型来自用户源码**(FUNCTION_BLOCK 声明,不查 toml) | ✅ 已澄清 | +| L2 | 禁隐式转换范围 | 赋值/算术/比较类型严格一致 → type error;字面量例外(无类型字面量按上下文适配) | ⏳ | +| L3 | 字面量适配规则 | 整数字面量 → 任意目标(值域内);浮点字面量 → REAL/LREAL;进制字面量 + 值域检查 | ⏳ | +| L4 | 浮点字面量 AST | 新增 ExprKind::LitReal(double 值) | ⏳ | +| L5 | codegen_test 断言范围 | Codec disasm 文本 / 槽表值段布局 / 常量表 8B / max_stack / 头字段 | ⏳ | +| L6 | FB 类型名表示 | IDENT + 三层判定(toml fb 表 → 用户 FB 符号表 → toml type 表 → 报错),废除 8 个 FB Tok | ⏳ | +| L7 | TypeKind 表示 | 统一存类型名字符串(小写,查 machine.toml)+ kind 简化(Scalar/FbBuiltin/FbUser) | ⏳ | +| L8 | Linker FbField.type | 字符串类型名(与 L7 一致),替换 TypeKind 枚举 | ⏳ | + +## 3. 执行步骤(决策点解决后按序) + +1. **Lexer V2**:19 类型关键字 + 15 FB 名(IDENT 化)+ FLOAT_LIT + 进制前缀(2#/8#/16# → 十进制换算) +2. **Parser V2**:TypeRef 字符串化 + LitReal + 类型解析(L6/L7 落地) +3. **Typecheck V2**:禁隐式转换 / BOOL 0/1 强制 / 字面量上下文适配 / FB 校验三层判定(L1/L2/L3) +4. **Linker 适配**:FbField.type 字符串化(L8) +5. **Codegen 适配**:浮点字面量(LOADK func 8/9 位模式)、REAL 变量/运算路径 +6. **codegen_test V2 重写**(L5) +7. **验证**:13 正例 + 新类型语法用例编译;ctest(codegen_slice1 恢复) + +## 4. 验证标准 + +- 13 个正例 + 新语法用例(DINT/REAL 声明、进制/浮点字面量)编译通过 +- codegen_slice1 恢复绿;ctest 12/13(vm_cycles/cases_all 待阶段 4) diff --git a/Doc/索引.md b/Doc/索引.md index 035a5bc..4616801 100644 --- a/Doc/索引.md +++ b/Doc/索引.md @@ -21,6 +21,7 @@ doc/ compiler/类型检查.md compiler/寄存器码.md compiler/编译器优化.md + compiler/阶段3-语言层V2.md vm/扫描周期.md vm/指令执行.md executor/执行器入口.md @@ -44,6 +45,7 @@ doc/ | [`compiler/类型检查.md`](compiler/类型检查.md) | 12.7 类型检查:表达式类型、语句规则、错误类别 | | [`compiler/寄存器码.md`](compiler/寄存器码.md) | 12.8 寄存器码:布局、指令模式、内联 FB、8 片计划 | | [`compiler/编译器优化.md`](compiler/编译器优化.md) | **V2 草案**:编译策略现状(FB 内联/短路/寄存器分配)+ V2 方向(FB 共享体/类型驱动/变长发射) | +| [`compiler/阶段3-语言层V2.md`](compiler/阶段3-语言层V2.md) | **阶段 3 计划**:语言层 V2(Lexer/Parser/Typecheck/Linker)+ 待定决策点 L1..L8 | | [`vm/扫描周期.md`](vm/扫描周期.md) | 扫描周期与 VM 边界 | | [`vm/指令执行.md`](vm/指令执行.md) | 12.9 指令执行流程:帧/调用栈、指令表、定时器、故障 | | [`executor/执行器入口.md`](executor/执行器入口.md) | 可执行入口:加载 `.stb` + sidecar,跑扫描周期 |