stage1 人工重构ast.c
This commit is contained in:
75
SPL.md
75
SPL.md
@@ -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 #1;f64 类型已完整支持
|
||||
- **@ / # 指令块**: `@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 - 总是内联 简单的包装函数
|
||||
|
||||
Reference in New Issue
Block a user