Commit Graph
39 Commits
Author SHA1 Message Date
TermiNexus c0d56b127d chore(comments): includes 头注释英文化(R11 收尾)
把 includes 下 64 个 .vp 的文件头注释(含 traceback.vp 第 13-427 行的整块文件级说明)以及 2 处漏网的正文中文注释(ast/lexer.vp、json/__writer.vp)与 1 处中文 docstring(memhub.vp)逐行译为英文;同步把 fltk/gen_ffi.py 的生成模板与其自身注释英文化,使重新生成仍为英文。

只改注释/文档串文字:行数与代码逐字节不变(骨架比对 140 文件漂移 0),运行时中文字符串字面量 305 处保持原样。验证:三重重编 SUCCESS(170.21s)+ 全量 77/77 顺序回归通过 + VET 编译 SUCCESS / --search-paths 7 条 exit 0。
2026-10-06 09:42:25 +08:00
TermiNexus af59a752cd chore(syntax): R16 完整 C 式 const/volatile 迁移
把剩余 t.CConst | X 全部改写为前缀描述符 const X(AST 逐字段同形):

- t.CConst | VOIDPTR -> const VOIDPTR(win32console/win32file/win32memory 共 7 处);

- char | t.CConst* -> const str(winsock2 x2);t.CConst | BYTEPTR -> const BYTEPTR(zinflate);

- typedef 右值:LPCSTR = const str、LPCWSTR = const uint16*(stdint/win32base);

- parser.vp:typedef 右值按类型位解析(_IsCTypedefAnnotation),typedef X = T 语法糖同一条。
2026-10-05 20:36:35 +08:00
TermiNexus 0055ab7ea7 refactor: rawptr[T] -> T* 与 t.CConst 前缀迁移(R14/R16)
R14:rawptr[X] -> X*(41 文件 / 2037 行改动),X 含模块限定名与嵌套下标(rawptr[GSList[NameEntry]] -> GSList[NameEntry]*)。保留 6 处 rawptr[t.CPtr](规范例外:存纯裸指针);# 注释与字符串里的 rawptr[...] 属元语法描述,未动。 R16(保守子集):t.CConst | str/bytes -> const str/bytes,t.CConst | char | t.CPtr -> const str;typedef 右值位置豁免(const str 在该处无法注册,与 R1 同源)。 验证:TPC 自举三重重编 SUCCESS;TransPyV.exe 全量 77/77 顺序回归通过。
2026-10-05 17:38:21 +08:00
TermiNexus 0ef4ba9634 refactor(includes): R12 收尾——再改 48 处可确定安全的计数 while 循环
在 R12 保守判定基础上放宽两处(仍保证语义等价):1) 允许 <= 条件,改写为 range(expr + 1)(while 结束后计数器为 n+1、for range 后为 n,已被「循环后不引用计数器」守卫覆盖);2) 初始化行只要求是「同块内最近一次对计数器的写入」,不再要求紧贴 while(中间不得读写该计数器)。

其余守卫不变:界表达式必须裸(无 and/or/比较)、体内无 continue、体内仅末尾一次 += 1、无嵌套重绑定、无 while-else、循环后同一函数内不再引用计数器。TransPyV 侧同步 12 处。

验证:bootstrap 三重重编 SUCCESS(无 vast_c 解析回退);全量 77/77 顺序回归通过。
2026-10-05 16:36:36 +08:00
TermiNexus e71daeea0e docs(includes): R11 注释英文化——75 个文件的中文注释改写为英文短注释
按规范「注释只讲解作用,不掺杂历史原因,尽量英文」:把 includes 下 75 个 .vp 的中文 # 注释与三引号 docstring 改写为英文,每个注释块压到 2 行以内。

保留要点:作用、约束、危险警告(不得/必须/注意)、ABI 与类型约定(如 BYTEPTR | t.CPtr = i8** 的跨模块坍缩坑)、位宽/长度约定、fail-fast 要求、内存与句柄所有权。

未动:文件头注释(规范豁免,仍是中文)、运行时中文字符串常量(printf / fatal_error / MlirFail 等用户可见消息,属代码字面量)。

