Commit Graph
4 Commits
Author SHA1 Message Date
TermiNexus e37cc8d792 fix(vast_c): alias/keyword 节点补位置属性,201 文件全量对比零差异
- ParseImport/ParseImportFrom/ParseImportAlias:alias 节点缺 lineno/col_offset(vast 有),编译器符号注册可能按节点位置关联
- MakeKeyword:keyword 节点缺位置属性(4 个调用点:函数调用/类定义的 k=v 与 **kwargs)
- 修复后 includes/ + TransPyV/App 全部 201 个 .vp 文件 vast_c vs vast 的 dump 与位置属性完全一致(此前差异 6 文件 keyword + 2 文件 alias)
2026-08-18 07:07:21 +08:00
TermiNexus 6350b81307 feat(vast_c): extern/export 完整语义(注解改写+标记)并接入 vast.parse
- ParseExternDef:支持 4 种语法(extern/export [def] A(...) -> T [': pass']),返回注解改写为 <原类型> | t.State(extern)/ <原类型> | t.CExport(export),节点设 Extern=True/Export=True(对齐 vast Parser._ParseExternDef/_ParseExportDef)
- MakeTAttrNode:构造 t.Attr 注解节点(Attribute(Name('t'), attr))
- vast.parse 接入:默认走 vast_c C 加速路径(VAST_USE_C=0 禁用,=strict fail-fast 直接抛),异常回退纯 Python vast
- 差分测试 83/83 全绿(新增 7 个 extern/export 用例);includes/ 与 TransPyV/App 4 个真实 .vp 文件 C 路径与纯 Python 输出一致
2026-08-18 06:59:10 +08:00
TermiNexus d13b966604 fix(vast_c): 修复三处解析节点后未消费 token 的 bug(死循环/语法错误)
- ParseAtom 普通名字分支:MakeNameNode 前未 NextTok,'x = 1' 时 idx 恒 0 → ParseModule 死循环(True/False/None 分支有 NextTok,普通名字分支遗漏)
- ParseComparison TK_OP 分支:设置 OpName 后未 NextTok 消费 < > <= >= == != 比较符(is/in 分支有)→ 'a < b' 后比较符未消费导致 unexpected token
- ParseTarget NAME 分支:MakeNameNode 前未 NextTok → 'for i in' / 推导式 target 报 expected name

三处同款根因:构造节点后忘记推进 token 游标。
差分测试 76/76 全绿;基准 5.5x 加速(11.6ms -> 2.1ms/次,真实复杂源码)
2026-08-18 06:50:27 +08:00
TermiNexus 0d15e8cb7a feat(vast_c): C 版解析器阶段 0——赋值/名字/数字子集,直接构造 vast.nodes 树
- MSYS2 MinGW gcc 编译 CPython 3.12 C 扩展(_parser.pyd,-lpython312 必须置于源文件后)
- Tokenizer + 表达式/赋值/模块解析,节点通过 PyObject_Vectorcall 直接实例化 lib.vast.Nodes 类
- 输出与 vast.parse 结构完全一致(含位置属性),eval 模式复用 vast.parse 语义
- 可行性验证:200 语句文件 × 200 次基准 9.0x 加速(6.17ms -> 0.685ms/次),C 侧开销主要在节点构造,后续可继续优化
2026-08-18 05:45:11 +08:00