From 1a4a08af2b71fd27f0cbe2d5b4ea2a600cd32b59 Mon Sep 17 00:00:00 2001 From: array2d-gitter Date: Wed, 9 Sep 2026 20:58:32 +0800 Subject: [PATCH 1/4] =?UTF-8?q?extensions:=20struct=20=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=20kvlang=20=E8=AF=AD=E6=B3=95=E9=AB=98=E4=BA=AE=E5=85=B3?= =?UTF-8?q?=E9=94=AE=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- extensions/kvlang/syntaxes/kvlang.tmLanguage.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/kvlang/syntaxes/kvlang.tmLanguage.json b/extensions/kvlang/syntaxes/kvlang.tmLanguage.json index e0128181..076fb433 100644 --- a/extensions/kvlang/syntaxes/kvlang.tmLanguage.json +++ b/extensions/kvlang/syntaxes/kvlang.tmLanguage.json @@ -46,7 +46,7 @@ }, "keyword": { "name": "keyword.control.kvlang", - "match": "\\b(rwfunc|rwir|lib|if|else|for|while|break|continue|return)\\b" + "match": "\\b(rwfunc|rwir|lib|struct|if|else|for|while|break|continue|return)\\b" }, "block_label": { "name": "entity.name.label.kvlang", From 7334db729e99afd6327061605debc5dff15526bc Mon Sep 17 00:00:00 2001 From: array2d-gitter Date: Wed, 9 Sep 2026 20:59:30 +0800 Subject: [PATCH 2/4] =?UTF-8?q?WIP:=20layout/runtime/tutorial=20=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E4=B8=AD=E6=94=B9=E5=8A=A8=E4=BF=9D=E5=AD=98=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 保存另一 agent 进行中的 struct/langtype/leetcode 链表等改动,防丢失,未 push。 Co-Authored-By: Claude Opus 4.8 --- layout/src/code.rs | 274 +++++++++++++++++- layout/src/kvkind.rs | 39 ++- layout/src/langtype.rs | 11 +- layout/src/lower.rs | 16 +- layout/src/parser.rs | 31 +- runtime-rs/src/rwir/json.rs | 38 ++- runtime/src/builtin_collection.c | 5 +- runtime/src/builtin_kv.c | 4 +- runtime/src/const.h | 1 - runtime/src/langtype.c | 2 +- runtime/src/langtypetable.c | 1 - runtime/src/runtime_internal.h | 2 +- runtime/src/xvalue.c | 2 - tutorial/05-dict/literal.kv | 9 +- tutorial/08-leetcode/002_add_two_numbers.kv | 31 +- tutorial/08-leetcode/021_merge_two_lists.kv | 31 +- tutorial/08-leetcode/056_merge_intervals.kv | 1 - tutorial/08-leetcode/083_remove_dup_list.kv | 44 ++- tutorial/08-leetcode/094_inorder_traversal.kv | 19 +- tutorial/08-leetcode/100_same_tree.kv | 34 ++- tutorial/08-leetcode/104_max_tree_depth.kv | 25 +- tutorial/08-leetcode/141_linked_list_cycle.kv | 34 ++- tutorial/08-leetcode/160_intersection_list.kv | 46 ++- .../08-leetcode/203_remove_linked_elements.kv | 32 +- .../08-leetcode/206_reverse_linked_list.kv | 24 +- tutorial/08-leetcode/234_palindrome_list.kv | 38 ++- 26 files changed, 619 insertions(+), 175 deletions(-) diff --git a/layout/src/code.rs b/layout/src/code.rs index 91796038..d3f91da0 100644 --- a/layout/src/code.rs +++ b/layout/src/code.rs @@ -1,17 +1,19 @@ //! layoutcode(对齐 layout/layout.go):检查 AST 并把结果布局写到 /lib/ 下的结构化 KV。 //! //! 存储约定: -//! /lib/·/[0,0] 布局后签名(kind=rwfunc) -//! /lib/·/ 命名参数→slot 指针(langtype=char, ref=1) +//! /lib/·/[0,0] 布局后签名锚点(kind=rwfunc,body=计数头 [nr,nw,dyn]) +//! /lib/·/ 命名参数→slot 指针(langtype=该参类型, ref=1, body=坐标) //! /lib/·/[i,j] 编译后指令(kind=rwir),i 从 1 开始 //! /lib/·/‥labels/ label → irseq -//! /lib/·.src 源码副本 +//! /lib/·.src 源码副本(仅 write_func 保留写入,dump 不再依赖) //! //! WriteBody: DFS-number insts (incl. ScopeStmt), emit [i,j], rewrite goto/br labels to irseq. +//! dump: 反向——严格读 /lib/ 子树重建 AST(签名读命名参数 Ptr、体读线性槽+‥labels), +//! 不读 .src、不依赖签名行 [0,x] 静态槽。 use std::collections::HashMap; -use super::ast::{Expr, Func, Instruction, RwirDecl, Stmt, StructDecl}; +use super::ast::{self, Expr, Func, FuncSig, Instruction, Param, RwirDecl, ScopeStmt, Stmt, StructDecl}; use super::ffi::Kv; use super::{builtin, ffi, keytree, kvkind, lower, parser}; @@ -173,15 +175,16 @@ pub fn dump(kv: &mut Kv, lib: &str) -> String { // prefix 本身就是函数目录:直接重建该函数(pkg/name 从路径反推)。 let base = prefix.trim_start_matches("/lib/"); let (fpkg, name) = func_identity("", base); - let src = kvkind::value_string(&kv.get_one(&format!("{prefix}.src"))); + let dir = format!("{prefix}/"); + let text = reconstruct(kv, &dir, &name); let mut slots = Vec::new(); - collect_slots(kv, &format!("{prefix}/"), &mut slots); + collect_slots(kv, &dir, &mut slots); funcs.push(DumpFunc { pkg: fpkg, name, - src, + text, slots, - dir: format!("{prefix}/"), + dir, }); } else { // 虚拟 pkg:func dir 以 prefix 为前缀(`/lib/foo` 匹配 `/lib/foo·*` 与 `/lib/foo/*`)。 @@ -210,11 +213,11 @@ pub fn dump(kv: &mut Kv, lib: &str) -> String { out } -/// 一个可运行函数:源码(.src)+ 原始槽位注释。 +/// 一个可运行函数:从 /lib 子树重建的源码 + 原始槽位注释。 struct DumpFunc { pkg: String, name: String, - src: String, + text: String, slots: Vec, dir: String, } @@ -262,13 +265,13 @@ fn collect_funcs( let mem_sub = format!("{prefix}{base}·"); if is_func_dir(kv, &dir_sub) { let (fpkg, name) = func_identity(pkg, &base); - let src = kvkind::value_string(&kv.get_one(&format!("{prefix}{base}.src"))); + let text = reconstruct(kv, &dir_sub, &name); let mut slots = Vec::new(); collect_slots(kv, &dir_sub, &mut slots); funcs.push(DumpFunc { pkg: fpkg, name, - src, + text, slots, dir: dir_sub, }); @@ -342,7 +345,7 @@ fn emit_node(out: &mut String, node: &DumpNode, indent: &str) { } fn emit_func(out: &mut String, f: &DumpFunc, indent: &str) { - for line in f.src.lines() { + for line in f.text.lines() { out.push_str(indent); out.push_str(line); out.push('\n'); @@ -360,6 +363,251 @@ fn emit_func(out: &mut String, f: &DumpFunc, indent: &str) { out.push('\n'); } +// ── dump 重建:严格从 /lib 子树反出可运行 kvlang(不读 .src)───────────── +// +// 数据来源(对齐 write_func / spec「指令布局格式」): +// 签名 ← [0,0] 计数头(nr,nw,dyn) + 命名参数 Ptr 键(langtype=类型、body=[0,±k] 定位读/写与序) +// 函数体 ← 线性指令槽 [n,0]=opcode、[n,-j]=读参、[n,j]=写参(n 连续、scope 已拍平) +// 控制流 ← ‥labels/