可将 VB6 工程编译为原生 Windows 可执行文件或 ActiveX DLL,也可写新项目。项目用 C++17 前端和 C 代码生成,支持 .vbp、COM、窗体与多数内置函数,产物静态链接、零运行时依赖,不支持语法会报错。【此简介由AI生成】
当前访问频次受限,请登录后继续访问
C3 — 现代化 VB6 编译器
官网:https://c3.vb6.pro | 仓库:https://gitcode.com/woeoio/c3.vb6.pro(本地路径
D:\code\vi\c3.vb6.pro)C3 把 VB6 工程(
.vbp/.bas/.cls/.frm/.frx)直接编译为原生 Windows x64 / x86 可执行文件或 ActiveX DLL, 源码无需任何修改,无运行时 DLL 依赖。
一、这是什么
C3 是一个用 C++17 从零手写的 VB6 编译器前端 + C 代码生成后端:
VB6 源码 (.bas/.cls/.frm/.frx + .vbp)
↓ 编码检测 (GBK / UTF-8 / UTF-16)
↓ 预处理 #Const / #If / #ElseIf / #Else
↓ 词法 LL(2) + Unicode
↓ 语法 递归下降 + Pratt(14 级优先级)
↓ 语义 两遍扫描 + 符号表 + 类型系统 + TypeLib 导入
↓ 代码生成 VB6 → C
↓ 编译链接 shell-out 到 MSVC 的 cl.exe / link.exe
原生 EXE / DLL(静态链接 VB6 运行时)
核心信条:不支持的语法必然报错,绝不静默误编。 错编译比不编译更危险。
产品定位
| 维度 | 说明 |
|---|---|
| 定位 | 旧 VB6 项目迁移工具 + 用 VB6 语法写新项目的工具 |
| 形态 | 编译器 + 工具链内核(CLI),不做 IDE |
| 开源 | 是 |
| 与 twinBASIC 的关系 | 不竞争。twinBASIC 是闭源一体化 IDE,C3 做开源底层,对接任意前端 |
| 目标用户 | 需要迁移旧项目、偏好开源的开发者 |
二、当前状态(2026-09-14)
| 项目 | 状态 |
|---|---|
| 版本 | 权威值见根目录 VERSION 文件(C3 --version 与 CMake 工程版本均由它自动派生) |
| 里程碑 | M1 ~ M33 全部达成 |
| 最新基线 tag | v0.1.0-m33-vbman-dll(提交 5f4bed1) |
| 编译期 | 大型真实工程(VBMAN,125 模块含 4 个窗体)error C = 0,链接期 LNK2019 / LNK2005 / LNK1104 均已清零 |
| 产出验证 | VBMAN.dll 2,566,144 字节,可 regsvr32 注册(运行期行为仍在对齐中) |
| 内置函数覆盖 | 143 个 VB6 内置函数中已实现 126 个(88%),详见 ai/021-VB6语法成员覆盖率统计.md |
| 回归测试 | tests/ 下 98 个 .bas + 13 个 .vbp,由 scripts\test.bat 驱动 |
| 代码规模 | 编译器 C++ 约 4.0 万行,RTL(C)约 1.8 万行 |
权威进度以
ai/004-进度表.md为准;每次会话恢复修复上下文请读ai/C3_FIX_HANDOFF.md。
三、快速开始
3.1 环境要求
| 工具 | 版本 | 说明 |
|---|---|---|
| Visual Studio 2022 Community | MSVC 14.4x | 提供 cl.exe / link.exe / rc.exe |
| CMake | ≥ 3.20(实测 3.31.6) | 需先加载 vcvarsall 才在 PATH |
| Ninja | 1.12+ | 生成器 |
| Windows SDK | 10.0.22621+ | 窗体/COM 相关头文件 |
vcvarsall.bat 默认路径:
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat
3.2 构建编译器
scripts\build REM 增量构建
scripts\build clean REM 清理 .build 后完整构建
产物在 .build\C3.exe(注意:不在 .build\Release\ 下);build.bat 会顺带把它复制到 publish\C3.exe。
构建后建议先冒烟验证产物可用:scripts\test smoke(用例 tests\smoke.bas)。
PowerShell 一键构建 + 测试(Agent 会话推荐):
scripts\dev.ps1 # 构建 + 测试
scripts\dev.ps1 -SkipTest # 只构建
scripts\dev.ps1 -SkipBuild # 只测试
3.3 编译一个 VB6 程序
.build\C3.exe tests\hello.bas -o output\hello.exe
.build\C3.exe 工程.vbp --output-dir output
.build\C3.exe --dll --arch x64 -o output\VBMAN.dll 工程.vbp
3.4 运行测试
scripts\test REM 全部
scripts\test run REM 仅运行测试
scripts\test compile REM 仅编译测试
scripts\test syntax REM 仅语法检查
scripts\test smoke REM 仅冒烟测试(构建后快速验证产物可用,见 tests\smoke.bas)
scripts\compile tests\hello.bas REM 单文件编译(自动带 MSVC + RTL 环境)
scripts\run hello REM 运行 output\hello.exe
3.5 全量对照回归(C3 vs 真 VB6)
tests\regress_all.ps1 把 tests\ 下除 vbman 外的全部用例(vbp / bas / frm / aux,当前 118 个)与微软真 VB6(本机 VB6Mini,命令行 /make 编译)逐个对照:双方各自编译、运行,按矩阵判定,结果增量写入 tests\_vb6ref\report-*.csv(含每个用例的双方编译结果、退出码与失败备注)。
# 前置:先构建 C3(scripts\build),MSVC 环境同 run_tests.ps1(设 C3_VCVARSALL 或让脚本经 vswhere 探测)
.\tests\regress_all.ps1 REM 全量(约 25 分钟)
.\tests\regress_all.ps1 -Filter test_iif* REM 只跑匹配用例
.\tests\regress_all.ps1 -List REM 枚举用例,不执行
.\tests\regress_all.ps1 -CompileOnly REM 只比编译,不运行
可选覆盖:参数 -C3 <路径> / -VB6 <路径>,或环境变量 C3_EXE / VB6_EXE / C3_TESTS_WORKROOT。
判定矩阵:
| 判定 | 含义 |
|---|---|
| PASS | 双方编译 OK,运行退出码一致(双方都有输出时还比内容) |
| REG-C3 | 真 VB6 可编译而 C3 失败 —— 可疑回归,需排查 |
| C3-EXT | C3 可编译、真 VB6 不支持(C3 扩展语法/能力) |
| BOTH-FAIL | 双方都失败(注意:tests 里有故意的负例用例,属预期) |
| RUN-DIFF / RUN-TIMEOUT | 编译都过但运行行为不一致 / 一方超时 |
| SKIP-AUX | 辅助模块(非独立用例),跳过 |
备注:真 VB6 编译需 VB6.EXE 可无界面运行且其链接器对工作目录可写(本仓库约定工作目录 tests\_vb6ref\,该目录已 gitignore,运行产物不进库)。
3.6 vbman 专项对照回归(只测 vbman)
tests\regress_vbman.ps1 是 3.5 的补集:只对 tests\vbman 的权威工程(src\VBMAN.vbp,Type=OleDll,129 模块)做 C3 vs 真 VB6 对照。OleDll 无运行阶段,改用导出表比对替代运行比对(需 MSVC 环境的 dumpbin)。
.\tests\regress_vbman.ps1 REM 完整对照(C3 全量编译 + VB6 /make)
.\tests\regress_vbman.ps1 -SyntaxOnly REM 只跑 C3 前端(秒级,不调 cl、不用 VB6)
.\tests\regress_vbman.ps1 -List REM 枚举目标,不执行
.\tests\regress_vbman.ps1 -Target VBMAN_EXE.vbp REM 换目标(src 下的 vbp)
判定矩阵:PASS / REG-C3 / C3-EXT / BOTH-FAIL(含义同 3.5)、EXPORT-DIFF(C3 缺 VB6 的导出符号)、DLL-MISSING(报成功但无产物)。报告落 tests\_vb6ref_vbman\report-*.csv。
与 3.5 的两点差异:
- VB6 侧在
tests\vbman的副本里编译,因此不改写src\VBMAN.vbp的 Reference 路径、也不覆盖dist\下产物 —— 无需事后git checkout恢复子模块 - 导出表按「VB6 的导出被 C3 全覆盖」判定,C3 多导的符号(如
DllMain)只记入备注,不算差异
可选覆盖:参数 -C3 / -VB6 / -Arch,或环境变量 C3_EXE / VB6_EXE / C3_VBMAN_WORKROOT。
四、命令行参数
完整参数见 ai/C3_COMPILE_OPTIONS.md,常用项:
| 参数 | 说明 |
|---|---|
-o <文件> |
输出文件路径 |
--output-dir <目录> |
输出目录(默认源文件所在目录) |
--arch <x64|x86> |
目标架构(默认 x64;32 位 COM 组件用 x86) |
--target <平台> |
win-x86 / win-x64 / linux-x64 / macos-arm64 |
--gui <模式> |
native / webview / none |
--dll |
编译为 ActiveX DLL(自动生成并嵌入 TypeLib) |
--syntax-only |
只做语法检查 |
-d, --define <N=V> |
定义条件编译常量,如 -d:DEBUG=-1 |
-O <0-3> / -g |
优化级别 / 调试信息 |
--typelib <文件> / --no-auto-typelib |
TypeLib 显式引用 / 禁用自动加载 |
--progid / --libid |
ActiveX DLL 的 ProgID 前缀 / TypeLib LibID |
--dump-tokens / --dump-ast / --dump-symbols / --dump-preprocess / --dump-ir / --dump-frm |
各阶段中间产物转储 |
--emit-c |
只生成 C 代码,不调用 cl/link |
--keep-for-debug |
保留中间文件(默认清理) |
--compat-check |
兼容性检查模式 |
-v / -h / -V |
详细输出 / 帮助 / 版本 |
中间文件目录:%TEMP%\C3C\<会话ID>\。调试链接错误(LNK2019 等)时加 --keep-for-debug 检查生成的 C 与符号名是否一致。
编译 ActiveX DLL 等场景必须在 MSVC 环境中运行 C3(先 vcvarsall.bat x64)。
五、目录结构
c3.vb6.pro/
├── src/ 编译器源码(C++17)与 VB6 运行时(C)
│ ├── common/ 诊断、源码管理、编码转换(GBK↔UTF-8)
│ ├── lexer/ 词法分析(LL(2) + Unicode)
│ ├── preprocessor/ 条件编译 #Const / #If
│ ├── parser/ 递归下降 + Pratt 表达式(分 expr/stmt/decl 三个文件)
│ ├── ast/ AST 节点、Visitor、打印器
│ ├── semantics/ 符号表、类型系统、两遍语义分析
│ ├── project/ .vbp / .frm / .frx 解析
│ ├── com/ TypeLib 解析(前期绑定)
│ ├── typelib/ CreateTypeLib2 内建生成 .tlb
│ ├── backend/ C 代码生成(cgen_expr/stmt/decl/com/form/util)+ MSVC 驱动
│ ├── driver/ CLI 入口、编译流水线编排、RTL 资源解包
│ ├── rtl/core/ VB6 运行时:4 个家族子目录(vb6rtl / vb6com / vb6comserver / vb6forms)
│ └── ir/ 历史遗留空壳(已停用,不参与构建产物)
├── tests/ 回归测试:98 个 .bas + 13 个 .vbp + 多模块/COM/窗体用例
├── scripts/ 构建、测试、编译、运行脚本(见下)
├── ai/ 全部设计文档、进度表、开发历程(99 篇)
├── publish/ 发布包:C3.exe + 内置迷你 MSVC 工具链 + 右键菜单 + demos
├── www/ 官网 c3.vb6.pro 静态站点源码 + scp 部署脚本
├── archive/vbman/ VBMAN 大型 VB6 库(真实工程回归靶子)+ 编译问题日志
├── output/ 测试编译产物(exe/out/err),git 忽略
├── .build/ CMake + Ninja 构建目录,可随时删除重建
├── _res/ logo/ pic/ 品牌素材、favicon、演示动图
└── reference/ 预留给外部参考项目 clone(当前为空)
脚本工具(scripts/)
| 脚本 | 用法 | 说明 |
|---|---|---|
build.bat |
build [clean] |
构建 C3.exe |
test.bat |
test [all|run|compile|syntax|smoke] [verbose] |
回归测试(smoke = 冒烟) |
compile.bat |
compile <source> [outdir] |
编译单个 .bas/.frm/.vbp |
run.bat |
run <exename> [timeout] |
运行 output/ 下的 EXE |
dev.ps1 |
dev [-SkipBuild] [-SkipTest] |
一键构建 + 测试 |
env.ps1 |
. .\scripts\env.ps1 |
dot-source 加载 MSVC 环境 |
跨机器使用前必读:
build.bat/env.ps1的路径配置(环境变量C3_VCVARSALL/C3_PROJECT_DIR)说明见scripts/README.md。
六、架构要点
决策 006:后端走 C 代码生成 + MSVC,不走 LLVM。
src/backend/llvm_backend.*、pe_writer.*、src/ir/* 均为 2 行空壳,CMake 中 LLVM 后端默认 OFF。
CLI 仍保留 --dump-ir / --emit-llvm 开关,但没有消费方。
决策 008:库优先(library-first)。
| 产物 | 内容 |
|---|---|
vb6c3-core.lib |
词法 / 语法 / 语义 / 符号 / 类型 / 诊断 |
vb6c3-cgen.lib |
C 代码生成后端 |
C3.exe |
薄 CLI 驱动(链接上述两个库) |
RTL 内嵌(P10,源码级)。 14 个 RTL 头文件 + 25 个 RTL .c 源码(共 39 项)以 RCDATA 资源嵌入 C3.exe
(见 src/driver/c3rtl.rc),运行时由 rtl_embedded.cpp 解包到 %TEMP%\C3C\<会话ID>\rtl\,
与生成的 C 代码一起交给 cl.exe 编译(/Gy + 链接器 /OPT:REF 自动剔除未引用的 RTL 代码)。
因此用户机器上不需要安装任何 VB6 运行时,产物静态链接、零依赖。
改动 src/rtl/ 后直接重编 C3.exe 即生效(scripts\build.bat),无需任何预编译步骤。
RTL 组成(src/rtl/core/,按家族分目录):
| 目录 | 文件数 | 职责 |
|---|---|---|
vb6rtl/ |
9 | vb6rtl.h(伞头)+ 7 个子头 + vb6rtl.c:BSTR 字符串、VARIANT、SAFEARRAY、数学、转换、日期、文件 I/O、Err 对象、Format |
vb6forms/ |
13 | vb6forms.h / .c + 10 个实现 + 内部头:Win32 窗体与控件(缇↔像素 1/15)、消息循环、菜单 |
vb6com/ |
8 | vb6com.h / .c + 5 个实现 + 内部头:COM 客户端 CreateObject / GetObject / IDispatch 后期绑定 / VARIANT 封送 |
vb6comserver/ |
7 | vb6comserver.h / .c + 4 个实现 + 内部头:COM 服务端类工厂、DllGetClassObject / DllRegisterServer |
di/ |
8 | vb6_di_stubs.c(手写:序号 / msvbvm60 运行时 / 动态加载)+ 7 个按 Lib 家族生成的转发桩(win32 / user32 / gdiplus / crypto / net / com / shell):Win32 API Declare 转发(解决 x64 下 msvbvm60 等无导入库的问题)。生成物由 scripts/gen_di_stubs.ps1 产出,家族来自 C3 生成头里的 /* vb6_di_lib: <lib> */ 标记 |
子目录只影响源码树可读性:47 个文件解包到同一个平铺临时目录,RTL 内部 #include 一律按 basename,
且各家族之间无交叉 include,因此编译路径与拆分前完全一致。
新增 / 重命名 / 删除 RTL 文件需同步 5 处(c3rtl.rc / rtl_embedded.hpp / rtl_embedded.cpp /
driver.cpp / CMakeLists.txt)。
七、已支持与未支持
已支持
- 语言:模块 / 类模块 / UDT / Enum / 常量、Pratt 14 级表达式、软关键字、条件编译(含
Win64/VBA7等内置常量)、 GoSub/Return、With、For Each、On Error / Resume / Err 对象、默认属性解析、ParamArray / Optional / 命名参数 - COM:CreateObject / GetObject、前期绑定(TypeLib 导入)与后期绑定(IDispatch)、Implements、WithEvents 事件 (内部类 / 窗体控件 / 外部 COM 三条路径)、IEnumVARIANT 集合枚举、ActiveX DLL 产出(内建生成 .tlb)
- 窗体:
.frm+.frx二进制资源(图片 / 图标 / ImageList / 文本)、控件数组、MDI、菜单、Timer、缇↔像素换算 - 控件:VB6 工具箱 21 类内置控件中 14 类全链路可用(窗口创建 + 属性读写 + 事件分发)≈ 67% —— Form / MDIForm、CommandButton、TextBox、Label、CheckBox、OptionButton、ListBox、ComboBox、 Frame、PictureBox、HScrollBar / VScrollBar、Image、Timer、Menu、WebBrowser(WebView2)
- 窗体实现形态:RTL
vb6forms.c用 Win32 原生窗口类重实现(BUTTON / EDIT / STATIC / LISTBOX … + VB6_SHAPE / VB6_LINE 自绘), 不是复刻 VB6 运行时,因此产物零依赖、静态链接,且支持 VB6 自身不具备的 x64 - 控件能力三档:属性层最厚(50+ 双向读写含 Font 六件套 / Back&ForeColor / Alignment / TabIndex / ToolTipText / MousePointer…), 事件层次之(约 25 个含 KeyPress / Validate(Cancel) / QueryUnload(Cancel) / MouseEnter / Mouse Leave),方法层近乎空白(仅 AddItem / RemoveItem / Clear + Timer)
- 运行时:126 个 VB6 内置函数(字符串 / 数学 / 日期 / 转换 / 文件 I/O / 数组 / 财务 等),静态链接
尚未支持
- 半接线(RTL 与属性表已实现,缺
controlTypeToWin32Class窗口类映射 → 编过能跑但运行时不可见): Shape / Line、DriveListBox / DirListBox / FileListBox —— 差一步接入,推进计划见第十章路线图与仓库 Issues - 未实现:Data / OLE(x64 无 DAO / MDAC 支撑,列为豁免但会明确报错)、SSTab、Toolbar / StatusBar、CommonDialog
- 控件方法:Move / SetFocus / ZOrder / Refresh / Drag 未实现;绘图语句 PSet / Line / Circle / Print 为 VB6 关键字语法(非函数调用,需专用语句产生式),Cls / PaintPicture 同样未实现
- 窗体相关:Form_Click / Paint / DragDrop 事件、PictureBox 作容器、任意深度容器嵌套(当前仅 Frame 单层子控件)、per-monitor DPI(缇换算按 96 DPI 硬编码)
- 多接口
Implements IFoo, IBar(已决策跳过) - 部分内置函数:注册表 4 函数(GetSetting / SaveSetting / GetAllSettings / DeleteSetting)、
FormatDateTime、CVErr、GetAttr / SetAttr、Erl / Tab / Spc 等,清单见
ai/021 - LSP / DAP / 格式化器 / Linter / 窗体设计器 —— 见
ai/013-工具链与生态建设规划.md,均尚未实现代码
遇到不支持的语法,C3 会明确报错,不会静默生成错误代码。
八、文档导航(ai/)
| 文档 | 用途 |
|---|---|
003-开发计划.md |
分阶段计划与里程碑定义 |
004-进度表.md |
权威进度:P0~P33 全部阶段与任务状态 |
009-产品定位与最终成果展望.md |
定位、可行性分级、VB6 语言边界情况清单 |
011-参考项目综合分析与技术借鉴.md |
对 FreeBASIC / vb6parse 等的参考分析 |
012-第二期VBA-VBS-ASP规划.md |
第二期方言扩展(VBA / VBS / ASP) |
013-工具链与生态建设规划.md |
LSP / DAP / 格式化器 / 包管理器 等长期规划 |
020-P20遗留项任务清单.md |
遗留缺陷清单 |
021-VB6语法成员覆盖率统计.md |
内置函数覆盖率与缺口优先级 |
C3_COMPILE_OPTIONS.md |
完整命令行参数参考 |
C3_FIX_HANDOFF.md |
修复任务交接:新会话直接读它继续修 bug |
开发历程/ |
99 篇按阶段记录的修复与决策过程 |
ENV.md(根目录) |
开发环境速查:路径、脚本、编码约定 |
CONTRIBUTING.md(根目录) |
参与贡献指南:协作流程 / PR 要求 / 测试规范 / 编码约定 |
VBMAN 编译过程的问题日志见 archive/vbman/c3log/001.md ~ 054.md。
九、开发约定
| 规则 | 说明 |
|---|---|
| 换行符 | 全项目统一 CRLF |
| VB6 工程文件 | .frm / .bas / .cls / .vbp 必须 GBK,否则 VB6 IDE 打开乱码 |
| C/C++ 源码 | UTF-8(与 CMake / MSVC 默认一致),CMake 已加 /utf-8 |
部分 .md 带 UTF-8 BOM |
编辑时保持原样 |
| 构建目录 | .build\ 可随时删除重建;遇 release-only 崩溃先 --clean-first 全量重建再复现 |
| 崩溃追踪 | 设环境变量 C3_CRASH_TRACE=1 启用 dbghelp 栈追踪 |
版本号约定(唯一权威源)
权威源只有一处:根目录 VERSION 文件,内容形如 0.10.4(允许前后带空格,读取方会自动剔除)。
自 2026-09-17 起,原有各处副本已改为从该文件自动派生,不再需要手工同步:
| 使用方 | 取值方式 | 用途 |
|---|---|---|
scripts\release.bat |
直接读 VERSION 文件并剔除前后空格 |
发布目录名与发布包名 |
CMakeLists.txt 的 project(vb6c3 VERSION ...) |
file(READ "${CMAKE_CURRENT_LIST_DIR}/VERSION") + string(STRIP) |
CMake 工程版本元数据 |
src/driver/driver.cpp 的 Driver::printVersion() |
CMake 经 target_compile_definitions 注入编译期宏 VB6C3_VERSION_STRING |
C3 --version / -V 的输出 |
| 本文件第二章「当前状态」表 | 指向本文件,不写死具体值 | 文档展示 |
升版本只需改 VERSION 一处,CMake 工程版本与 --version 输出会自动跟随。
自检(在子模块根目录执行):
cat VERSION # 权威值,升版本只改这里
grep -n "file(READ" CMakeLists.txt # CMake 从文件读取
grep -n "VB6C3_VERSION_STRING" CMakeLists.txt # 宏注入给 c3 目标
grep -n "CMAKE_CONFIGURE_DEPENDS" CMakeLists.txt # 改 VERSION 会自动触发重配置
grep -c '0\.10\.' src/driver/driver.cpp # 应为 0:driver 内无硬编码版本
./publish/C3.exe --version # 应与 VERSION 一致
历史事故(同一问题发生过三次,现已从机制上消除):
| 时间 | 提交 | 情况 |
|---|---|---|
| 2026-09-17 | afbea7d |
首次统一为 0.10.2 —— 此前三处各不相同(VERSION 0.10.1 / driver.cpp 0.10.0 / CMakeLists.txt 0.1.0) |
| 2026-09-17 | 0569942 |
升到 0.10.3 时只改了 VERSION,另两处仍停在 0.10.2 |
| 2026-09-17 | 368dc69 |
升到 0.10.4 时仍只改了 VERSION,README 甚至停留在 0.10.0 |
| 2026-09-17 | 本次提交 | 根治:CMakeLists.txt 改为从 VERSION 读取、driver.cpp 改用编译期宏,三处副本降为一处 |
十、路线图(摘要)
- VBMAN.dll 运行期行为对齐 —— 当前编译 / 链接 / 注册全通,下一步是运行期功能差异
- 内置函数补齐 —— DoEvents、FormatDateTime、CVErr、注册表 4 函数、GetAttr / SetAttr
- 控件补齐(67% → 100%)—— 当前首要方向:定义「100%」= 21 类内置控件能创建 + 属性可读写 + 事件能分发 + 常用方法可调用
- P0:接通 Shape / Line / Drive-Dir-FileListBox 五个半残控件的窗口类映射(≈ 67% → 90%)
- P1:控件方法 Move / SetFocus / ZOrder / Refresh / Drag,以及绘图语句(PSet / Line / Circle / Print 关键字语法 → 翻译为同名 RTL 函数)+ DrawWidth / ScaleLeft 等画布属性
- P2:Data / OLE 明确报错边界、容器任意深度嵌套、PictureBox 作容器
- P3:Form_Click / Paint / 拖放事件、per-monitor DPI
- 任务拆分与认领状态见仓库 Issues
- c3-lsp 语言服务器 + VS Code 插件 —— P0 级生态组件(
ai/013) - c3-dap 调试适配器 —— 依赖代码生成阶段输出 VB6 行号 ↔ C 行号映射
- 第二期方言 —— VBA / VBS / ASP(
ai/012)
详细规划与工期估算见 ai/013-工具链与生态建设规划.md。
十一、参考来源
C3 在语法规则核对、测试语料与实现思路上参考了以下项目(完整索引见 ai/003-开发计划.md 第七节)。源码副本放在 reference/(该目录已被 .gitignore 忽略,不入库):
| 项目 | 版本 | 许可 | 应用位置 | 参考内容 |
|---|---|---|---|---|
| vb6parse | 1.0.1 | MIT | P1 Lexer/Parser · P4 RTL 清单 | Rust 实现的 VB6 解析器,覆盖工程 / 窗体 / 模块 / 控件,附 30+ 个真实 VB6 工程语料;120+ Token、迭代式 Pratt、160+ 内置函数清单 |
| VisualBasic6.g4(随 proleap-vb6 发布) | — | AGPL-3.0 | P1 语法规则 | 权威语法参考:50+ 语句、~130 个歧义关键字、14 级表达式优先级 |
| proleap-vb6 | — | AGPL-3.0 | P1 AST 设计 | 基于 ANTLR4 的 VB6 分析器与转换器,AST / ASG 元模型类清单 |
| vb6grammarfuzz | 0.1.0 | — | P2+ 质量保障 | 基于 VisualBasic6.g4 的 VB6 语法模糊测试器(仓库内本地工具,依赖 vb6parse,无公开地址) |
| RustASP | — | — | P1.3 Pratt 解析器 · P2 作用域链 | Rust 实现的经典 ASP 服务器原型,Pratt 核心实现与作用域链设计参考 |
| aspgo | — | — | P4 运行时设计 | Go 实现的经典 ASP 服务器(含 VBScript),Variant / COM / Error 运行时设计思路参考(本地参考项目,无公开地址) |
| FreeBASIC (fbc) | 1.20.0 | 编译器 GPL-2.0+ / RTL LGPL-2.1+ | 全局架构参考 | 成熟 BASIC 编译器源码,RTL 组织(IR_VTBL)、x64 调用约定与代码生成策略 |
| AvaloniaVisualBasic6 | — | MIT | P1 语法规则 | C# + Avalonia 复刻的 VB6 IDE 与语言,含可视化设计器与 VB6 兼容工程格式(VB6.g4 来源) |
| twinBASIC | — | 闭源 | P5 兼容性验证 | VB6 兼容一体化 IDE,作为 C3 语义兼容性的对照基准 |
aspgo / vb6grammarfuzz 为本地参考项目,无公开仓库地址;各参考项目的本地路径索引见
ai/003-开发计划.md第七节。
十二、参与贡献
欢迎参与 C3 开发!协作流程(分支模型 / PR 要求 / CI 门槛)、测试规范、代码风格与文件编码约定,请先阅读 CONTRIBUTING.md。
- 核心信条:不支持的语法必然报错,绝不静默误编——错编译比不编译更危险
- 动手前:先在仓库 Issues 中认领任务,避免与他人撞车;个人想法草稿见根目录 todo.md 索引
- 快速上手:
scripts\build构建 →scripts\test全量回归(PR 提交前必须全绿) - 外部贡献者:fork 本仓库 → 在自己 fork 里开分支 → 向
main发 PR
项目介绍
可将 VB6 工程编译为原生 Windows 可执行文件或 ActiveX DLL,也可写新项目。项目用 C++17 前端和 C 代码生成,支持 .vbp、COM、窗体与多数内置函数,产物静态链接、零运行时依赖,不支持语法会报错。【此简介由AI生成】
https://c3.vb6.pro/定制我的领域