Files
Interpreter/Doc/compiler/阶段3-语言层V2.md
T

46 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 阶段 3:编译器语言层 V2(计划与待定项)
> 状态:**计划中**。阶段 3 = 编译器语言侧 V2 化(Lexer/Parser/Typecheck/Linker/codegen_test)。
> 生成侧(MachineConfig/Codec/Stb/Codegen)已在阶段 2 完成。本文记录待定决策点,
> **逐个解决**,解决后更新状态并落到代码/规格文档。
## 1. 目标
| 子模块 | V1 现状 | V2 目标 |
|---|---|---|
| Lexer | 25 关键字 + 8 FB 名 TokINT/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 dumpcodegen_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/TimeParser/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 正例 + 新类型语法用例编译;ctestcodegen_slice1 恢复)
## 4. 验证标准
- 13 个正例 + 新语法用例(DINT/REAL 声明、进制/浮点字面量)编译通过
- codegen_slice1 恢复绿;ctest 12/13vm_cycles/cases_all 待阶段 4