验证:独立脚本比对 HEAD 与工作区的代码骨架(剥离 # 注释与三引号 docstring 后的非空行)——75 个文件逐字节一致;行尾 CRLF/LF 未被改动;全文剩余中文仅 547 行头注释、0 条行尾注释。bootstrap 三重重编 SUCCESS;全量 77/77 顺序回归通过。
2026-10-05 16:18:44 +08:00
TermiNexus 27121f56a7 refactor(includes): R12 下标 while 循环改 for range,R13 c.Set 迁移为赋值
R12(wiki/新规范 L27-39):把「i: int = 0 与 while i < N: … i += 1」形式的下标循环改写为「for i in range(N):」。保守判定:仅当条件为裸 NAME < EXPR、循环体无 continue、NAME 在体内无其它赋值、无嵌套重绑定、循环后同层不再引用 NAME 时才改写。共 269 处 / 48 文件。

R13:c.Set 是正在退化的路径——c.Set(*p, v) 期望写作 *p = v,c.Set(a, b) 等于 a = b。本次把 includes 内 45 处 c.Set 全部迁移为赋值,includes 已无 c.Set 调用。

验证:bootstrap 三重重编 SUCCESS(无 vast_c 解析回退);全量 77/77 顺序回归通过;ZlibTest 内部断言 79 passed / 0 failed。
2026-10-05 15:33:52 +08:00
TermiNexus 3e1ed0992b fix(ast): 修正实参位前导 * 的优先级,*p + n 解析为 (*p) + n
规范 rule 5 允许把 c.Deref(x) 写作 *x,但语法分析器在实参位置对前导 * 取整条表达式作为操作数:*buf + *length 被解析成 *(buf + *length),*length + data_len 成 *(length + data_len),多解引用一层。表现为 zlib decompressobj 全部失效(decompress 返回 0 字节、eof 恒 0、unused_data 取不到),requests/download 同类语句亦受影响。

改为:实参位 *expr 只按 _parse_factor 取紧绑定操作数,经新增 Parser.starred_seed 挂起,由 _parse_factor 顶部接手,再交由上层续接二元运算。*p[0](即 *(p[0]))、*p**2(即 *(p**2))等结合性保持原 C/Python 语义。

验证:全量 77/77 顺序回归一次通过;ZlibTest 内部断言由 74 passed / 6 failed 变为 79 passed / 0 failed。
2026-10-05 15:04:01 +08:00
TermiNexus e80284a6d5 refactor: 全量迁移 includes 到新规范语法
按根目录 新规范 迁移 R1/R2/R3/R4/R6/R7/R8/R9:指针 T* 后缀、内建类型短别名、c.Addr/c.Deref 单目化、c.Asm 改 __asm__、t.CDefine 改 define 软关键字、t.CEnum 改 enum。R4 对内建 cast 多参实参保留 c.Deref 原写法(单目化会致 TPC 类型退化)。验证:includes 52/52 编译通过,TransPyV 自举产物顺序回归 77/77 全通过。
2026-10-05 09:04:46 +08:00
TermiNexus 7f3b3dea1a feat(parser): switch 的 case/default 支持 if 守卫
_parse_switch_case / _parse_switch_default 解析可选 `if <cond>` 并传入 MatchCase.guard(原为直接报错 / 写死 None),与 _parse_match_case 同款写法。
2026-10-03 10:58:53 +08:00
TermiNexus 1e6082afe9 fix(switch): case 标签支持裸名(按值引用)并给出常量标签 fail-fast
- 裸名在 match 里是捕获模式(MatchAs),switch 里对齐 C 的 `case NAME:` 语义,
  三端解析均归一为 MatchValue(Name);`_` 仍作通配(等价 default)
- includes/ast/parser.vp、lib/vast/Parser.py、lib/vast_c/vast_c.c 同步实现
- HandlesMatch:case 标签求值非编译期常量时 fail-fast(原先会因取 .constant 崩成
  AttributeError),报文明确“case 标签必须是编译期常量”
2026-10-03 00:14:51 +08:00
TermiNexus 2c5b39456b feat(ast): 新增 switch 关键字与 switch 语句,match 完全禁止 fallthrough
- tokens.vp:Keyword 表尾追加 Switch / FallThrough,并 intern "switch"/"fallthrough"(既有编号不变)
- stmts.vp:Match 增加 is_switch 字段(switch 语法糖 desugar 的标记);FallThrough 注释改为仅 switch 合法
- parser.vp:match / fallthrough 改为硬关键字分派(去掉软关键字 lookahead);新增 _parse_switch(case 常量/枚举变体/多值 + default:)
- lexer.vp:局部变量 match 改名 Matched(match 已为硬关键字)
2026-10-02 23:15:13 +08:00
TermiNexus b85f49ab35 feat(ast): 新增 fallthrough 软关键字语句节点 FallThrough
- base.vp:ASTKind 末尾追加 FallThrough(append 保持既有枚举值不变)
- stmts.vp:FallThrough 语句节点(kind / type_name / dump)
- parser.vp:语句位置识别裸 `fallthrough`(仅整条语句命中;fallthrough = 1 /
  fallthrough(x) / d.fallthrough 等作标识符的写法不受影响)
- __init__.vp:导出 FallThrough
2026-10-02 22:33:15 +08:00
TermiNexus 7384d9a57c fix(parser): 类型注解位的 __attribute__(...) 只解析调用本身,不再吞掉后续 []T
原实现用 _parse_test 解析 __attribute__(...) —— 那是通用表达式解析器,解析完调用后
会继续吃 postfix trailer,把紧随的 C 风格前置数组 `[]T` 的 `[]` 当作**合法空下标**
吞掉(_parse_slice 显式支持空下标 T[],见其注释)。后果:ac_node 不再是 Call ⇒
描述符循环 break(markers 一个都没收集),且 _match_op(Lsqb) 此时看到的是元素类型
⇒ 数组分支被跳过 ⇒ 整个注解退化成裸元素类型,且**全程零报错**。

现场:TransPyV/App/main.vp:44
  V_TPV_VERSION: __attribute__(section(".PRVERSN")) []char = "0.0.5-dev.479"
被解析成 `char`:stub 记 `V_TPV_VERSION: char`、IR 出
`@g = global i8 getelementptr ...`(opt: got 'ptr' but expected 'i8')、段名 ".PRVERSN" 丢失。

改为:_advance 过 `__attribute__` 后用 _parse_call 解析 `( 实参表 )`,postfix 不再被
误吃,`[]char` 交回数组分支脱糖为 t.CArray[char, None] → i8*。
2026-10-02 17:29:58 +08:00
TermiNexus c27ebc1b69 feat(struct): 新增 struct 关键字(class 同形,纯数据类型)
语义(用户 2026-10-01 定):与 class 同形,但只能表示数据类型:
  ① 禁止 virtual / novirtual 修饰(struct 天然无虚表);
  ② 禁止在 struct 内定义 def;
  ③ 允许在 REnum 内作为变体(与 class 一样);
  ④ 允许 struct 内再写 struct(与 class 内写 class 同口径,语法层不额外禁止)。

实现(双端同一套表示,零新增下游判据):
  · tokens.vp:Keyword 枚举**表尾**追加 Struct(既有 kw_subtype 编号逐字不变)
    + _kw_intern("struct");struct 在 .vp 源码中不作标识符。
  · parser.vp:新增 _parse_structdef + _RecordStructErr,复用 class 的
    基类/类型参数/类体解析路径,解析期合成 `@t.NoVTable` 伪装饰器并**追加**
    `t.CStruct` 标记基类(真实父类仍在 bases[0])——与手写
    `@t.NoVTable class X(t.CStruct):` 逐字段同形;类体解析后检查直接子节点,
    遇 FunctionDef 即 fail-fast。
  · parser.vp:_ParseVirtualModified 显式拦截 `virtual struct` / `novirtual struct`。

验证:struct 内 def / virtual struct 均报错;`struct = 5` 仍按普通赋值解析。
2026-10-01 23:07:11 +08:00
TermiNexus 14221b9414 refactor(includes): 适配新指针口径与语法,rawptr[T] → T* / t.CPtr → rawptr
- json/__init__.vp、math.vp:rawptr[T] 改为 T*
- ast/base.vp、ast/stmts.vp:@t.CVTable 改为 virtual class
- argparse.vp:t.CPtr(...) 改为 str*(...)
- stdarg.vp:arg(type: t.CType) 改为 t.CPtr
- stdint.vp:FSIZE_t/LBA_t 换成 LPCSTR
- memhub.vp:import 整理、去掉 t.CDefine 前缀、t.CPtr 改 rawptr、格式对齐
- ast/parser.vp、math.vp、linkedlist.vp:对齐与格式清理
2026-10-01 18:05:05 +08:00
TermiNexus 987f91ce32 feat(static): 注解位置的 static 不再支持(响亮失败),存储类标记一律前置
_parse_type_ann:删掉注解位置 static 脱糖成 t.CStatic 的分支,改为 _RecordDescriptorErr 报错并提示改成前置形式(static 名字: 类型),消费该 token 后继续解析类型

_IsStaticDescriptorKeyword 改述为旧位置误用识别(仍只由 _parse_type_ann 调用,无死代码);_parse_type_ann 的 docstring 同步:合法写法只剩两种同源形态——语句起始 static 名字: 类型(pending_static 通道)与装饰器 @t.CStatic

报错而非忽略的理由写进注释:不消费时 static 会退化成叫 static 的类,被建成 opaque 结构体(llvm-link 报 invalid type for null constant),报错点远离根因
2026-09-28 13:49:29 +08:00
TermiNexus 9011878459 fix(ast): export/extern 变量 AnnAssign 固定 simple=1,Equal 判定显式 != 0 2026-09-27 17:57:15 +08:00
TermiNexus f854f7e99a feat(ast): 支持 export/extern 变量声明语法糖
export NAME: T [= v] → NAME: T | t.CExport [= v](裸名导出,不加模块 SHA1 头)

extern NAME: T → NAME: T | t.State(仅声明 + 裸名);extern 带初始值响亮失败

新增 _is_export_extern_var lookahead(第三 token 为 : 判变量,(: / [ 判函数不影响 export def)与 _parse_export_extern_var
2026-09-27 17:56:46 +08:00
TermiNexus 46cd4b4ebf feat(ast): 新增 renum 语法糖,renum X: 等价 class X(t.REnum):
tokens.vp: 追加 Keyword.Renum(表尾,既有 kw_subtype 编号不变)并注册 renum

parser.vp: _parse_stmt 与 _parse_compound 分发 Keyword.Renum;新增 _parse_renumdef,基类固定 Attribute(Name(t), REnum),与手写 class X(t.REnum): 逐字段同形

与 enum/union 语法糖对称;成员按普通类体解析(嵌套 class 变体 + 无载荷赋值)

背景: EdgeCaseTest App main.vp 第 42 行 rnum 非关键字导致 AST 解析失败
2026-09-27 17:49:39 +08:00
TermiNexus 674282936f fix(ast): 解析失败保证有位置与原因,错误消息改单行
parse_tokens 的 error_count>0 出口此前直接 return None:解析器 40+ 处 error_count 自增并非每处都调 _record_*,缺记录时 dump_parse_traceback 只能打出 File 加 SyntaxError: 语法错误,既无行号也无原因(用户报 AST 解析失败不显示失败原因)。现于该出口用当前 token 补记 行/列 + 原因。另把 _record_parse_err_ctx 的消息由含换行的两行并成单行,便于调用方日志行内联。
2026-09-27 17:32:28 +08:00
TermiNexus 5e1180fc26 fix(ast): parser.vp 去掉不存在的 ast. 命名空间前缀
parser.vp 位于 ast 包内、并没有 import ast,写 ast.Call* / ast.ASTKind.X 会把变量注解记成模块限定名 ast.Call,走到 lookup_field_by_class 的模块限定分支就 fail-fast:类 ast.Call 未找到(模块 ast 可解析 sha1=1abcd5277fa442de,但 Call 实际注册在定义模块 5df907d3a02a0bac 下)。全部改用本文件已导入的裸名(AST / ASTKind / Call / Name / Attribute),共 36 处。
2026-09-27 16:53:47 +08:00
TermiNexus 6b88b3feff feat(parser,descriptor): static 作为注解位置描述符(名字: static T)
新增 _IsStaticDescriptorKeyword 并接入 _parse_type_ann 的描述符循环:注解位置的 static(名字: static T,ViperOS 驱动广泛写 pack_head: static uint32 = 0)与 const/volatile 同位置、顺序自由、可混写,落成同一个 t.CStatic 标记(与语句起始 static 名字: T 的 pending_static 通道、手写 t.CStatic | T 三处同源)。此前注解位置的 static 未被消费,退化成一个叫 static 的类名并被建成 opaque 结构体(@a = global 类型为 sha1.static 的 zeroinitializer,llvm-link 报 invalid type for null constant)。
2026-09-27 14:18:52 +08:00
TermiNexus 6e3231d04c feat(parser): 支持 static 修饰符(软关键字,归一为 t.CStatic 标记)
两种写法同源,最终都产出与手写 @t.CStatic / x: t.CStatic|T 逐字段同形的标记节点,故 TransPyV 侧零新增解析判据:

- static def f(...):消费 static 后合成 @t.CStatic 装饰器(与 inline def 同一套 pending_decorators 通道,见 _ParseStaticModified)。

- static x: int = 0:置 Parser.pending_static,由 _parse_type_ann 在描述符序列首位插入 t.CStatic(= 手写 t.CStatic | int),随即清零只作用于紧随的一个注解。

- 软关键字边界:只在语句起始、且后随 def 或 Name: 时命中(_IsStaticModifier);作标识符的位置(属性名/形参名/表达式内)不经过该判据。

语义(禁止跨模块使用)由 TransPyV 侧消费。
2026-09-27 12:58:44 +08:00
TermiNexus a6fe460bce feat(parser): 支持空下标 T[](无签名函数指针 t.Callable[])
_parse_slice 在 '[' 后紧跟 ']' 时不再调 _parse_expr(原本报 意外的 token ]),slice 置 None 交类型解析侧按空参数表处理。其余切片/元组/单表达式形态不变。
2026-09-27 12:25:47 +08:00
TermiNexus c392390e0d feat(ast): 支持 volatile 调用前缀与注解位置 __attribute__(...) 修饰符
- Call 新增 IsVolatile 字段(末尾追加,既有字段偏移不变),承载值位置 volatile f() / volatile S() 前缀标记。

- parser 新增 _IsVolatileCallPrefix + _parse_test 消费点:吃掉 volatile 后对解析出的 Call 置 IsVolatile=1。

- parser 注解位置新增 _IsMagicAttributeCall:描述符收集循环扩为 _IsDescriptorKeyword or _IsMagicAttributeCall,把 __attribute__(...) 的实参经 _MakeTAttrMarker 合成为 t.attr.<name> 标记贴到类型联合最左,与 const/volatile 同族语义。
2026-09-27 12:01:15 +08:00
TermiNexus 622ae03c9f feat(ast): 支持 inline def 与 @__attribute__(...) 语法糖(均 desugar 到既有装饰器)
- parser.vp:新增 inline 修饰符(软关键字,语句起始 + 后随函数定义时生效),合成 @t.attr.always_inline;inline 不进关键字表,作标识符的既有写法不受影响

- parser.vp:新增 @__attribute__(section(...), always_inline) desugar ⇒ @c.Attribute(t.attr.section(...), t.attr.always_inline);带/不带调用的属性名都支持,class/def 共用装饰器链,产出与手写形态逐字段同形
2026-09-27 11:41:09 +08:00
TermiNexus 748c17dd1a fix(memhub,ast): alloc 懒建记录栈修永久漏块;OOM 整池账目/分段/双读取证;池耗尽 fail-fast
memhub.alloc: 首次 mark() 之前分配的块此前不入记录栈,事后 free 全被 _is_valid_ptr 活跃集检查拒绝而永久漏块;改为需要时懒建记录栈

memhub.dump_alive_orders: 新增整池账目(镜像存活/空闲链表/丢失)+ 前缀-vs-本窗口分段 + 4 条抽样(直读与两步式双读 + ±8 邻字探针)

memhub.mark/free: 记录 mark_free_bytes/mark_depth;free 被拒绝时逐判据打印(在池内/对齐/块头奇数/在记录窗口 + 本池 base/usable/usable_size)

memhub: 删除文件尾部重复残块(2291 行无主 INDENT 曾致整模块声明未注册)

ast/tokens + ast/lexer: Token/KwEntry/Lexer/token_set_str/indent_stack/_kw_lookup 池耗尽 fail-fast,不再留 NULL 崩在 _kw_hash_str
2026-09-26 21:25:23 +08:00
TermiNexus db3be6968f fix(memhub,gzip): 内存池 OOM 归属画像与 free 拒绝现场;gzip 注解 *= 词法粘连
memhub: alloc 失败打印归属 site/ctx 与存活块 order 分布(新增 dump_alive_orders);free 被 _is_valid_ptr 拒绝时首次打印现场;接通 big_alloc_count

gzip: ub: uchar*= buf 补空格(*= 被词法合并为单 OP,注解止于 uchar)

新增 traceback 模块;删除 dbgstack.vp;其余模块随新语法与尺寸口径同步
2026-09-26 19:27:24 +08:00
TermiNexus b208eae8f3 feat(dbgstack,parser,asm): 新增按键栈转储运行时;前置数组声明符/union 语法;asm 迁移新语法
新增 includes/dbgstack.vp: 挂起主线程取 x64 CONTEXT + RBP 链逐步取证 + 栈扫描兜底(4KiB 分块 ReadProcessMemory);按 <exe>.stackmap 下界查表输出 <文件>.vp:行 (函数);控制台 ASCII 输出并双写 UTF-8 <exe>.stackdump.txt;ASan 与 DbgHelp 冲突显式降级不静默;lock cmpxchg 原子重入(不用 InterlockedCompareExchange: x64 上是编译器内部函数、无导出符号)。

新增/补 w32 头: win32dbghelp.vp(新)、SetConsoleCtrlHandler、x64 CONTEXT、ReadProcessMemory。

parser.vp/tokens.vp: [N]T/[]T/const [N]T 脱糖为 t.CArray;新增 union NAME: 语句(Keyword.Union 追加表尾);list[rawptr[AST]] elem_size 2/4 改 8;新增 _record_parse_err_ctx 把 token 类型与前后 token 并入错误消息,去掉 [AST] SyntaxError 遗留单行 printf。

asm.vp: 整文件迁移到 __asm__/asminp/asmout/裸 ASM_DESCR。
2026-09-25 13:11:15 +08:00
TermiNexus 0f556463e7 修正了部分代码的表达方式,最后可用版本,mlirlite 已基本完善 2026-09-23 17:42:03 +08:00
TermiNexus 785e825518 清理了 t.CVoid 2026-09-16 16:07:35 +08:00
TermiNexus ed67ecc656 perf(ast): 关键字查找改用哈希索引消除线性扫描
_kw_lookup 原为 45 项链表按名 strcmp 线性扫描(每个标识符 token 调用一次)。改为 FNV-1a 开放寻址索引,在 _init_keywords 由同一批 _kw_intern 一次性派生;查找期望 O(1) 且不分配内存;索引未建成时回退原链表扫描,语义与逐项比较一致。
2026-09-13 18:56:16 +08:00
TermiNexus 2992674783 feat(types): rowptr/REnum 迁移工作区快照 + GSList/PrintModule 临时 DBGCHAIN 护栏
把此前未提交的 rowptr 迁移整体入库(42 文件,含 ast/llvmlite/hashlib/json/zlib 等签名 rowptr 化)。临时诊断(用后移除):linkedlist.vp GSList[T].append 链完整性四检、__module.vp PrintModule Function.Params/param 指针野值护栏([DBGCHAIN] 前缀 + fflush + exit)。
2026-09-05 14:51:40 +08:00
TermiNexus f76620199a feat(ast): lexer 支持 f-string 表达式块嵌套与同引号嵌套字符串(PEP 701) 2026-08-30 07:36:50 +08:00
TermiNexus 49445ea796 fix(ast): lexer 支持 \xNN 十六进制转义,修复 \x1b 被判为 CONST_STR 的问题 2026-08-30 07:36:28 +08:00
TermiNexus f087aa88e2 更新,可自举 2026-08-27 10:16:28 +08:00
TermiNexus 4ce6095359 修正 2026-08-22 09:25:46 +08:00
TermiNexus 5e768a9831 更新了库 2026-08-19 05:11:35 +08:00
TermiNexus 14ff9d109f 从 TransPyC 主项目中分离 VRTE 2026-08-17 11:01:35 +08:00