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

45 lines
3.2 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;**字面量也禁止上下文适配**,字面量自带类型前缀/后缀(见 L9) | ✅ |
| L9 | 字面量类型化语法 | **新增(用户提出)**:字面量带类型前缀/后缀(IEC 风格 `类型名#值`?)——裸字面量处理、前缀/后缀形式待定 | ⏳ |
| L3 | 字面量适配规则 | 整数字面量 → 任意目标(值域内);浮点字面量 → REAL/LREAL;进制字面量 + 值域检查 | ⏳ |
| L4 | 浮点字面量 AST | 新增 ExprKind::LitRealdouble 值) | ⏳ |
| 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 正例 + 新类型语法用例编译;ctestcodegen_slice1 恢复)
## 4. 验证标准
- 13 个正例 + 新语法用例(DINT/REAL 声明、进制/浮点字面量)编译通过
- codegen_slice1 恢复绿;ctest 12/13vm_cycles/cases_all 待阶段 4