46 lines
4.9 KiB
Markdown
46 lines
4.9 KiB
Markdown
# 阶段 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);**整数字面量 / 浮点字面量按上下文适配**,上下文冲突直接报错(例:a 是 UINT,`a := -1` → 越域报错);**TIME/DATE 等字面量有格式要求**(见 L9) | ✅ |
|
||
| ~~L9~~ | ~~字面量类型化语法~~ | **已定案**:不强制类型前缀——整数字面量(含进制 `16#FF`)/ 浮点字面量(`1.5`)**无类型、按上下文适配 + 值域检查**(冲突即报错,不转换);TIME 字面量沿用 V1 格式(`5s`,单位后缀)并可类型化;DATE/TOD/DT 字面量 v1 不支持(A4) | ✅ |
|
||
| ~~L3~~ | ~~字面量适配规则~~ | **已定案(随 L2/L9)**:整数/浮点按上下文适配 + 值域检查(冲突报错);进制字面量同规则;无默认类型兜底 | ✅ |
|
||
| ~~L4~~ | ~~浮点/日期字面量 AST~~ | **已定案**:ExprKind 新增 **LitReal**(double_value)/ **LitDate**(天数)/ **LitTod**(当日 ms)/ **LitDt**(date<<32\|tod);Expr 加 double_value 字段;词法 FLOAT_LIT/DATE_LIT/TOD_LIT/DT_LIT | ✅ |
|
||
| ~~L5~~ | ~~--disasm 输出与断言范围~~ | **已定案(用户)**:`--disasm` 输出**头 22 字段一行一个 + 中文注释**(magic/version/model/cycle_limit/dt_ms/hash/entry_fn_id/n_globals/n_i/n_q/n_m/n_consts/n_funcs/五个 offset/n_slots/values_size/offset_meta/max_stack/sha)+ 常量表 + 函数表逐指令反汇编 + **slots 节**(槽表逐条 addr)+ 值段 hex dump;codegen_test 按此断言 | ✅ |
|
||
| ~~L6~~ | ~~FB 类型名表示~~ | **已定案**:废除 8 个 FB 关键字 Tok;FB 名一律 IDENT;类型解析统一判定:① toml `[[fb]]` 表(内建,布局查 toml)→ ② 用户 FB 符号表(源码 FUNCTION_BLOCK)→ ③ toml `[[type]]` 表(标量)→ ④ 未命中报错 | ✅ |
|
||
| ~~L7~~ | ~~TypeKind 表示~~ | **已定案**:TypeKind 收为 {Scalar, FbBuiltin, FbUser};TypeRef.name 统一小写类型名(标量 = type 表键 / FB = fb 表名或用户声明名);删 TypeKind::Bool/Int/Time(Parser/Typecheck/Linker/Codegen 连锁适配) | ✅ |
|
||
| ~~L8~~ | ~~Linker 字段类型字符串化~~ | **已定案**:FbField.type → **FbField.type_name**(小写字符串);`link_project` 加 `const MachineConfig& cfg` 参数(main 传参);删除 8 个硬编码布局;`builtin_layout(name)` 查 cfg `[[fb]]` 表构建 FbLayout(带缓存) | ✅ |
|
||
| ~~L10~~ | ~~日期字面量(A4 修订)~~ | **已定案(用户)**:V2 支持 `D#2026-8-24`/`TOD#12:30:00`/`DT#2026-8-24-12:30:00`(IEC 格式,强类型字面量);纪元 1970-01-01=0 天(与 RTC 一致);TOD 不支持小数秒;年范围 1..9999;换算:历法→天数(闰年)、TOD=时×3600000+分×60000+秒×1000 | ✅ |
|
||
|
||
## 3. 执行步骤(决策点解决后按序)
|
||
|
||
1. **Lexer V2**:19 类型关键字 + 15 FB 名(IDENT 化)+ FLOAT_LIT + 进制前缀(2#/8#/16# → 十进制换算)+ 日期字面量(D#/TOD#/DT#,最长匹配,历法换算与值域检查)
|
||
2. **Parser V2**:TypeRef 字符串化 + LitReal/LitDate/LitTod/LitDt + 类型解析(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)
|