stage1 人工重构ast.c

This commit is contained in:
zzy
2026-08-12 10:29:38 +08:00
parent 314100afbc
commit b0e6b406ac
22 changed files with 1619 additions and 2895 deletions

75
SPL.md
View File

@@ -1,13 +1,13 @@
# SPL Self-bootstrapping/System Programming Language
# SPL - Self-bootstrapping/System Programming Language
## 项目概述
SPL是一个从零构建的自举编译器项目。引导链:
```
stage0/spl_vm.c SIR 虚拟机 (C 语言实现)
stage1/splc0.c SPL->SIR 编译器 (C 语言实现,引导用)
stage1/splc1.spl SPL->SIR 编译器 (SPL 语言实现,自举第一版)
stage0/spl_vm.c - SIR 虚拟机 (C 语言实现)
stage1/splc0.c - SPL->SIR 编译器 (C 语言实现,引导用)
stage1/splc1.spl - SPL->SIR 编译器 (SPL 语言实现,自举第一版)
...将来...
```
@@ -56,7 +56,7 @@ DirectiveBlock
<- DirectiveHead Block (* @init { } / #test { } *)
# ================================================================
# comptime 编译期执行 / 断言 (仅容器层)
# comptime - 编译期执行 / 断言 (仅容器层)
# ================================================================
ComptimeStmt
@@ -88,6 +88,7 @@ TypeDecl
MemberDecl
<- IDENTIFIER (COLON TypeExpr)? (COMMA / SEMICOLON)?
(* 聚合成员分隔: `,` 与 `;` 均可。当前 `;` 路径不稳定,测试以 `,` 为准,`;` 仅作兼容验证。 *)
# ================================================================
# 类型表达式 (Type Expression, LL(1), 无左递归)
@@ -98,6 +99,7 @@ TypeExpr <- PrefixTypeOp* AttrList? TypeBase
TypeBase
<- FnTypeExpr
/ TypePath
/ KEYWORD_shape LBRACE ContainerDeclaration* RBRACE (* TODO *)
/ KEYWORD_struct LBRACE ContainerDeclaration* RBRACE
/ KEYWORD_union LBRACE ContainerDeclaration* RBRACE
/ KEYWORD_enum LBRACE ContainerDeclaration* RBRACE
@@ -141,7 +143,7 @@ ConstDecl
# ================================================================
# 块 / 语句层 (Block & Statement 仅函数体内)
# 块 / 语句层 (Block & Statement - 仅函数体内)
# ================================================================
Block <- LBRACE BlockItem* Expr? RBRACE
@@ -159,6 +161,9 @@ Statement (* LL(1): 14 分支互
/ BreakStatement
/ ContinueStatement
/ DeferStatement
/ TryStatement (* TODO *)
/ CatchStatement (* TODO *)
/ ErrDeferStatement (* TODO *)
/ VarDecl
/ ConstDecl
/ TypeDecl
@@ -234,8 +239,7 @@ ShiftExpr <- AddExpr ((L_ARROW2 / R_ARROW2) AddExpr)*
AddExpr <- MulExpr ((PLUS / MINUS) MulExpr)*
MulExpr <- PrefixExpr ((ASTERISK / SLASH / PERCENT) PrefixExpr)*
PrefixExpr <- PrefixOp* PostfixExpr
PrefixOp <- MINUS / BANG / TILDE / AMPERSAND / ASTERISK
PrefixOp <- MINUS / BANG / TILDE / AMPERSAND
# ---- 后缀 ----
@@ -389,19 +393,29 @@ FLOAT <- [0-9]+ '.' [0-9]+
CHAR_LITERAL <- "'" (CHAR_PLAIN / CHAR_ESCAPE) "'"
CHAR_PLAIN <- [^\\'\n]
CHAR_ESCAPE <- '\\' [ntr\\'"0]
/ '\\x' [0-9a-fA-F] [0-9a-fA-F]
STRING_LITERAL <- '"' (STRING_CHUNK)* '"'
STRING_CHUNK <- [^\\"\n]+ / '\\' [ntr\\'"0]
/ '\\x' [0-9a-fA-F] [0-9a-fA-F]
LINE_COMMENT <- '//' [^\n]*
BLOCK_COMMENT <- '/*' (!'*/' .)* '*/'
BLOCK_COMMENT <- '/*' (BLOCK_COMMENT / !'*/' .)* '*/' (* 支持嵌套 *)
eof <- !.
```
## 当前阶段暂不支持stage1 引导实现限制)
以下语法/特性在当前引导阶段**暂不实现**,使用时报编译错误("not implemented")。
实现推进时按序补齐,并同步更新本清单与测试。
- **comptime 语句**: `comptime { }` / `comptime expr;`spl_ast.c 报 "not implemented: comptime statement"
- **f32 类型**: `var x: f32` 变量声明暂不可用(缺 float 转换指令f64 字面量->f32 需截断),见 BUGS.md #1f64 类型已完整支持
- **@ / # 指令块**: `@init { }` / `#test { }`spl_ast.c 报 "not implemented: @/# directive block"
- **嵌套类型路径构造**: 类型体内嵌套类型可定义,但 `Shape.Inner { ... }` 的路径构造未实现
## TODO
```spl
// 约束关键字,语义是`类型子集形状`
type name = shape { ... }
// 默认字段
@@ -443,7 +457,20 @@ DirectiveBlock @id { } / #id { } 为扩展占位,无预定义行为。未识
@name(args) / #name(args): 内置调用,出现在表达式位置。
语义: 完全由语言版本或库注册决定。当前所有均视为未识别,产生警告 (宽松) 或错误 (严格)
语义: 由编译器的内置函数注册决定stage1/spl_builtin.h/c。未注册名称在宽松模式下警告、严格模式下错误
### 内置函数注册表
| 内置 | 参数 | 返回 | 状态 |
|---|---|---|---|
| @sizeof(T) | 类型表达式 | usize | 已实现 |
| @bitsizeof(T) | 类型表达式 | usize | 已实现 |
| @alignof(T) | 类型表达式 | usize | 已实现 |
| @offsetof(T, field) | 类型表达式 + 字段标识符 | usize | 已实现 |
| @field_count(T) | 类型表达式 | usize | 已实现 |
| @dbg(args...) | 表达式列表 | void | 已实现(发射断点) |
| @assert(cond) | bool 表达式 | void | 已实现(失败 trap |
| @import(path) | 字符串字面量 | 模块 | 预留,未实现 |
## 函数
@@ -459,7 +486,7 @@ AttrList? fn IDENTIFIER ( ParamDeclList ) TypeExpr? ( ; | Block )
## 类型声明与聚合体
### 别名
type T = TypeExpr 完全同义。
type T = TypeExpr - 完全同义。
### struct
字段必须 name: Type不可省略。名称唯一。
@@ -798,13 +825,13 @@ T (任意) T 是 无 相同类型
*_ *T 是 警告: “不安全的指针重解释”
[N]T []T 是 无 数组到切片强制转换
整数字面量 整数类型 U 是 (若值在 U 范围内) 无 字面量自动拓宽 (含字符 'c' 视为 u8)
i32 i64 否 需显式 as i64防止意外
i64 i32 否 窄化必须显式
i32 i64 否 - 需显式 as i64防止意外
i64 i32 否 - 窄化必须显式
null *T / []T 是 无 空指针/空切片初始化、比较、赋值、聚合字段
浮点字面量 f32 是 (值可表示则) 无
f64 f32 否 窄化需显式
bool 整数 否
整数 bool 否
f64 f32 否 - 窄化需显式
bool 整数 否 -
整数 bool 否 -
注:
@@ -1179,11 +1206,11 @@ CONSTANT ← INTEGER | FLOAT | STRING | 'true' | 'false' | 'null' | 'undefine
标记附加在函数定义前,用逗号分隔。所有标记均不影响 IR 控制流语义,仅向后端传递元数据。
标记 参数 含义 使用场景
!link("export") 符号对外可见 库的公开 API
!link("import") 符号来自外部模块 调用外部库
!link("weak") 弱符号 可被覆盖的默认实现
!link("export") - 符号对外可见 库的公开 API
!link("import") - 符号来自外部模块 调用外部库
!link("weak") - 弱符号 可被覆盖的默认实现
!abi("C") 调用约定名称 指定跨函数调用的 ABI 与 C 代码交互
!symbol("name") 字符串 自定义导出符号名 避免名称混淆
!naked 无函数序言/尾声 中断向量、系统调用包装
!noinline 禁止内联 调试或特殊性能需求
!alwaysinline 总是内联 简单的包装函数
!naked - 无函数序言/尾声 中断向量、系统调用包装
!noinline - 禁止内联 调试或特殊性能需求
!alwaysinline - 总是内联 简单的包装函数