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

3.5 KiB
Raw Blame History

阶段 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::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 V2TypeRef 字符串化 + 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