Compare commits

...

514 Commits
v0.3.0 ... main

Author SHA1 Message Date
5b3d807bbc
!67 release: 合并 v0.8.0 版本至 main 分支
Merge pull request !67 from Luke/release/v0.8.0
2025-08-27 07:44:23 +00:00
44b2ebb64a chore: 优化多平台打包 2025-08-27 15:24:58 +08:00
eb7e2e7e93 chore: 更新项目版本至 0.8.0
- 修改 .env 文件中的 SNOW_VERSION 从 0.7.0 到 0.8.0
- 更新 Gitee 问题模板中的软件版本选项
- 修改 pom.xml 中的项目版本号
- 更新 README.md 中的项目版本徽章链接
2025-08-27 14:52:30 +08:00
77eddb83f4
!65 enhancement: 支持字符串转义与 Unicode
Merge pull request !65 from Luke/feature/add-escape-characters
2025-08-27 03:17:00 +00:00
4181ff8ae2 refactor: 移除 StringEscape 类中未使用的 escape 方法
- 删除了 StringEscape 类中的 escape 方法,该方法用于将普通字符串编码为可安全存储的转义字符串
- 保留了unescape方法,并简化了其文档注释
2025-08-27 10:44:44 +08:00
49b5e61e8e feat: 增加字符串字面量的转义符和 Unicode 转义解析
- 引入 StringEscape 工具类用于字符串转义
- 在解析字符串字面量时,去除首尾引号
- 对字符串内部内容进行转义符和 Unicode 转义解析
2025-08-27 10:43:34 +08:00
e75a60026d test: 新增 Demo26 演示程序 2025-08-27 10:42:11 +08:00
83eb29fa3c chore: 更新测试配置文件
- 在测试配置文件中添加了 Demo21、Demo22、Demo23、Demo24 和 Demo25 应用
2025-08-27 10:41:34 +08:00
bc512fd02d feat: 添加字符串转义/反转义工具类
- 新增 StringEscape 类,提供编译期和运行期的字符串转义/反转义功能
- 支持常见控制字符、特殊字符和 Unicode 字符的转义/反转义
- 适用于 .water指令文件的保存和虚拟机执行时的字符串还原
2025-08-27 10:41:19 +08:00
0bbd82e9ce chore: 删除 Run 配置文件 2025-08-27 10:39:28 +08:00
2fc2a93414 feat: 增强引用推送指令功能
- 支持字符串字面量和数组字面量的解析
- 添加对不同数据类型(如浮点数、长整型等)的解析支持
- 优化了代码结构,提高了可读性和可维护性
- 增加了对 Unicode 逃逸序列的支持
- 添加了详细的类和方法注释,提高了文档质量
2025-08-27 10:39:21 +08:00
9bdc6245bf fix: 修复字符串常量在 VM 代码中的表示问题
- 在 LoadConstGenerator 中添加字符串转义功能,确保字符串常量在 VM 代码中正确表示
- 优化 formatConst 方法,对字符串常量进行转义处理
- 新增 escape 方法,用于字符串转义,包括控制字符和非 ASCII 字符的处理
2025-08-27 10:35:23 +08:00
16ba11c391
!64 feature: 实现私有函数(下划线开头仅限本模块访问)语义检查
Merge pull request !64 from Luke/feature/add-function-access-control
2025-08-26 10:12:30 +00:00
19e473e93c chore: 添加 Demo25运行配置 2025-08-26 18:09:15 +08:00
5537a448e8 test: 添加 Demo25 示例项目 2025-08-26 18:09:01 +08:00
caa62b0bfb feat: 增加模块私有函数访问控制
- 新增规则:以"_"开头的函数名只允许在本模块访问,禁止跨模块访问
- 在 CallExpressionAnalyzer 中实现该规则的检查逻辑
2025-08-26 18:08:46 +08:00
3595631e2c
!63 feat: 增强语义分析与全局常量处理
Merge pull request !63 from Luke/feature/add-constant
2025-08-26 09:31:01 +00:00
b033d53d28 test: Demo24 增加更多测试用例 2025-08-26 17:30:15 +08:00
8eda4fcbce chore: 修改 Demo24 配置文件 2025-08-26 17:29:51 +08:00
b02af0728a test: 修改 Demo24 2025-08-26 16:59:25 +08:00
b058ee4526 refactor: 优化全局变量处理和常量折叠逻辑
- 过滤与函数参数重名的全局声明,避免命名冲突
- 优化常量折叠逻辑,支持跨模块常量优化- 修复字符串字面量和布尔字面量的处理
- 优化代码结构,提高可读性和可维护性
2025-08-26 16:29:29 +08:00
71cbb3a737 test: 增加 Demo 24 2025-08-26 16:22:53 +08:00
ac0d3b9785 chore: 添加 Demo23 和 Demo24 的运行配置文件 2025-08-26 16:22:28 +08:00
f69dd85365 test: 增加 Demo23 2025-08-26 14:40:45 +08:00
c412d1194b feat: 增加全局符号表支持
- 在 ModuleInfo 类中添加 SymbolTable 类型的 globals 字段
- 实现 getGlobals 和 setGlobals 方法,用于获取和设置全局符号表
2025-08-26 14:33:45 +08:00
f39aece9cf feat: 支持模块成员访问的语义分析
- 实现了跨模块常量和全局变量访问的语义分析- 能根据目标模块的全局符号表返回准确的类型信息- 完全支持跨模块类型推断
- 对非模块成员访问的情况增加了错误处理
2025-08-26 14:32:58 +08:00
439304c86a feat: 增强全局常量处理与字面量解析
- 支持整数、浮点数、字符串和布尔字面量的解析
- 添加类型后缀支持(b/s/l/f/d),并进行相应的类型转换
- 优化数字字面量的解析逻辑,支持科学计数法和下划线分隔符
- 改进字面量提取工具的文档注释,明确支持的类型和转换规则
2025-08-26 14:32:13 +08:00
6e31185519 feat: 重构 FunctionChecker 采用两遍扫描策略
- 设计核心:采用“两遍扫描”方案,彻底解决跨模块全局变量/常量类型推断和引用依赖问题
  - 第一遍:为所有模块预先构建并注册全局符号表(globals)
  - 第二遍:在全局符号表全部就绪后,依次分析所有模块的函数体
-功能职责:
  - 遍历所有模块,先建立 globals,再遍历并检查所有函数体语句
  - 为每个函数体构建完整符号表,并注册参数变量
  - 分发每条语句到对应 StatementAnalyzer进行类型检查和错误校验
  - 自动检查非 void 函数 return 完备性
  - 记录所有语义错误,便于前端高亮和诊断
2025-08-26 14:29:37 +08:00
1c86c1dce7 feat: 改进 IR 指令生成逻辑并支持浮点数
- 新增对 long、float 和 double 类型常量加载的支持
- 优化二元运算指令生成,支持不同类型的操作数
- 实现基于变量类型的 move 指令,提高类型兼容性
- 简化控制流指令的生成逻辑
- 优化代码结构,提高可读性和可维护性
2025-08-26 14:01:19 +08:00
1f8176d15e test: 修改 Demo22 2025-08-26 11:55:25 +08:00
f8a331809f chore: 移除 Demo22.run.xml 中的调试参数 2025-08-26 11:55:10 +08:00
0d6c6cef5a feat: 添加成员表达式语义分析器
- 实现了 MemberExpressionAnalyzer 类,用于分析成员访问表达式
- 目前仅支持 ModuleName.constOrVar 形式的跨模块常量/全局变量访问
- 不支持对象成员访问,如 a.b.c- 类型降级为 int,后续由 IR 阶段进行常量折叠
2025-08-26 11:52:47 +08:00
06bb647c83 feat: 实现全局常量预加载及跨模块常量折叠
- 新增 preloadGlobals 方法,扫描所有模块节点,将常量注册到全局常量表- 支持整数、浮点数、字符串和布尔字面量的直接评估
- 优化了 IRProgram 的构建过程,增加了对全局常量的处理
2025-08-26 11:44:04 +08:00
cc66eee75f feat: 支持跨模块全局常量查找
- 新增 externalConsts 字典用于存放跨模块导入的全局常量
- 修改 getConstValue 方法以支持查找外部常量
- 添加 importExternalConst 方法用于导入外部常量
2025-08-26 11:37:05 +08:00
1e2b0e4e0d feat: 新增全局常量表支持跨模块常量管理
- 添加 GlobalConstTable 类,用于编译期间跨模块常量查询和折叠
- 提供注册常量、查询常量和获取所有常量的功能
- 保证线程安全,支持并发操作- 常量的 key采用“模块名.常量名”的格式,确保唯一性
2025-08-26 11:35:08 +08:00
1a0c3a38cb feat: 更新 FunctionBuilder构建流程与文档
- 在全局函数表中注册函数名与返回类型
- 初始化 IRFunction 实例与 IRContext 上下文对象
- 自动导入全局常量(包括跨模块 const 变量)到当前作用域
- 根据函数返回类型设置表达式推断的默认字面量类型后缀
- 遍历声明形参,每个参数分配虚拟寄存器,并注册到作用域
- 依次转换函数体中的每条语句为 IR指令
- 函数体转换完成后,清理默认类型后缀
2025-08-26 11:32:48 +08:00
fcdc3a49f8 feat: 支持成员访问表达式
- 添加对成员访问表达式(如 ModuleA.a)的支持
- 实现 buildMember 方法来处理成员表达式节点
- 增加对全局常量和作用域内常量的处理逻辑
2025-08-26 11:30:20 +08:00
139c42a90e feat: 实现成员访问表达式分析器
- 替换 UnsupportedExpressionAnalyzer 为 MemberExpressionAnalyzer
2025-08-26 11:29:03 +08:00
2dfcc4c95e chore: 更新项目构建配置 2025-08-26 09:52:14 +08:00
91aef32a42 feat: 添加常量符号类型并完善文档注释
- 在 SymbolKind 枚举中添加 CONSTANT 类型,用于表示只读、不可变的公开常量- 完善了各符号类型的文档注释,明确其用途和特点
- 优化了代码格式和段落结构,提高了代码可读性
2025-08-26 01:45:00 +08:00
18c9cbad7b feat: 增加常量声明支持并优化变量声明节点
- 在 DeclarationNode 类中添加 isConst 字段,用于表示是否为常量声明
-增加 isConst() 方法以判断声明是否为常量
- 优化类注释,明确变量和方法的作用
- 更新构造函数以支持常量声明
2025-08-26 01:44:16 +08:00
310e909359 test: 重构 Demo22 模块导入和文件布局
- 修改 Main.snow,移除未使用的 ModuleA 导入
- 将 ModuleA.snow 文件内容合并到 Main.snow 中
2025-08-26 01:43:27 +08:00
d10b7336c1 test: 重构示例代码 Demo22 2025-08-26 01:19:05 +08:00
3b39e9059b feat: 添加 const 关键字支持
- 在 TokenFactory 类中的 KEYWORDS 集合中添加了 "const" 关键字
- 此修改为编译器增加了对常量声明的支持,扩展了语言的功能
2025-08-26 01:18:24 +08:00
c44f8a4630 refactor: 优化 declare 语句的标识符处理逻辑
- 允许 declare 后跟随 const 关键字
-调整错误提示信息,使其更加清晰
- 优化代码结构,提高可读性
2025-08-26 01:18:07 +08:00
c4e9e541fb refactor: 优化全局变量声明的错误信息
-根据变量是否为常量,动态设置符号种类
-针对常量和变量分别定制重复声明的错误信息
2025-08-26 01:17:47 +08:00
da7d7bbcaa feat: 增加常量声明支持并优化声明语句解析
- 增加对常量声明的支持,通过匹配 "const" 关键字
-优化代码结构,使用 var tokens变量引用词法 token 流
- 简化代码逻辑,提高可读性和可维护性
2025-08-26 01:17:13 +08:00
d0c34ce1c2 feat: 优化声明语句语义分析
- 重构代码,优化分析流程,增加对常量声明的处理
-改进错误处理和日志输出,提高可读性和调试友好性
- 修复了一些潜在的语义分析问题,如常量未初始化的检查
2025-08-26 01:16:40 +08:00
1872221666 refactor: 优化赋值语句语义分析逻辑 2025-08-26 01:16:26 +08:00
0a35289ad0 chore: 添加 Demo22运行配置 2025-08-25 18:01:02 +08:00
5f42beaf2a test: 添加 Demo22 演示项目 2025-08-25 18:00:54 +08:00
b454d65962 chore: 新增 Demo14 的运行配置 2025-08-25 18:00:40 +08:00
d536bd17ce
!62 feat: 构建与发布脚本优化
Merge pull request !62 from Luke/feature/add-build-docker
2025-08-25 07:33:23 +00:00
3b3478ee30 style: 删除无用注释 2025-08-25 15:21:18 +08:00
926e87888c build: 优化打包脚本并移除并行构建总结 2025-08-25 15:20:36 +08:00
f7db4fcce8 chore: 添加 build-release-all.ps1 运行配置 2025-08-25 13:47:20 +08:00
9afc1caac7 build: 移除构建失败时的冗余错误提示 2025-08-25 13:47:08 +08:00
2a9d2b7f5f chore: 修改脚本名词 2025-08-25 13:43:38 +08:00
f11303f0e8 build: 添加 Linux 和 Windows 平台的发布脚本配置 2025-08-25 13:41:40 +08:00
7dd273759a build: 实现 Windows 和 Linux并行构建脚本
- 新增 build-parallel.ps1脚本,用于同时执行 Windows 和 Linux 构建任务
- 实现了日志实时输出和错误处理功能
- 添加了构建结果摘要和错误代码处理
2025-08-25 13:41:26 +08:00
e626553a9c build: 降级 SNOW_VERSION 至 0.7.0 2025-08-25 13:18:01 +08:00
b2c0b986c4 build: 更新版本号并重构发布脚本
-重构 release-linux.ps1 脚本,添加版本号读取和输出路径定义
- 新增 release-windows.ps1 脚本,实现 Windows 版本的构建和打包
- 添加 dotenv.ps1工具脚本,用于统一解析 .env 文件
2025-08-25 13:17:51 +08:00
a16f0ac059 chore: 添加 Linux 版本导出脚本和相关配置
- 新增 .env 文件和生成脚本
- 更新 docker-compose.yml 和 Dockerfile 以支持 Linux 版本导出
- 添加 PowerShell 脚本生成 .env 文件
- 实现 Linux 版本导出的完整流程
2025-08-25 12:32:10 +08:00
d3646c86ec chore: 增加docker自动构建 2025-08-24 22:02:54 +08:00
39dff9efc5
!61 release: 合并 v0.7.0 版本至 main 分支
Merge pull request !61 from Luke/release/v0.7.0
2025-08-24 04:15:25 +00:00
80efd7c357 feat: 添加 os.snow系统库模块 2025-08-24 12:13:23 +08:00
99345ddd19 chore: 更新项目版本至0.7.0 2025-08-24 12:05:30 +08:00
df07531edc chore: 更新 bug issue 模板中的软件版本选项
将 v0.6.0 版本替换为 v0.7.0版本,以反映软件的最新版本。
2025-08-24 12:05:15 +08:00
5511978ed8
!60 refactor: 移除词法分析器中的调试代码
Merge pull request !60 from Luke/feature/del-tokens
2025-08-22 09:37:19 +00:00
3406e1a2dd refactor: 移除词法分析器中的调试代码 2025-08-22 17:34:53 +08:00
00f73ecb47
!56 refactor: 重构关键字
Merge pull request !56 from zhangxun/feature/refactor-keyword
2025-08-04 09:23:38 +00:00
e51ba01962
!58 fix: 省略模块函数调用前缀,语义分析依然判定函数存在
Merge pull request !58 from zhangxun/bugfix/module-function-call-prefix
2025-08-04 09:00:21 +00:00
zhangxun
a9b4a6682a fix: 省略模块函数调用前缀,语义分析依然判定函数存在 2025-08-04 16:37:04 +08:00
zhangxun
6c5bafb3e9
!57 docs: 移除废弃的字面量后缀 i、d
Merge pull request !57 from zhangxun/bugfix/abandoned-numerical-suffixes
2025-08-04 07:56:50 +00:00
zhangxun
8d04397f32 docs: 移除废弃的字面量后缀 i、d 2025-08-04 15:26:00 +08:00
zhangxun
7898505717 docs: update README.md 2025-08-04 15:20:30 +08:00
5fdb86cd1b
!55 feature: 增强错误定位
Merge pull request !55 from zhangxun/feature/enhancement-error-location
2025-08-04 07:15:07 +00:00
zhangxun
60adecf808 Merge remote-tracking branch 'origin/feature/refactor-keyword' into feature/refactor-keyword 2025-08-04 15:08:50 +08:00
zhangxun
4ae77434dc docs: 更新文档 2025-08-04 15:08:29 +08:00
zhangxun
582ba2ce27 test: 重构 Demo 2025-08-04 15:08:29 +08:00
zhangxun
359c65228d test: 重构 BugFarm 2025-08-04 15:08:28 +08:00
zhangxun
3e7e5f2dad feat: 支持标准 URL 格式 2025-08-04 15:01:11 +08:00
zhangxun
9a61798d81 docs: 更新文档 2025-08-04 14:52:24 +08:00
zhangxun
9f3b3ad860 refactor: 重构 Demo 2025-08-04 14:52:13 +08:00
zhangxun
62f58cd83a refactor: 重构 BugFarm 2025-08-04 14:52:02 +08:00
zhangxun
a8cf93671e refactor: 重构标准库 2025-08-04 14:51:24 +08:00
zhangxun
d11822f4ba refactor: 重构模板代码 2025-08-04 14:50:10 +08:00
zhangxun
87560db20d refactor: 重构关键字 2025-08-04 14:49:39 +08:00
zhangxun
3a2a1363e6 feat: 增强错误定位 2025-08-04 13:45:23 +08:00
d54a2c59b6
!54 feat: 禁止全局变量重复声明
Merge pull request !54 from Luke/bugfix/fix-global-redeclare-error
2025-08-03 15:25:48 +00:00
4eb1aff553 Merge branch 'dev' into bugfix/fix-global-redeclare-error 2025-08-03 00:49:18 +08:00
80ee450b41
!53 feat: 支持一维及多维数组类型和字面量,重构调用指令生成逻辑
Merge pull request !53 from Luke/feature/add-support-for-array-syntax
2025-08-02 16:48:02 +00:00
f876f66414 chore: 添加 Bug6 运行配置文件 2025-08-03 00:39:18 +08:00
2188171b63 test: 添加 Bug6 2025-08-03 00:39:12 +08:00
7fab3cc662 feat: 检查全局变量重复声明
- 在 FunctionChecker 类中增加了对全局变量重复声明的检查
- 如果全局变量已经存在,则添加语义错误信息
2025-08-03 00:36:34 +08:00
62f2baab03 chore: 添加 Demo21运行配置 2025-08-03 00:16:35 +08:00
60388f6846 test: 添加 Demo21 项目 2025-08-03 00:16:17 +08:00
7c242d998f test: 更新 Demo20 2025-08-03 00:08:56 +08:00
d3a85a24bf feat: 支持数组元素赋值操作
- 新增 __setindex_x 系列内置函数,用于数组元素赋值
- 实现了对 byte、short、int、long、float、double、boolean 和引用类型数组的支持
- 修改了 ExpressionBuilder 和 StatementBuilder以支持数组赋值语法
- 更新了 VirtualMachineEngine 和 SyscallCommand 以支持新的 ARR_SET系统调用
2025-08-03 00:08:28 +08:00
477591303a chore: 添加 Demo20运行配置文件 2025-08-02 19:53:55 +08:00
f4a269540a chore: 更新测试配置文件 2025-08-02 12:33:27 +08:00
cedc77cbc6 test: 修改 Demo20 2025-08-02 12:33:14 +08:00
f61cfa5638 fix: 修复常量类型在 VM 中的表示问题
- 为浮点数添加 f 后缀,避免在 VM 中被错误解释为双精度浮点数
- 为长整数添加 L 后缀,保留类型信息
- 双精度浮点数和整数使用默认格式输出
- 支持数组常量的递归序列化,保留类型信息
- 优化了常量生成逻辑,提高了代码可读性和维护性
2025-08-02 12:32:28 +08:00
f6c877a7a1 refactor: 调整代码格式和注释 2025-08-02 10:51:14 +08:00
6083c0b024 test: 将 print 函数替换为 os.print 2025-08-02 10:50:22 +08:00
b093f8db72 feat: 支持数组下标访问类型分派
- 扩展 __index_i 函数支持 byte、short、int、long、float、double、boolean等类型
- 新增 __index_b、__index_s、__index_l、__index_f、__index_d、__index_r 函数- 优化数组元素访问的 IR 生成逻辑,根据类型选择合适的函数
- 更新 VM 层的 ARR_GET 子命令处理逻辑,支持多种数据类型
2025-08-02 10:49:54 +08:00
4a84f37b20 test: 更新 Demo19 示例 2025-08-01 23:34:57 +08:00
2a6fa8034c chore: Demo19 添加调试参数 2025-08-01 23:34:40 +08:00
102e84bc01 feat: 重构并扩展调用指令生成逻辑
- 优化了 syscall、数组下标访问和普通函数调用的处理逻辑
- 新增对多维数组下标访问的支持
- 改进了字符串常量和寄存器的绑定机制
- 统一了参数加载和错误处理的代码
2025-08-01 23:33:31 +08:00
e5f23b77bd chore: 添加 Demo19运行配置文件 2025-08-01 18:36:15 +08:00
028561fc4f test: 添加 Demo19 项目 2025-08-01 18:36:06 +08:00
82f4ba1a6e feat: 支持数组类型及数组字面量
- 新增 ArrayLiteralNode 表示数组字面量表达式节点
- 实现 ArrayLiteralAnalyzer 进行数组字面量的语义分析
- 添加 ArrayType 表示数组类型,并支持多维数组
- 修改 Context 类,增加对数组类型的支持
- 更新 DeclarationStatementParser,支持多维数组类型的声明
- 在 CallGenerator 中添加对特殊函数 __index_i 的处理,用于数组索引操作
2025-08-01 18:34:03 +08:00
f1069d6e5d
!52 release: 合并 v0.6.0 版本至 main 分支
Merge pull request !52 from Luke/release/v0.6.0
2025-07-31 09:53:38 +00:00
ad11efe974 chore: 更新项目版本至 v0.6.0 2025-07-31 17:29:11 +08:00
736e088a91
!51 feat: 支持模块内函数调用自动补全为当前模块前缀
Merge pull request !51 from Luke/bugfix/fix-function-call
2025-07-31 06:35:25 +00:00
d77368bb13 chore: 添加 Bug5 运行配置文件 2025-07-31 14:17:46 +08:00
e1a7f3310c test: 添加 Bug5 模块进行操作系统交互测试 2025-07-31 14:17:28 +08:00
b7e9c8121e refactor: 重构 RetCommand 并添加日志记录
- 更新导入语句,明确导入模块
- 使用 LoggingUtils 替代 System.out.println 输出日志
- 添加换行符改善日志可读性
2025-07-31 14:11:09 +08:00
466b6ca2be refactor: 移除 VMCodeGenerator 中的冗余字段
- 删除了 VMCodeGenerator 类中不再使用的 currentFn 字段- 将 currentFn 作为局部变量在 generate 方法中使用
- 这个改动简化了类的结构,减少了冗余代码
2025-07-31 12:48:10 +08:00
1cb5951e68 chore: 添加 Bug4 运行配置 2025-07-31 12:45:49 +08:00
1d73fc298e test: 添加 Bug4 测试用例 2025-07-31 12:44:33 +08:00
156f2b76c4 test: 修改 Demo14 中的打印函数 2025-07-31 12:44:05 +08:00
8e26b57cde test: 修改 Demo15 中的打印函数 2025-07-31 12:44:01 +08:00
be8e57ef60 test: 修改 Demo16 中的打印函数 2025-07-31 12:43:55 +08:00
2c3c4089f8 test: 修改 Demo17 中的打印函数 2025-07-31 12:43:48 +08:00
cadace165a feat: 改进函数调用和模块处理机制
- 补充模块名以生成全限定函数名,增强模块间调用的准确性
- 重构 IRProgramBuilder 以更清晰地处理模块和函数
- 优化 VMCodeGenerator 和 VMProgramBuilder 以支持新的全限定名机制
2025-07-31 12:43:17 +08:00
15cd43a7d5
!49 enhancement: 优化数字字面量溢出的错误检测与提示
Merge pull request !49 from Luke/bugfix/int-literal-range-diagnostic
2025-07-30 16:29:58 +00:00
f3409f32ce chore: 添加 Bug3 运行配置 2025-07-31 00:26:56 +08:00
1293ac1f83 refactor: 优化数字字面量的语义分析与错误提示
- 重构了类型推断逻辑,支持更精确的类型判断
- 实现了智能的错误提示策略,根据不同情况给出具体建议
- 优化了范围校验逻辑,提高了代码的健壮性
- 改进了代码结构和注释,提高了可读性和可维护性
2025-07-31 00:26:44 +08:00
9a2b5d5e4e test: 移除 Bug3测试中的溢出声明 2025-07-30 12:03:57 +08:00
fdeaa36366 feat: 增强数字字面量的语义分析和错误提示
- 添加类型推断和范围校验逻辑,支持 byte、short、int、long、float 和 double 类型
- 实现溢出和格式错误的统一处理,提供详细的错误提示
- 优化代码结构,增加私有方法以提高可读性和可维护性
2025-07-30 12:03:41 +08:00
3dfc8b63c8 test: 添加整数溢出测试用例 2025-07-30 11:54:34 +08:00
30fa84604b test: 重构 Bug2 示例程序 2025-07-30 11:50:58 +08:00
025ea75f08
!48 fix: 变量声明初始化寄存器别名导致内外层循环相互影响
Merge pull request !48 from Luke/bugfix/declare-init-aliasing-
2025-07-30 00:40:06 +00:00
c49b9f3df9
!47 feat: 引入了对 continue 语句的支持
Merge pull request !47 from Luke/feature/add-continue-operator
2025-07-30 00:39:58 +00:00
d932ba10f0 chore: 添加 Bug2 运行配置文件 2025-07-29 11:50:54 +08:00
f1699bfbbe test: 添加嵌套循环变量作用域测试代码 2025-07-29 11:50:32 +08:00
63835a1cce refactor: 优化变量声明语句的处理逻辑
- 澄清变量声明语句的处理流程,特别是带有初始值的情况
- 引入新分配的虚拟寄存器,确保变量和初始值表达式中的变量物理上独立
- 优化类型设置和作用域声明的顺序,提高代码的可读性和维护性
2025-07-29 11:50:06 +08:00
7c0a5e2524 docs: 优化 BreakStatementParser 类的文档注释 2025-07-29 11:23:01 +08:00
1eaaacdf8c chore: 添加 Demo18运行配置 2025-07-29 11:22:04 +08:00
2f16dd2749 test: 添加 Demo18 项目 2025-07-29 11:21:09 +08:00
7395256b5a feat: 添加 continue 语句支持
- 新增 ContinueNode、ContinueAnalyzer 和 ContinueStatementParser 类
- 在 AnalyzerRegistrar 中注册 continue 语句分析器
- 在 StatementBuilder 中添加 continue 语句的处理逻辑
- 更新 StatementParserFactory 和 TokenFactory 以支持 continue 关键字
2025-07-29 11:20:46 +08:00
187ec7e0e9 Merge branch 'main' into dev
# Conflicts:
#	.run/Demo1.run.xml
#	.run/Demo10.run.xml
#	.run/Demo11.run.xml
#	.run/Demo12.run.xml
#	.run/Demo13.run.xml
#	.run/Demo14.run.xml
#	.run/Demo2.run.xml
#	.run/Demo3.run.xml
#	.run/Demo4.run.xml
#	.run/Demo5.run.xml
#	.run/Demo6.run.xml
#	.run/Demo7.run.xml
#	.run/Demo8.run.xml
#	.run/Demo9.run.xml
#	src/main/java/org/jcnc/snow/pkg/tasks/CompileTask.java
2025-07-29 09:21:03 +08:00
c334dd3e28
!46 feat: loop 循环实现了 break 关键字的支持
Merge pull request !46 from Luke/feature/add-break-operator
2025-07-29 01:17:42 +00:00
5b15b2d170
!45 feat: 编译器补齐对 取模运算符 % 的完整支持
Merge pull request !45 from Luke/feature/add-mod-operator
2025-07-29 01:17:32 +00:00
21e4668b16 chore: 更新测试配置文件 2025-07-28 18:02:36 +08:00
5b8d7b98f3 chore: 更新 Demo16 和 Demo17 的运行配置 2025-07-28 18:01:41 +08:00
63e8b0163a test: 添加 Demo17 2025-07-28 18:01:06 +08:00
856d113b53 feat: 添加 break 语句支持
- 新增 BreakNode、BreakAnalyzer 和 BreakStatementParser 类
- 在 AnalyzerRegistrar 中注册 break 语句分析器
- 在 ASTPrinter 中添加 break 语句的打印处理
- 在 StatementBuilder 中实现 break 语句的 IR 构建逻辑
- 更新 StatementParserFactory 和 TokenFactory,支持 break 关键字
2025-07-28 18:00:41 +08:00
0cb2132e80 chore: 添加 Demo16运行配置 2025-07-28 17:35:49 +08:00
83b2122bd7 test: 添加 Demo16 2025-07-28 17:35:38 +08:00
9132c79c54 feat: 添加整数和浮点数的取余运算指令
- 在 IROpCode枚举中添加了 MOD_B8、MOD_S16、MOD_I32、MOD_L64、MOD_F32 和 MOD_D64 指令
- 更新了 IROpCodeMapper 映射,增加了取余运算的后端指令
- 修改了 IROpCodeMappings 类,添加了取余运算符与 IR 操作码的映射
2025-07-28 17:11:25 +08:00
12fc14e6e7
!44 feat: 实现 globals 关键字
Merge pull request !44 from Luke/feature/add-globals-keyword
2025-07-28 07:26:34 +00:00
52d811b6aa test: 更新 Demo15 文件 2025-07-28 15:25:09 +08:00
e0ad945202 test: 更新 Demo15 文件 2025-07-28 13:43:27 +08:00
2e4b76dfe2 chore: 更新测试配置文件
- 在测试配置文件中添加了 Demo14 和 Demo15 两个新的测试用例
2025-07-28 13:42:22 +08:00
9fb2dfae51 chore: 在 Demo 运行配置中添加 --debug 参数
- 在所有 Demo 示例的 run.xml 文件中添加 --debug 参数
- 此修改有助于在调试时提供更多详细信息
2025-07-28 13:39:55 +08:00
21ca6e6cab feat: 支持模块全局变量声明
- 在 ModuleNode 中添加 globals 字段,用于存储全局变量声明
- 实现 globals 区块的解析逻辑,支持全局变量的声明
- 更新 ASTJsonSerializer 以支持全局变量的序列化
- 修改 FunctionChecker 和 IRProgramBuilder 以支持全局变量
2025-07-28 13:39:33 +08:00
421eb0a0d9 chore: 修正 Debug 参数格式 2025-07-28 10:26:18 +08:00
f5a6443c8a refactor: 将调试标志从 -debug 改为 --debug 2025-07-28 10:25:13 +08:00
8d992001f9 chore: 添加 Demo15运行配置文件 2025-07-28 10:00:41 +08:00
4081d7d928 chore: 移除代码覆盖率配置 2025-07-28 10:00:30 +08:00
16a5d8d6ac test: 添加 Demo15 项目 2025-07-28 09:56:09 +08:00
9a4ebaadce
!43 release: 合并 v0.5.0 版本至 main 分支
Merge pull request !43 from Luke/release/v0.5.0
2025-07-24 14:33:19 +00:00
a86fb4826d docs: 更新操作码文档结构和内容
- 添加新的 Reference Control 分类
- 更新各分类的名称和描述,使其更加清晰
2025-07-24 13:31:34 +08:00
589b0a96b9 docs: 在 README 中添加支持我们的章节 2025-07-24 13:04:08 +08:00
f81dba0210 docs:优化 README 中语言特性描述
- 移除了代码关键字的 Markdown 格式加粗,保持一致性
2025-07-24 13:00:52 +08:00
688d6d7393 docs: 更新文档内容
- 移除加粗样式
- 更新 CLI 命令列表,增加 debug 命令
- 添加词法分析和语义分析的示例输出
- 调整编译流程和命令选项的描述
2025-07-24 12:59:26 +08:00
34e5de0454 chore: 在 Demo14运行配置中添加调试参数
- 在 Demo14.run.xml 文件中添加了 -debug 参数到 PROGRAM_PARAMETERS 选项
- 此修改便于在运行 Demo14 时进行调试
2025-07-24 12:45:01 +08:00
210fdb62f0 feat: 添加全局调试选项并更新相关功能
- 在 CLIUtils 中添加了全局调试标志集合,支持 "-debug" 和 "--debug" 选项
- 在 CompileTask 中更新了调试选项的处理逻辑,支持新的 "--debug" 标志
- 在 SnowCLI 中引入了 Mode 和 SnowConfig 类,以支持调试模式的配置
2025-07-24 12:36:56 +08:00
ebc322668e chore: 更新运行配置并添加新配置 2025-07-24 12:36:28 +08:00
4860aba07f chore: 更新项目版本至 v0.5.0
- 修改 pom.xml 中的版本号为 0.5.0
- 更新 README.md 中的版本徽章为 v0.5.0
- 在 issue 模板中更新软件版本选项,将 v0.4.2 替换为 v0.5.0
2025-07-24 11:32:51 +08:00
b826fc43aa chore:优化 Native Image 相关代码
- 移除 module-info.java 中对 org.graalvm.nativeimage 的直接引用
- 修改 VMUtils 中的 isNativeImage 方法,使用反射调用 ImageInfo
2025-07-24 11:23:55 +08:00
f777841937 chore: 更新运行配置并移除代码覆盖率设置
- 在所有 Demo 运行配置中添加 -debug 参数
- 移除所有 Demo 运行配置中的代码覆盖率设置
2025-07-24 11:13:41 +08:00
4ccff72a5b
!42 refactor: 重构虚拟机和编译器的调试输出逻辑并且增加debug参数
Merge pull request !42 from Luke/feature/add-debug-mod
2025-07-23 13:51:38 +00:00
e788e9c437
!41 feat: 核心引擎与标准库重构及功能增强
Merge pull request !41 from Luke/feature/add-naitve-print
2025-07-23 13:51:26 +00:00
1486a1e3a5 docs: 更新 LocalVariableStore 类的注释 2025-07-23 10:49:34 +08:00
80deaa9c4f feat: 添加对 GraalVM native-image 的支持
- 在 LocalVariableStore 中添加对 native-image环境的检测
- 在 VMUtils 中实现 isNativeImage 方法
- 更新 module-info.java,添加对 org.graalvm.nativeimage 的依赖
- 优化调试模式下的 UI 显示逻辑,避免在 native-image 环境中显示 Swing 窗口
2025-07-23 10:42:38 +08:00
ebb9524db0 refactor: 保留 cloud模式下的 "run" 和 "-debug" 标志 2025-07-23 10:24:49 +08:00
6f81feab3f refactor: 重构虚拟机和编译器的调试输出逻辑 2025-07-22 22:34:15 +08:00
da7fc0b046 feat: 添加全局配置和调试输出工具类
- 新增 SnowConfig 类,用于统一设置程序运行模式
- 提供调试模式下的日志输出方法
- 支持判断当前运行模式
2025-07-22 22:33:50 +08:00
0dbe39eff3 refactor: 重构枚举类并统一模式定义
- 新增 Mode 枚举类,用于统一定义程序的运行和调试模式- 删除 VMMode 枚举类,使用新的 Mode 枚举替代
- 通过重构简化代码结构,提高代码可维护性
2025-07-22 22:33:41 +08:00
1605390f08 fix: 修复函数末尾 CALL 指令的未解析符号问题
- 在函数开始时登记函数入口地址
- 在函数末尾强制添加 RET 或 HALT 指令
- 优化了代码注释和格式
2025-07-22 16:37:53 +08:00
70feb1fe5e style: 优化 RetCommand 类的输出格式 2025-07-22 16:36:23 +08:00
07b7d5c40e refactor: 优化程序终止和函数调用的输出格式
- 在 CallCommand 中添加换行符,改善函数调用的输出可读性
- 修改 HaltCommand 中的终止消息格式,提高信息的清晰度
2025-07-22 16:35:43 +08:00
6d79e28c51 refactor: 重构 SyscallCommand 类并优化文档注释- 重新组织类结构,优化代码布局
- 更新文档注释,使其更加清晰和详细
- 优化部分方法实现,提高可读性和可维护性
2025-07-21 23:42:03 +08:00
e84aedc100 test: 修改模块名称为小写 2025-07-21 23:13:50 +08:00
074f0b6809 chore: 添加库函数实现打印功能 2025-07-21 22:54:49 +08:00
a454eed26f test: 重构 Demo14 演示代码
- 移除了 Main.snow 文件中的直接系统调用
- 新增 OS.snow 文件,实现 print 函数封装
- 修改 Main.snow,使用新的 print 函数替代系统调用
2025-07-21 22:52:40 +08:00
b30b6aeaaa feat: 添加引用类型控制指令
- 新增 R_PUSH、R_LOAD 和 R_STORE 指令,用于处理对象引用类型
- 这些指令分别用于推送、加载和存储对象引用到操作栈或本地变量表
2025-07-21 17:26:42 +08:00
33d89e9908 feat: 添加 R_STORE指令的实现
- 新增 RStoreCommand 类,实现 Command接口
- 添加 R_STORE指令的执行逻辑
- 更新虚拟机的指令集,支持 R_STORE 指令
2025-07-21 17:24:57 +08:00
5ef36d5700 feat: 添加 R_PUSH指令类
- 新增 RPushCommand 类实现 Command 接口,用于处理引用类型推入操作
- 支持将字符串字面量等引用类型数据推入操作栈
2025-07-21 17:23:43 +08:00
a7117717bd refactor: 更新命令工厂中的引用命令路径
- 将 RLoadCommand、RPushCommand 和 RStoreCommand 的导入路径从 type.control.ref 改为 ref.control
- 这个改动统一了引用类型命令的包结构,与其他类型命令保持一致
2025-07-21 17:19:05 +08:00
6098a290b1 feat: 添加 R_LOAD指令的实现
- 新增 RLoadCommand 类,实现 Command接口
- 该指令用于从局部变量表中加载引用对象,并将其推入操作数栈- 指令格式:R_LOAD <slot>
- 其中 <slot> 是局部变量表中的索引
- 执行过程包括解析索引、获取引用、推入栈顶和更新程序计数器
2025-07-21 17:18:30 +08:00
e7c7451004 refactor: 重构 CallCommand 类并优化文档注释
- 重新组织类文档,增加对 CallCommand 功能和行为的详细描述
- 添加 execute 方法的详细注释,明确参数和返回值的用途
- 优化代码结构,提高可读性和可维护性
2025-07-21 17:17:10 +08:00
b4c933e3d4 test: 更新 Demo14 示例程序
- 修改导入模块,使用 os 模块替代 BuiltinUtils
- 更新 syscall 调用,增加表达式计算
2025-07-21 17:10:42 +08:00
8eeed6f6b9 refactor: 调整操作数栈打印格式
- 在操作数栈状态打印时,增加空行以提高可读性
2025-07-21 17:10:20 +08:00
6a339149f1 feat: 增强 LoadConstGenerator 功能并优化代码结构
- 优化类注释,明确类的功能和额外支持的特性
- 重构 generate 方法,提高代码可读性和维护性- 增加对字符串常量的处理,支持 syscall 降级场景
- 完善类型前缀处理,增加 'R' 前缀用于字符串常量
2025-07-21 17:09:26 +08:00
3aef7cd906 refactor: 重构 ExpressionBuilder 类
- 优化了代码结构,提高了代码的可读性和可维护性
- 添加了详细的注释,解释了各个方法的功能和实现细节
- 改进了对不同表达式类型的处理逻辑,增强了表达式构建的能力
- 优化了寄存器的使用和管理,提高了 IR 指令生成的效率
2025-07-21 17:06:40 +08:00
970976ecc5 feat: 添加 VM退出时的提示信息
- 在 VMLauncher 启动后增加提示信息 "=== Launching VM ==="
- 在 VM 退出后增加提示信息 "=== VM exited ==="
2025-07-21 16:57:50 +08:00
7a52c7dd78 feat: 支持 syscall 调用的 VM指令生成
- 新增对 syscall 调用的特殊处理逻辑
- 支持 IRConstant 直接字面量和虚拟寄存器绑定的字符串常量作为 syscall 子命令
- 实现了 syscall 调用中参数压栈和 SYSCALL指令生成的逻辑
-优化了普通函数调用的指令生成流程
2025-07-21 16:56:18 +08:00
fec9fe3527 refactor: 重构 BuiltinTypeRegistry 类并优化文档注释
- 重新整理基础类型表,添加 boolean 类型
- 优化文档注释,增加类和方法的详细描述
- 改进代码结构,提高可读性和可维护性
2025-07-21 16:51:30 +08:00
2cb428ed9b feat: 新增引用控制命令
- 添加 RPushCommand、RLoadCommand 和 RStoreCommand 三个引用控制命令类
- 在 CommandFactory 中注册这三个命令
2025-07-21 16:48:50 +08:00
c6067a8758 feat: 增加引用类型常量支持并优化反码映射
- 在 OPCODE_MAP 中添加 R_PUSH、R_LOAD 和 R_STORE 指令- 优化反码映射逻辑,支持十六进制表示的指令码
- 在 getConstType 方法中增加对 String 类型的支持
2025-07-21 16:46:34 +08:00
3aa38027c8 feat: 添加对字符串字面量的支持
- 在 ExpressionBuilder 类中增加了处理字符串字面量的逻辑
- 新增 buildStringLiteral 方法用于生成字符串常量寄存器
- 更新了 build 方法的 switch 语句,支持 StringLiteralNode 类型
- 优化了代码结构,提高了可读性和可维护性
2025-07-20 20:45:17 +08:00
b8c57b6c49 test: 修改示例代码 2025-07-20 20:15:07 +08:00
b332c76ef8 feat: 增加自动导入模块函数调用支持
- 实现了在当前模块未找到目标函数时,自动遍历所有已导入模块寻找唯一同名函数的功能
- 如果多个导入模块含有同名函数,会报错提示函数调用不明确
- 这个改动扩展了函数调用的范围,提高了代码的灵活性和可复用性
2025-07-20 20:14:52 +08:00
983a287c42 refactor: 更新 BuiltinUtils 中 syscall 函数的参数类型
- 移除了 BuiltinUtils 中的 print 和 println函数
- 将 syscall 函数的第二个参数类型从 STRING 改为 INT
2025-07-20 20:14:12 +08:00
72982c1127 chore: 添加 Demo14运行配置 2025-07-20 18:48:54 +08:00
64cefebee5 feat: 实现 BuiltinUtils 标准库并更新相关机制
- 重构 BuiltinTypeRegistry 类,扩展内置类型和模块的注册功能
- 新增 BuiltinUtils 标准库模块,提供 print 和 println 函数
- 实现 syscall 内核函数,供 BuiltinUtils 内部使用
- 更新测试用例,添加 Demo14 项目以验证新功能
2025-07-19 17:04:49 +08:00
4e3de185b8 refactor:重构 PRINT 和 PRINTLN 功能并优化输出方法
- 重构了 PRINT 和 PRINTLN 指令的实现,支持更多数据类型输出
- 新增通用的 output辅助方法,统一处理各种类型的输出
- 扩展了输出功能,支持基本类型、数组和任意对象的打印
- 优化了代码结构,提高了可读性和可维护性
2025-07-19 00:09:17 +08:00
8ec5120e54 docs: 更新子命令支持状态
- 移除 PRINT / PRINTLN 命令的 TODO 注释
- 修正其它自定义 syscall 子命令的 TODO 注释
2025-07-18 23:33:13 +08:00
dad69eabfb feat(vm): 实现 UNIX风格的文件描述符 I/O 操作
- 新增 FDTable 类,用于管理文件描述符和 NIO Channel 的映射
- 重构 SyscallCommand 类,实现多个 I/O 相关的 syscall 子命令
- 支持文件操作(open、close、read、write、seek)、管道、网络套接字、I/O 多路复用等功能
- 优化异常处理机制,统一处理 syscall内部异常
2025-07-18 18:06:19 +08:00
6f21cec444
!40 refactor: 优化和重构字符串扫描器,完善词法分析功能
Merge pull request !40 from Luke/feature/optimize-lexical-error-messages
2025-07-18 03:41:42 +00:00
c388edd0cf Merge branch 'feature/optimize-lexical-error-messages' into feature/add-naitve-print 2025-07-18 11:40:56 +08:00
zhangxun
6fb24f3f2f test: 修改 Demo13 以支持新版语法(移除对字面量 D 的支持) 2025-07-18 11:17:00 +08:00
zhangxun
3dd06261e2 refactor: 移除对浮点数字面量后缀 D 的支持 2025-07-18 11:15:35 +08:00
zhangxun
901d2f842a fix: 数值字面量后紧挨着标识符时,报错信息输出完整标识符 2025-07-18 11:03:21 +08:00
zhangxun
e2d4f97d75 docs: 移除默认整数和浮点数的后缀 2025-07-18 10:43:55 +08:00
zhangxun
f44fc18c52
docs: Snow-Lang 语法规范不能跳转的问题 2025-07-18 02:36:32 +00:00
08cfc1ffb9 test: 修改 Bug1 2025-07-17 17:06:39 +08:00
59aef0c661 feat: 添加 SYSCALL 操作码的详细注释并移除未使用的 DEBUG_TRAP 操作码
- 为 SYSCALL 操作码添加了详细的注释,说明了其执行步骤和实现类- 注释掉了未使用的 DEBUG_TRAP 操作码
- 引入了 SyscallCommand 类以实现 SYSCALL 操作码的功能
2025-07-17 17:05:48 +08:00
23c6de3601 feat: 添加 SyscallCommand 类实现系统调用功能
- 新增 SyscallCommand 类,用于处理系统调用命令(opcode =0x0401)
2025-07-17 17:04:38 +08:00
bf9190dec6 refactor: 移除调试用指令 DEBUG_TRAP
移除了 OpHelper 类中 DEBUG_TRAP 指令的映射,以减少不必要的代码。这个修改对现有的功能没有影响,只是为了简化代码结构。
2025-07-17 17:04:12 +08:00
3758e3da40 feat: 添加 SyscallCommand 实现
- 在 CommandFactory 中为 VMOpCode.SYSCALL 添加了 SyscallCommand 实现
- 解除了对 SYSCALL 命令的注释,使其可以被使用
2025-07-17 17:03:49 +08:00
bfcfcbb107 refactor: 优化字符串扫描器代码
- 移除了类 StringTokenScanner 中的作者和年份信息
- 删除了冗余的代码注释,提高了代码的可读性和维护性
2025-07-17 15:25:25 +08:00
e6ad4ff282 refactor: 重构字符串扫描器实现
- 优化了 StringTokenScanner 类的文档注释,增加了状态机说明
-重新组织了代码结构,提高了可读性和可维护性
- 添加了对未闭合字符串的处理逻辑,增强了健壮性
- 优化了状态机实现,保证了字符串解析的准确性
2025-07-17 15:24:46 +08:00
5f0931155d Merge remote-tracking branch 'gitee/feature/optimize-lexical-error-messages' into feature/optimize-lexical-error-messages 2025-07-17 15:23:46 +08:00
e4c6faf923 docs: 更新构造函数重载示例
- 删除了示例代码中的多余空行
- 修正了示例代码的格式问题
2025-07-17 15:22:58 +08:00
593930ccfc docs: 更新 Snow-Lang 语法规范文档链接
- 移除了文档链接末尾的 ".md" 后缀
- 统一文档链接格式,与其他文档链接保持一致
2025-07-17 15:22:58 +08:00
7f09b0e501 refactor: 移除 OperatorTokenScanner 中的冗余状态管理
- 删除了未使用的 State 枚举类
- 移除了冗余的 currentState 变量和相关逻辑
- 简化了代码结构,提高了代码可读性
2025-07-17 15:22:57 +08:00
9acb52a7e1 docs: 更新构造函数重载示例
- 删除了示例代码中的多余空行
- 修正了示例代码的格式问题
2025-07-17 15:22:15 +08:00
5c6f61f25a docs: 更新 Snow-Lang 语法规范文档链接
- 移除了文档链接末尾的 ".md" 后缀
- 统一文档链接格式,与其他文档链接保持一致
2025-07-17 15:09:48 +08:00
f185b12620 refactor(compiler): 移除 OperatorTokenScanner 中的冗余状态管理
- 删除了未使用的 State 枚举类
- 移除了冗余的 currentState 变量和相关逻辑
- 简化了代码结构,提高了代码可读性
2025-07-17 15:09:02 +08:00
d0e8cee6bd feat: 支持数字字面量中的下划线分隔符
- 增加了对数字中下划线的处理逻辑
- 添加了防止下划线连续出现、以下划线开头或结尾的校验
- 优化了小数部分的下划线检查
- 修复了数字后紧跟下划线的错误处理
- 最后返回的数字字面量中将移除所有的下划线
2025-07-17 11:47:19 +08:00
ac5b73e320 feat: 适配 Windows 换行符
- 修改 NewlineTokenScanner 以支持 \r\n 换行符
- 增加对 \r 换行符的处理
- 优化 scanToken 方法,兼容不同操作系统换行符
2025-07-17 11:27:03 +08:00
69b4a418ba refactor: 优化词法分析器引擎代码
- 格式化代码,提高可读性
- 修改错误消息构造方式,简化为接收完整消息字符串- 更新注释,准备后续具体功能改动
2025-07-17 11:18:35 +08:00
2093201173 test: 修改为最新的bug 2025-07-17 00:04:16 +08:00
268f1aa09a refactor: 简化词法异常错误信息
- 移除了错误信息中的"词法错误:"前缀,使信息更加简洁
- 保留了非法字符序列和位置信息,确保错误定位准确
2025-07-16 23:52:22 +08:00
cc106f57e1 refactor: 优化编译流程,词法分析有错误时立即终止
- 在语法分析之前增加对词法分析错误的检查
- 若词法阶段存在错误,立即终止编译,避免进入后续的语法及语义分析
- 这种优化可以减少不必要的计算,提高编译效率
2025-07-16 23:37:15 +08:00
93a553ea93 fix: 修复数字和标识符区分错误
- 新增 skipInvalidLexeme 方法,用于跳过无效的标识符和数字字符
- 修改错误处理逻辑,遇到词法错误时调用 skipInvalidLexeme 方法
2025-07-16 23:16:12 +08:00
f23e15339c refactor: 删除了 LexicalException 类中的冗余空行 2025-07-16 22:21:56 +08:00
2be4848735 refactor: 移除词法分析中的异常抛出 2025-07-16 22:21:41 +08:00
c4d9be8403 fix: 修复数字字面量解析中的错误处理
- 增加对数字后紧跟未知标识符的错误处理
- 增加对数字后紧跟下划线的错误处理
- 优化数字类型后缀的处理逻辑,防止多字符后缀
2025-07-16 22:14:40 +08:00
4a26bd50ca refactor: 优化词法分析错误输出格式
-将错误信息前的缩进从两个空格改为一个制表符,提高可读性
2025-07-16 21:34:11 +08:00
e931d9ec06 style:优化代码格式和注释 2025-07-16 21:31:07 +08:00
f540d7fad5 refactor: 移除词法异常中的错误消息 2025-07-16 18:00:38 +08:00
3d35e81a97 refactor: 优化词法错误异常信息格式
- 修改了 LexicalException 类中错误信息的显示格式
- 新格式:文件名 + "行 " +行号 + ", 列 " + 列号 + ": " +错误类型 + ": " +详细信息
- 旧格式:文件名 + ":" + 行号 + ":" + 列号 + ": " + 错误类型 + " '" + 详细信息 + "'"
2025-07-16 11:26:12 +08:00
f6382c4ccd refactor(compiler): 修改词法错误信息为中文
- 将 LexicalException 类中的英文错误信息改为中文
- 例:将 "Lexical error: Illegal character sequence '@' at 2:19" 改为 "词法错误:非法字符序列 '@' at2:19"
2025-07-16 10:57:44 +08:00
cd64137148 refactor: 优化词法异常的错误信息提示
- 将英文错误信息改为中文,提高用户的可读性和理解度
2025-07-16 10:57:29 +08:00
eae66eac8c docs: 优化 LexicalError 类的文档注释
- 为 LexicalError 类添加详细的类文档注释,说明其用途
- 为所有字段和构造方法添加规范的参数注释
- 优化 toString 方法的注释,明确其返回值内容
2025-07-16 10:57:13 +08:00
85d3b129ae
!39 refactor: 重构循环语句解析器
Merge pull request !39 from Luke/feature/optimize-the-loop
2025-07-16 02:15:15 +00:00
zhangxun
3b168a134a fix: 对齐 ASTPrinter 中 loop 的输出(cond 和 step) 2025-07-16 09:23:49 +08:00
zhangxun
59fdc6b39e docs: 对齐注释 2025-07-16 09:22:26 +08:00
2a31d57a53 chore: 删除规则文件说明 2025-07-15 22:18:35 +08:00
8f96716ac4 docs:优化数值类型和字面量表格的 Markdown 格式
- 调整数值类型表格的格式,使其更加简洁易读
- 优化字面量后缀表格的布局,提高可读性
- 统一表格样式,去掉多余的空格和竖线
2025-07-15 00:03:34 +08:00
d8e3fb6e9c Merge remote-tracking branch 'origin/feature/optimize-the-loop' into feature/optimize-the-loop 2025-07-14 23:52:47 +08:00
536ee64f6d refactor: 修改保留关键字并使用缩写
- 更新保留关键字集合,将 'initializer'缩写为 'init','condition' 缩写为 'cond','update' 缩写为 'step'
2025-07-14 23:52:29 +08:00
054ab5d63d refactor: 重构 SnowExample 中的循环结构
- 将 loop 节点下的子节点名称从 initializer 改为 init
- 将 loop 节点下的子节点名称从 condition改为 cond
- 将 loop 节点下的子节点名称从 update 改为 step
2025-07-14 23:52:29 +08:00
d2732857f1 refactor: 重构 SnowExample 中的循环结构
- 将 loop 节点下的子节点名称从 initializer 改为 init
- 将 loop 节点下的子节点名称从 condition改为 cond
- 将 loop 节点下的子节点名称从 update 改为 step
2025-07-14 23:52:29 +08:00
fb1c54998b refactor: 重构循环语句解析器
- 简化了循环语句各区块的名称,提高代码可读性
- 更新了代码注释,使其与新的区块名称保持一致- 修改了变量命名,以更好地反映其对应的循环语句部分- 优化了代码结构,提高了维护性和可扩展性
2025-07-14 23:52:29 +08:00
2c4850cc8f refactor: 重构 LoopNode 类的参数名称
- 将 initializer 参数重命名为 init
- 将 condition 参数重命名为 cond- 将 update 参数重命名为 step
2025-07-14 23:52:29 +08:00
b135a4b37b refactor: 重构循环语句分析逻辑
- 修改初始化语句、条件表达式和更新语句的分析方法
- 优化代码结构,提高可读性和可维护性
- 适应新的语法树节点命名
2025-07-14 23:52:29 +08:00
d92e3d0e17 refactor: 更新 matchHeader 函数参数注释
- 将关键字参数注释中的 "initializer" 改为 "init",以匹配实际代码中的使用
2025-07-14 23:52:29 +08:00
bc309dfa97 refactor: 重构 ASTPrinter 类中的代码
- 修改了 IfNode 和 LoopNode 的打印逻辑
- 优化了变量命名,提高了代码可读性
- 调整了缩进和格式,保持代码风格一致性
2025-07-14 23:52:29 +08:00
1141abf231 refactor: 重构循环语句节点的序列化逻辑
- 修改 Declaration 节点中的 initializer 字段名称为 init
- 修改 If 节点中的 condition 字段名称为 cond
- 修改 Loop 节点中 initializer、condition 和 update 字段名称分别为 init、cond 和 step
2025-07-14 23:52:29 +08:00
e2896eb37d docs: 重构循环和条件语句的命名
- 将 loop 语句中的 initializer 改为 init
- 将 condition 改为 cond
- 将 update 改为 step
- 更新了相关文档和示例代码
2025-07-14 23:46:51 +08:00
e18d7426bc refactor: 重构死循环测试用例
- 将 initializer 改为 init
- 将 condition 改为 cond
- 将 update 改为 step
2025-07-14 23:46:51 +08:00
c1d0e03b6c docs: 更新语法规范并添加项目规则说明
- 更新 Snow 语言语法规范,调整错误分类表格格式和示例代码结构
2025-07-14 23:46:50 +08:00
d2a6bde8cd docs: 更新语法规范并添加项目规则说明
- 更新 Snow 语言语法规范,调整错误分类表格格式和示例代码结构
2025-07-14 23:03:09 +08:00
f820b9e9c0 docs: 添加 Snow-Lang 语法规范文档
- 新增 Snow-Lang 语法规范文档,详细定义了语言的词汇结构、语句、类型系统等
- 在 README.md 中添加了新文档的链接
- 重命名了原有的 Snow-Lang 语法文档为 Snow-Lang 指南
2025-07-14 16:42:09 +08:00
3e59529666
!38 release: 合并 v0.4.2 版本至 main 分支
Merge pull request !38 from Luke/release/v0.4.2
2025-07-11 09:30:48 +00:00
bc679d9b90 chore: 更新项目版本至 v0.4.2 2025-07-11 17:00:42 +08:00
7310884047
!37 fix: 优化函数调用指令以支持 void 类型
Merge pull request !37 from Luke/bugfix/fix-error-empty-function
2025-07-11 08:02:35 +00:00
zhangxun
da997a54c7 docs: 修改注释 2025-07-11 15:36:47 +08:00
d8c329ac94 refactor: 优化 CallInstruction 类设计与实现
-优化类文档注释,增加对 void 返回值的说明
- 添加 isVoidReturn() 方法判断函数是否返回 void
- 修改 toString() 方法,根据返回值类型调整输出格式
- 调整 operands() 方法,void 调用不包含 dest
- 优化部分代码结构,提高可读性
2025-07-11 13:56:25 +08:00
cf3e645845 chore: 更新 Demo11 运行配置 2025-07-11 13:53:03 +08:00
30573a4e45
!32 feat: 补充基本数值类型转换指令
Merge pull request !32 from zhangxun/feature/full-type-conversion-support
2025-07-11 02:37:18 +00:00
93f65585e0 docs: 完善 L2I 指令的注释说明 2025-07-11 10:33:46 +08:00
68c1e3a412 chore: 更新测试运行配置
- 添加 Demo11 和 Demo12 应用到测试运行列表- 现有应用顺序不变,新增应用放在末尾
2025-07-11 10:29:32 +08:00
aa96fc89ab docs: 统一优化类型转换注释消除歧义 2025-07-11 10:25:52 +08:00
58a2c88b2b docs: 统一优化类型转换注释消除歧义 2025-07-11 10:21:33 +08:00
e7d7e7f96f docs: 优化 ExpressionUtils 的代码注释 2025-07-11 10:04:15 +08:00
099f4f934c docs: 优化 TypePromoteUtils 的代码注释 2025-07-11 10:00:23 +08:00
81ca858cc1 docs: 优化 ComparisonUtils 的代码注释 2025-07-11 10:00:11 +08:00
82069629dd docs: 优化 CmpJumpGenerator 的代码注释
- 移除了类注释中的多余空行和标点符号
- 调整了代码缩进,保持一致性
- 删除了不必要的注释,使代码更清晰
2025-07-11 09:59:40 +08:00
5177d00dce refactor: 优化比较操作的错误提示信息 2025-07-11 09:47:31 +08:00
bba560a468
!36 fix: 函数参数重名
Merge pull request !36 from zhangxun/bugfix/parameter-duplication
2025-07-10 14:41:27 +00:00
bf1ab316fc docs: 增加 FunctionParser 注释 2025-07-10 22:38:46 +08:00
adc8b6a3a7
!35 docs: 增加 Snow-Lang 语法文档
Merge pull request !35 from zhangxun/feature/snow-lang-syntax-documentation
2025-07-10 14:13:45 +00:00
zhangxun
e881bffe85 fix: 函数参数重名 2025-07-10 21:08:10 +08:00
zhangxun
69d6617855 docs: 修改 README 2025-07-10 20:50:19 +08:00
zhangxun
1230e63923 docs: 增加 Snow-Lang-Syntax 文档 2025-07-10 20:47:56 +08:00
zhangxun
e33ad15475 chore: 增加 Demo13 2025-07-10 19:18:19 +08:00
zhangxun
a69cbb868a feat: 基本类型全类型比较支持 2025-07-10 19:14:37 +08:00
zhangxun
9d21eeace9 fix: 修正 CmpJumpGenerator 部分逻辑,向新 VMOpCode 对齐 2025-07-10 17:44:28 +08:00
e82bac7046 docs: 为类和方法添加详细的 JavaDoc 注释,解释其用途和使用方式 2025-07-10 17:44:04 +08:00
zhangxun
61a2fda6fa feat: 增加 IR 对类型转换指令的支持 2025-07-10 17:32:40 +08:00
zhangxun
e66a5a3078 refactor: 重复的类型提升逻辑提取到 TypePromoteUtils 工具类 2025-07-10 17:31:44 +08:00
zhangxun
609e380664 refactor: 同步 VMOpCode 指令到 OpHelper 中 2025-07-10 17:13:16 +08:00
zhangxun
e0fda2e104 Merge remote-tracking branch 'refs/remotes/origin/dev' into feature/full-type-conversion-support 2025-07-10 16:53:02 +08:00
55c7bae77c chore: 删除无用的 README.md 2025-07-10 16:29:34 +08:00
304d3e1c0e test: 更新 Bug1 代码示例 2025-07-10 16:29:13 +08:00
3e8b3f7629 fix: 优化函数调用指令生成逻辑
- 新增 GlobalFunctionTable 工具类,用于记录函数返回类型
- 修改 CallGenerator 以利用 GlobalFunctionTable 判断是否需要保存返回值
- 更新 FunctionBuilder,在构建函数 IR 时注册函数返回类型- 调整测试用例,将 foo 函数返回类型改为 void
2025-07-10 16:28:45 +08:00
zhangxun
9cfd3ba29a docs: 补充 byte8 转换指令的文档 2025-07-10 16:26:06 +08:00
zhangxun
f6780194a5 docs: 补充 short16 转换指令的文档 2025-07-10 16:19:27 +08:00
zhangxun
c5810bce7b docs: 修正 double64 转换指令的文档 2025-07-10 16:11:41 +08:00
zhangxun
cd61fdf295 docs: 补充 float32 转换指令的文档 2025-07-10 16:10:35 +08:00
zhangxun
efc88b33e3 docs: 补充 double64 转换指令的文档 2025-07-10 16:08:21 +08:00
zhangxun
9026b2deb3 docs: 补充 long64 转换指令的文档 2025-07-10 16:04:35 +08:00
zhangxun
bbb908428e Merge remote-tracking branch 'origin/feature/full-type-conversion-support' into feature/full-type-conversion-support 2025-07-10 15:53:48 +08:00
565cc79329
!34 fix: 空函数不生成代码的问题
Merge pull request !34 from zhangxun/bugfix/empty-main-function
2025-07-10 07:39:33 +00:00
zhangxun
9f6a1edccb fix: 空函数不生成代码的问题 2025-07-10 15:00:41 +08:00
d9b3593e9b
!33 fix: 在非 void 函数中强制使用 return 语句
Merge pull request !33 from Luke/bugfix/missing-return-check
2025-07-10 04:19:39 +00:00
34247fb70d chore: 移动 Demo 文件到 Demo文件夹 2025-07-10 11:46:07 +08:00
7f074cb798 test: 更新 Bug1 测试用例 2025-07-10 11:45:37 +08:00
e1f36d9689 chore: 更新 Demo 运行配置路径
- 修改了多个 Demo 运行配置文件中的程序参数,将示例代码路径从根目录下的 playground 子目录移动到 playground/Demo 子目录- 新增 Demo12 运行配置文件,使用更新后的路径格式
2025-07-10 11:45:05 +08:00
230d0d21a5 Merge remote-tracking branch 'gitee/bugfix/missing-return-check' into bugfix/missing-return-check 2025-07-10 11:34:41 +08:00
43aa055d7d test: 添加 Demo12 主程序文件
- 新建 Main.snow 文件,实现了一个简单的主程序
- 包含两个函数:main 和 foo
- main函数中调用了 foo 函数- foo 函数中包含一个无效的 if 语句,始终返回 0
2025-07-10 11:34:31 +08:00
zhangxun
4f63f88b40 feat: 补充基本数值类型转换指令 2025-07-10 03:14:58 +00:00
zhangxun
f382b2bc54 style: 统一代码实现 2025-07-10 03:14:58 +00:00
zhangxun
872865268b docs: 修改拼写错误 2025-07-10 03:14:58 +00:00
zhangxun
9c69c1f37b feat: 支持 long64 转 byte8、short16 2025-07-10 03:14:58 +00:00
zhangxun
85fae69c97 feat: 支持 float32 转 byte8、short16 2025-07-10 03:14:58 +00:00
zhangxun
4595583ca4 feat: 支持 double64 转 byte8、short16 2025-07-10 03:14:58 +00:00
zhangxun
9e2eb6731f feat: 支持 short16 转 byte8、long64、float32、double64 2025-07-10 03:14:58 +00:00
zhangxun
2289cf3ee4 feat: 支持 byte8 转 short16、long64、float32、double64 2025-07-10 03:14:58 +00:00
c83a584795 fix: 在非 void 函数中强制使用 return 语句
在 FunctionChecker 中添加一个检查,以确保具有非 void 返回类型的功能
类型必须至少包含一个返回节点。否则将引发语义错误。
2025-07-10 03:14:42 +00:00
zhangxun
2a25abcf03 refactor: OpHelper.java 2025-07-10 03:14:42 +00:00
45eed2aefc refactor: 重构 AST节点中的位置信息表示方式
- 引入 NodeContext 类统一表示节点的上下文信息(行号、列号、文件名)
- 修改相关 AST 节点的构造函数,使用 NodeContext 替代单独的行号、列号和文件名参数
- 更新解析器代码,创建 NodeContext 实例以传递给 AST节点
- 此重构简化了 AST 节点的参数列表,提高了代码的可维护性和可读性
2025-07-10 03:14:42 +00:00
zhangxun
65b12ddd4c refactor: OpHelper.java 2025-07-10 03:14:10 +00:00
aefa9e2dff refactor: 重构 AST节点中的位置信息表示方式
- 引入 NodeContext 类统一表示节点的上下文信息(行号、列号、文件名)
- 修改相关 AST 节点的构造函数,使用 NodeContext 替代单独的行号、列号和文件名参数
- 更新解析器代码,创建 NodeContext 实例以传递给 AST节点
- 此重构简化了 AST 节点的参数列表,提高了代码的可维护性和可读性
2025-07-10 03:14:10 +00:00
ae0baf3e50 docs: 添加项目声明文件并更新 README
- 新增 NOTICE 文件,包含项目版权、许可信息和贡献者致谢
- 在 README.md 中添加项目仓库地址
2025-07-10 10:55:46 +08:00
439b2fbc1e
update LICENSE.
Signed-off-by: Luke <luke.k.xu@hotmail.com>
2025-07-10 02:47:46 +00:00
f4d96cfa53 fix: 在非 void 函数中强制使用 return 语句
在 FunctionChecker 中添加一个检查,以确保具有非 void 返回类型的功能
类型必须至少包含一个返回节点。否则将引发语义错误。
2025-07-09 23:59:13 +08:00
zhangxun
fabde0026f feat: 补充基本数值类型转换指令 2025-07-08 20:19:45 +08:00
50c778b9b1
!31 refactor: OpHelper.java
Merge pull request !31 from zhangxun/feature/optimize-redundant-code
2025-07-08 08:52:59 +00:00
47b3e994d1
!30 refactor: 重构 AST节点中的位置信息表示方式
Merge pull request !30 from Luke/feature/unify-ast-location
2025-07-08 06:25:03 +00:00
840ac25e8a refactor: 重构 AST节点中的位置信息表示方式
- 引入 NodeContext 类统一表示节点的上下文信息(行号、列号、文件名)
- 修改相关 AST 节点的构造函数,使用 NodeContext 替代单独的行号、列号和文件名参数
- 更新解析器代码,创建 NodeContext 实例以传递给 AST节点
- 此重构简化了 AST 节点的参数列表,提高了代码的可维护性和可读性
2025-07-08 12:39:15 +08:00
84a6b2701c
!25 fix: AOT 编译后无法定位语义错误
Merge pull request !25 from zhangxun/bugfix/aot-semantic-error-unknown-location
2025-07-08 02:35:36 +00:00
46e913a37b Merge branch 'dev' into bugfix/aot-semantic-error-unknown-location 2025-07-07 11:16:12 +08:00
53fafabb1a
!24 bug: 修复编译死循环
Merge pull request !24 from Luke/bugfix/parser-endless-loop
2025-07-07 03:15:06 +00:00
506bf193d5 chore: 修改IDEA配置让.water输出到target目录后不污染根目录 2025-07-07 00:26:36 +08:00
0ea8cb352d refactor: 重构数字字面量扫描逻辑
- 优化了 NumberTokenScanner 类的代码结构
- 改进了数字字面量的扫描逻辑,包括整数和小数部分
- 调整了后缀和非法字符的检查策略
- 优化了错误处理和异常抛出的逻辑
- 移除了未使用的代码和不必要的注释
2025-07-07 00:02:31 +08:00
cb208bb8af test: 修改为最新测试代码 2025-07-06 23:57:58 +08:00
e11d519627 refactor: 重构语法分析模块并优化错误处理机制
- 优化了 ExpressionStatementParser、FlexibleSectionParser 和 JSONParser 的代码结构
- 改进了模块解析器 (ModuleParser) 的实现
- 重构了语法异常 (ParseException) 类,增加了错误位置信息
- 新增 ParseError 类用于收集和展示语法错误信息
- 改进了同步机制以更好地恢复解析过程
2025-07-05 17:02:45 +08:00
e33f6b0ce2 fix: 修复数字后空格后接上非法后缀进入死循环的错误 2025-07-05 14:20:43 +08:00
00afda56bb
!26 fix: CleanTask 将 build 目录删除导致无法将字节码写入目标文件
Merge pull request !26 from zhangxun/bugfix/cli-clean-and-compile-run
2025-07-05 02:55:17 +00:00
zhangxun
699bc2721e docs: 优化方法文档的主描述部分,以更好地显示参数名 2025-07-05 10:41:21 +08:00
zhangxun
a1b92f0cc8 style: 移除没必要的局部变量 2025-07-05 10:37:28 +08:00
zhangxun
3c43e31afb refactor: 优化 clean 命令的逻辑,使其符合直觉 2025-07-05 10:35:33 +08:00
169523bc33 style: 修改代码缩进 2025-07-04 23:58:58 +08:00
b626208771 chore: 增加测试配置文件 2025-07-03 23:51:00 +08:00
f1086a1ef9 feat: 统一 parser 的异常 2025-07-03 23:49:26 +08:00
b730b53f7b style: 修复代码缩进异常 2025-07-03 21:56:33 +08:00
zhangxun
a6c251c8da fix: CleanTask 将 build 目录删除导致无法将字节码写入目标文件 2025-07-02 22:43:09 +08:00
zhangxun
55ab421d88 fix: AOT 编译后无法定位语义错误 2025-07-02 22:10:16 +08:00
bb4c4f6ce4 feat: StringTokenScanner 重构为状态机 2025-07-01 17:17:23 +08:00
367ae8653e feat: OperatorTokenScanner 重构为状态机 2025-07-01 17:14:40 +08:00
dbc3ea0a33 feat: NewlineTokenScanner 重构为状态机 2025-07-01 17:10:11 +08:00
51f5ba9884 test: 更新demo11 2025-07-01 17:09:52 +08:00
e83244df61 feat: LexerEngine 增加后置整体校验 2025-07-01 17:02:35 +08:00
b43245b1f5 refactor: IdentifierTokenScanner 重构为状态机 2025-07-01 17:02:01 +08:00
ded31578d7 refactor: CommentTokenScanner 重构为状态机 2025-07-01 14:52:33 +08:00
114958d992 chore: IDEA 配置文件修改,让.water文件进入target文件夹 2025-07-01 11:28:42 +08:00
3bff750fc9 fix: NumberTokenScanner.java 中修复了 “数字字面量与类型后缀之间不允许有空白符” 的误判逻辑 2025-07-01 11:17:49 +08:00
0a218f995e fix: 修复循环条件 2025-07-01 11:07:30 +08:00
7b9bd37900 feat: 支持行内注释 2025-07-01 10:45:56 +08:00
4507e3589f fix: NumberTokenScanner 移除数字字面量后直接跟 / 的规则 2025-07-01 09:55:21 +08:00
6ae6d6e893 chore: IDEA 点击运行后"Run tool 窗口"会出现 2025-07-01 09:34:38 +08:00
c88404fada refactor: 重构为基于有限状态机(FSM)的注释解析器 2025-07-01 00:15:14 +08:00
30b89c0f3d fix: 统一哨兵值 2025-06-30 23:42:52 +08:00
2a085f6906 docs: 修复注释格式 2025-06-30 23:42:34 +08:00
f4568f82a4 fix: 编译遇到词法错误立即终止 2025-06-30 23:42:14 +08:00
e9939e73c1 fix: 删除 LexerEngine.java 的冗余代码 2025-06-30 17:54:30 +08:00
f9a65531c1 refactor: 重构为基于有限状态机(FSM)的数字字面量解析器 2025-06-30 17:52:37 +08:00
ce4106743a docs: 完善 LexerEngine.java 的注释 2025-06-30 17:51:01 +08:00
67d2b58231 feat: 默认启动报告 2025-06-30 16:52:53 +08:00
dc32f00ead test: 修复 demo1 2025-06-30 16:21:48 +08:00
3eacdf6d39 fix: 数字字面量与位宽符号之间不允许有空白符 2025-06-30 16:21:01 +08:00
6a247f456c feat: NumberTokenScanner 增加规则约束 2025-06-29 23:56:21 +08:00
cb4faf0632 chore: 增加 Bug1 配置文件 2025-06-29 18:28:43 +08:00
5e0d31f3ad test: 增加 Bug1 至 BugFarm 2025-06-29 18:24:34 +08:00
0d8e26d2cc chore: 增加 Demo11 配置文件 2025-06-29 18:23:58 +08:00
zhangxun
eee77ea451 style: 统一代码实现 2025-06-28 21:08:49 +08:00
zhangxun
3466c27c9e docs: 修改拼写错误 2025-06-28 21:07:07 +08:00
zhangxun
fe9a8e7505 feat: 支持 long64 转 byte8、short16 2025-06-28 21:04:23 +08:00
zhangxun
ec94191153 feat: 支持 float32 转 byte8、short16 2025-06-28 21:02:30 +08:00
zhangxun
ccc9e3e50f feat: 支持 double64 转 byte8、short16 2025-06-28 21:00:09 +08:00
zhangxun
9d7d03e91c feat: 支持 short16 转 byte8、long64、float32、double64 2025-06-28 20:31:16 +08:00
zhangxun
8340e2bacc feat: 支持 byte8 转 short16、long64、float32、double64 2025-06-28 20:28:12 +08:00
zhangxun
f3f8a8de70 refactor: OpHelper.java 2025-06-28 20:23:54 +08:00
d020a7d5bf
!23 release: 合并 v0.4.0 版本至 main 分支
Merge pull request !23 from Luke/release/v0.4.0
2025-06-28 10:14:30 +00:00
cf333d95d9 chore: 更新 maven 配置文件 2025-06-28 18:09:33 +08:00
ed99460850 style: 优化示例的格式 2025-06-28 17:32:04 +08:00
dcb09c955b docs: 优化标题空格 2025-06-28 17:21:45 +08:00
a52a941799 docs: 更新 README.md 2025-06-28 17:19:22 +08:00
26a533adaf test: 更新 Demo1 2025-06-28 17:19:08 +08:00
5ea546e04e docs: README.md 增加 SnowVM-OpCode 2025-06-28 16:58:33 +08:00
4f98e4d6a3 docs: 增加 SnowVM-OpCode.md 2025-06-28 16:49:12 +08:00
b2d7d493d5 test: 更新 Demo1 2025-06-28 16:30:14 +08:00
7a2b65c013 docs: 更新 README.md 2025-06-28 16:29:52 +08:00
zhangxun
5bd7dd3c9c
!22 feat: SnowVM 扩容至 16位,并且支持更多指令
Merge pull request !22 from Luke/feature/refactor-opcode
2025-06-28 06:37:15 +00:00
8ca3185bc7 refactor: 重构代码结构 2025-06-28 12:23:08 +08:00
zhangxun
5d621e06b5 fix: byte、short 位运算转为 int 的问题 2025-06-28 10:43:03 +08:00
zhangxun
22c7ec46f8 style: TokenStream.isAtEnd 返回值符合文档说明 2025-06-28 10:20:11 +08:00
fa91550ad7 feat: SnowVM 支持更多指令 2025-06-28 00:19:27 +08:00
de6df61960 feat: SnowVM 支持 S_XOR 2025-06-28 00:18:08 +08:00
2205ef46bb feat: SnowVM 支持 S_OR 2025-06-28 00:18:01 +08:00
39bc4b81ae feat: SnowVM 支持 S_AND 2025-06-28 00:17:56 +08:00
aef7e3b12a feat: SnowVM 支持 B_XOR 2025-06-28 00:17:39 +08:00
4f0ad45eca feat: SnowVM 支持 B_OR 2025-06-28 00:17:32 +08:00
11a90cb920 feat: SnowVM 支持 B_AND 2025-06-28 00:17:25 +08:00
a674235e39 docs: 完善 VMOpCode.java 的注释 2025-06-27 23:47:21 +08:00
c5169b7654 chore: 修改 Demo 配置文件 2025-06-27 23:11:28 +08:00
ba37db19f4 Merge branch 'dev' into feat/refactor-opcode 2025-06-27 22:06:19 +08:00
zhangxun
50654fac6d
!20 fix: 修复嵌套模式数
Merge pull request !20 from Luke/bugfix/number-of-nested-modes
2025-06-27 13:41:10 +00:00
35b29d71a1 fix: 修复嵌套模式数 2025-06-27 21:19:43 +08:00
6a940011a1 Merge branch 'dev' into feat/refactor-opcode
# Conflicts:
#	src/main/java/org/jcnc/snow/vm/engine/VMOpCode.java
2025-06-27 13:58:23 +08:00
c73c72d77f
!19 fix: 语义分析报错显示未知位置
Merge pull request !19 from zhangxun/bugfix/semantic-error-location-information
2025-06-27 05:53:25 +00:00
zhangxun
237c35f0a0 fix: 部分代码嵌套模式数不正确的问题 2025-06-27 13:18:03 +08:00
zhangxun
43fd1d175d fix: 包名错误 2025-06-27 13:14:52 +08:00
zhangxun
8b421d3c92 fix: 语义分析报错显示未知位置 2025-06-27 13:13:41 +08:00
ec2068615e
!18 enhancement: 更好地显示字节码
Merge pull request !18 from zhangxun/feature/better-bytecode-display
2025-06-27 03:59:20 +00:00
ccd9923102
!17 fix:更正 int 与 long 操作数的比较跳转前缀
Merge pull request !17 from Luke/bugfix/compare-prefix-int-long
2025-06-27 03:44:31 +00:00
zhangxun
c03761ed61 fix: byte、short 运算后会变为 int 的问题 2025-06-26 20:39:54 +08:00
zhangxun
c17ccc7540 style: 包名 org.jcnc.snow.compiler.backend.util 后面增加 s 2025-06-26 19:03:51 +08:00
2218128663 style:扩容opcode 2025-06-26 18:02:42 +08:00
40fc6383b1 style:统一规范 VMOpCod e命名 2025-06-26 18:02:22 +08:00
4aa1804d44 feat:Command[] 扩容到 0x04FF 2025-06-26 18:01:30 +08:00
64e5d4c401 style:调整间距 VMOpCode.java 2025-06-26 18:01:24 +08:00
3f5dd92af9 style:调整间距 VMOpCode.java 2025-06-26 12:14:47 +08:00
e53ebeba33 feat:增加 region 折叠 2025-06-25 18:21:44 +08:00
63fab9f028 feat:vm 增加 float32 比较指令 2025-06-25 17:29:52 +08:00
26a77da955 feat:vm 增加 double64 比较指令 2025-06-25 17:08:12 +08:00
d3af0e3973 feat:vm 增加 short16 比较指令 2025-06-25 16:56:18 +08:00
a0fad7f642 feat:vm 增加 byte8 比较指令 2025-06-25 16:48:57 +08:00
b882050f24 Merge remote-tracking branch 'gitee/bugfix/compare-prefix-int-long' into bugfix/compare-prefix-int-long 2025-06-25 16:34:52 +08:00
4883cd91e7 docs:修复 int32 出错的注释 2025-06-25 16:14:51 +08:00
70189d1b80 docs:修复 long64 出错的注释 2025-06-25 16:12:39 +08:00
e1612de365 docs:修复 int32 出错的注释 2025-06-25 16:12:22 +08:00
0bbd542e71 docs:修复出错的注释 2025-06-25 16:08:27 +08:00
28e2a38c14 style:修改比较运算指令 CMP_EQ 为 CMP_IEQ 2025-06-25 15:37:26 +08:00
d892437deb test:修改测试代码 2025-06-25 15:15:37 +08:00
a64209c211 feat:语义分析支持布尔值比较 2025-06-25 14:39:18 +08:00
dff64e7dbb style:修改为 记录模式 2025-06-25 14:22:18 +08:00
dbf510f4ed feat:支持 64位整型比较 2025-06-25 13:50:06 +08:00
8894fa3300 chore:增加 Demo10 配置 2025-06-25 13:49:20 +08:00
3faa561f1c test:增加 Demo10 2025-06-25 13:49:07 +08:00
zhangxun
6292cdc006 style: 语句 lambda 替换为表达式 lambda 2025-06-25 11:46:14 +08:00
zhangxun
bb5ba2218f feat: 增强字节码显示 2025-06-25 11:44:26 +08:00
7df0cd8027 docs:修改注释内容 2025-06-25 11:04:52 +08:00
e9c1160993 test:增加 Demo9 2025-06-25 10:53:27 +08:00
3a2f2125a8 chore:增加 Demo9 的配置文件 2025-06-25 10:53:18 +08:00
db80395159 fix:更正 int 与 long 操作数的比较跳转前缀 2025-06-25 10:45:03 +08:00
c7a953995a
!16 feat: 支持生成项目脚手架
Merge pull request !16 from Luke/feat/pkg-project-scaffolding-generate
2025-06-24 10:11:39 +00:00
ac779f8767 chore: 修改pr模板 2025-06-24 18:07:46 +08:00
df7736a82a feat: 生成示例文件 2025-06-24 17:53:01 +08:00
0a236d914d feat: 生成的配置文件增加 build 字段 2025-06-24 17:06:39 +08:00
707967e62c feat: 区分 Local 和 Cloud 工作模式 2025-06-24 14:44:50 +08:00
8dda5c3bed feat: 兼容没有引号的情况 2025-06-24 14:44:08 +08:00
a75e76e05a docs: 增加注释 doc 2025-06-24 14:04:34 +08:00
2c4374554e docs: 统一注释风格 2025-06-24 12:03:08 +08:00
493b970d9a refactor: snow 模块代码模板提取到 SnowExampleTemplate.java 2025-06-24 11:41:05 +08:00
e0b4e2432f docs: 完善 GenerateCommand 的文档 2025-06-24 11:32:23 +08:00
9c5ae39ead feat: 增加 GenerateCommand 和 GenerateTask 实现生成项目骨架 2025-06-24 11:29:54 +08:00
bd9691b7eb feat: 修改逻辑,init不负责生成项目结构,只生成project.cloud 2025-06-24 10:18:17 +08:00
8a78073e90 refactor: 将 CLICommand 接口移动到 cli.command 包中 2025-06-24 09:32:32 +08:00
1d52cc1229 docs: 完善 cli 命令的注释 2025-06-24 09:28:09 +08:00
004bc076b1 feat: 将真正的编译实现下沉到 pkg 层,避免 CLI 与 pkg 的重复实现 2025-06-23 23:46:09 +08:00
7aa4d7dcd0 style: 删除包名,改为导入 2025-06-23 23:14:07 +08:00
0778193ae4 docs: 增加 pkg 文档 2025-06-23 23:13:38 +08:00
zhangxun
0e730b952c
!15 docs: 增加Snow-Lang GraalVM AOT 打包指南
Merge pull request !15 from Luke/feature/docs-graalvm-package
2025-06-20 04:57:24 +00:00
a5fcfcf96c
!13 feature: 统一 snow 命令行入口,实现可扩展的命令框架
Merge pull request !13 from Luke/feature/user-cli
2025-06-20 03:45:05 +00:00
ef974ffd35 docs: 增加Snow-Lang GraalVM AOT 打包指南 2025-06-20 11:38:38 +08:00
a66442b0bc docs: 增加maven文档 2025-06-20 11:06:11 +08:00
72d187ab76 Merge branch 'refs/heads/feature/user-cli' into feature/docs-graalvm-package 2025-06-20 11:03:21 +08:00
673b66c5c6 docs: 规范文档路径 2025-06-20 10:31:35 +08:00
4c0522c067 feat: 初步实现 init 项目等项目生命周期工具 2025-06-19 18:05:01 +08:00
002b51b71c style: 把 Cli 移出作为独立包,为后续拓展做铺垫 2025-06-19 15:43:27 +08:00
73956afc2a chore: VM 模式改为 RUN 2025-06-19 14:42:28 +08:00
753e217424 feat: 增加Snow源代码打印 2025-06-19 14:42:08 +08:00
fb5e3f3960 chore: 增加忽略提交 *.water 2025-06-18 15:20:12 +08:00
b2ca15f98b chore: 把Demo8适配最新Cli系统 2025-06-18 15:18:47 +08:00
aa13594e06 chore: 删除无用临时文件 2025-06-18 15:18:22 +08:00
0f4659c8b4 Merge branch 'dev' into feature/user-cli 2025-06-18 15:04:17 +08:00
63b9293727
!12 bug: 变量的类型受右值类型影响而降级
Merge pull request !12 from zhangxun/bugfix/fix-not-supports-long-compare-command
2025-06-18 06:42:08 +00:00
zhangxun
0af2c371ca test: 增加Demo8 2025-06-18 06:29:15 +00:00
zhangxun
9b9d0526f8 update: 移除调试代码 2025-06-18 06:29:15 +00:00
zhangxun
807f1afb9d update: 移除未使用的 import 2025-06-18 06:29:15 +00:00
zhangxun
2f8e181b13 update: 移除 Optional 字段 2025-06-18 06:29:15 +00:00
zhangxun
7a9cfc1861 update: 修改一处变量名为小驼峰形式 2025-06-18 06:29:15 +00:00
zhangxun
ee9e56c479 fix: 变量的类型受右值类型影响而降级 2025-06-18 06:29:15 +00:00
zhangxun
e78cb09c0f feat: 条件表达式支持类型提升 2025-06-18 06:29:15 +00:00
zhangxun
7bd795b796 feat: 增加 64 位整数比较 2025-06-18 06:29:15 +00:00
5d8f69209f chore: 增加 version 配置文件 2025-06-18 06:29:07 +00:00
7a96d68927 chore: maven 增加 UTF-8 Encoding 2025-06-18 06:29:07 +00:00
dd2d14743e feat: 实现从资源文件中加载 Snow 编程语言版本信息 2025-06-18 06:29:07 +00:00
34fd7c6d8b style: 替换为 'getFirst()' 调用 2025-06-18 06:29:07 +00:00
0797723b88 docs: 完善注释docs 2025-06-18 06:29:07 +00:00
44ffed3571 test: 适配新的Cli 2025-06-18 06:29:07 +00:00
8ca75787b7 feat: 打印动态生成的通用帮助信息 2025-06-18 06:29:07 +00:00
ee09f14bfa docs: 增加cli注释 2025-06-18 06:29:07 +00:00
2f473d1e13 docs: 删除无用注释 2025-06-18 06:29:07 +00:00
9bb624f024 feat: 修改为编译为water文件 2025-06-18 06:29:07 +00:00
a8d9bbe81d feat: 实现Snow 语言统一命令行入口(CLI) 2025-06-18 06:29:07 +00:00
49f91e3b4e feat: 增加指令生成器集中注册表 2025-06-18 06:29:07 +00:00
a51502c622 chore: 增加 PR 模板 2025-06-18 14:27:29 +08:00
baea2ca96f chore: 修改 gitee issues 中 Bug 报告的模板 2025-06-18 11:48:08 +08:00
24fc3ef12e chore: 修改 gitee issues 中 Bug 报告的模板 2025-06-18 11:46:34 +08:00
c5cc1454ca chore: 增加 gitee issues 模板功能 2025-06-18 11:03:15 +08:00
5cd4c41e01 chore: 增加 gitee issues 模板功能 2025-06-18 10:42:48 +08:00
bfc04f53ee
update README.md.
Signed-off-by: Luke <luke.k.xu@hotmail.com>
2025-06-14 02:52:36 +00:00
db28cdff20
update LICENSE.
Signed-off-by: Luke <luke.k.xu@hotmail.com>
2025-06-14 02:45:58 +00:00
514 changed files with 20399 additions and 4644 deletions

2
.env Normal file
View File

@ -0,0 +1,2 @@
# Auto-generated by build\tools\generate-dotenv.ps1
SNOW_VERSION=0.8.0

View File

@ -0,0 +1,95 @@
name: "Bug 报告"
description: "提交代码中发现的缺陷"
title: "[Bug] "
labels:
- bug
assignees: []
body:
- type: textarea
id: summary
attributes:
label: 问题概述
description: 简要说明发生了什么
placeholder: "在此填写问题概述…"
validations:
required: true
- type: textarea
id: steps
attributes:
label: 重现步骤
description: 按顺序列出重现流程
placeholder: |
1. …
2. …
3. …
validations:
required: true
- type: textarea
id: expected
attributes:
label: 期望结果
placeholder: "在此填写期望结果…"
validations:
required: true
- type: textarea
id: actual
attributes:
label: 实际结果
placeholder: "在此填写实际结果…"
validations:
required: true
- type: dropdown
id: os_type
attributes:
label: 操作系统
options:
- Windows
- macOS
- Linux
- 其他
validations:
required: true
- type: input
id: os_version
attributes:
label: 系统版本
description: 如 Windows 10 / macOS 14.0 / Ubuntu 22.04
placeholder: "请输入操作系统版本"
validations:
required: true
- type: dropdown
id: app_version
attributes:
label: 软件版本/分支
options:
- v0.8.0
- main
- dev
- 其他
validations:
required: true
- type: input
id: app_version_other
attributes:
label: 其他版本/分支
description: 如果上方选“其他”,请填写
placeholder: "请输入版本号或分支"
validations:
required: false
- type: textarea
id: attachments
attributes:
label: 附加信息(可选)
description: 日志、截图或其他相关信息
placeholder: "如有日志或截图,可粘贴或附链接…"
validations:
required: false

View File

@ -0,0 +1,25 @@
name: "维护任务"
description: "依赖升级、格式化、脚本运行等项目维护工作"
title: "[Chore] "
labels:
- chore
assignees: []
body:
- type: input
id: chore_title
attributes:
label: 任务标题
description: 简要描述维护内容
placeholder: "如: 升级 JDK 版本"
validations:
required: true
- type: textarea
id: chore_description
attributes:
label: 任务详情
description: 描述执行步骤或相关脚本命令
placeholder: "如: 修改 pom.xml…"
validations:
required: false

View File

@ -0,0 +1,5 @@
blank_issues_enabled: false # 禁用空白 Issue强制选择模板
contact_links: # 外部文档或反馈链接
- name: Snow 项目 Git 管理规范
url: https://gitee.com/jcnc-org/snow/blob/main/doc/Git-Management/Git-Management.md
about: 分支管理与提交规范

View File

@ -0,0 +1,25 @@
name: "文档改进"
description: "报告文档错误、更新需求或新增文档请求"
title: "[Docs] "
labels:
- docs
assignees: []
body:
- type: textarea
id: docs_summary
attributes:
label: 文档概述
description: 简要说明需要更新或新增的文档部分
placeholder: "在此填写文档改进或更新需求…"
validations:
required: true
- type: textarea
id: docs_details
attributes:
label: 详细说明
description: 说明当前文档存在的问题或改进建议
placeholder: "如有示例、截图或链接,请在此补充…"
validations:
required: false

View File

@ -0,0 +1,34 @@
name: "功能优化"
description: "对现有功能的改进或性能优化建议"
title: "[Enhancement] "
labels:
- enhancement
assignees: []
body:
- type: textarea
id: enhancement_summary
attributes:
label: 优化概述
description: 简要说明希望改进的功能模块
placeholder: "在此填写优化目标…"
validations:
required: true
- type: textarea
id: enhancement_details
attributes:
label: 优化方案
description: 详细描述改进思路与实现方式
placeholder: "如: 缓存机制、算法优化…"
validations:
required: true
- type: textarea
id: enhancement_benefit
attributes:
label: 预期收益
description: 描述优化后带来的效益或体验提升
placeholder: "如: 响应时间缩短 30%…"
validations:
required: false

View File

@ -0,0 +1,52 @@
name: "新功能请求"
description: "提出新的功能或改进建议"
title: "[Feature] "
labels:
- feature
assignees: []
body:
- type: textarea
id: feature_summary
attributes:
label: 功能概述
description: 简要描述希望实现的功能及其场景
placeholder: "在此填写功能概述…"
validations:
required: true
- type: textarea
id: design_solution
attributes:
label: 设计方案
description: 描述功能的具体实现方案与技术细节
placeholder: "在此填写设计方案…"
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: 可选方案(可选)
description: 列出已考虑的其他方案及其优缺点
placeholder: "在此填写可选方案…"
validations:
required: false
- type: textarea
id: impact_scope
attributes:
label: 影响范围(可选)
description: 描述该功能对现有系统或用户的影响
placeholder: "在此填写影响范围…"
validations:
required: false
- type: textarea
id: additional_info
attributes:
label: 附加信息(可选)
description: 如原型图、参考链接、截图等
placeholder: "在此补充额外信息…"
validations:
required: false

View File

@ -0,0 +1,37 @@
name: "紧急修复"
description: "生产环境紧急问题的快速修复"
title: "[Hotfix] "
labels:
- hotfix
assignees: []
body:
- type: textarea
id: issue_summary
attributes:
label: 问题概述
description: 简要描述需紧急修复的问题
placeholder: "在此填写紧急问题描述…"
validations:
required: true
- type: dropdown
id: priority
attributes:
label: 优先级
description: 选择修复优先级
options:
- P0
- P1
- P2
validations:
required: true
- type: input
id: deadline
attributes:
label: 修复截止日期
description: 填写计划完成的日期 (YYYY-MM-DD)
placeholder: "例如: 2025-06-20"
validations:
required: false

View File

@ -0,0 +1,34 @@
name: "疑问与讨论"
description: "提交使用疑问或设计讨论话题"
title: "[Question] "
labels:
- question
assignees: []
body:
- type: textarea
id: question_details
attributes:
label: 问题描述
description: 清晰说明遇到的问题或讨论主题
placeholder: "在此填写问题或讨论点…"
validations:
required: true
- type: textarea
id: question_attempts
attributes:
label: 已尝试方法
description: 列出已尝试过的解决方案或思路
placeholder: "如: 查阅文档、尝试示例代码…"
validations:
required: false
- type: textarea
id: question_expectation
attributes:
label: 期望答案
description: 描述希望获得的解答或帮助方向
placeholder: "如: 最佳实践、配置示例…"
validations:
required: false

View File

@ -0,0 +1,34 @@
name: "代码重构"
description: "优化现有代码结构、命名或逻辑的重构任务"
title: "[Refactor] "
labels:
- refactor
assignees: []
body:
- type: textarea
id: refactor_scope
attributes:
label: 重构范围
description: 描述需要重构的模块或文件
placeholder: "在此填写重构目标…"
validations:
required: true
- type: textarea
id: refactor_reason
attributes:
label: 重构原因
description: 说明当前存在的痛点或待改进之处
placeholder: "如: 变量命名不规范、函数职责过多…"
validations:
required: true
- type: textarea
id: refactor_expectation
attributes:
label: 预期效果
description: 说明重构后带来的好处或验证方式
placeholder: "如: 提高性能、增强可读性…"
validations:
required: false

View File

@ -0,0 +1,36 @@
<!--
感谢您提交 PR在提交前请确保已阅读并遵守项目的 Snow 项目 Git 管理规范。
https://gitee.com/jcnc-org/snow/blob/main/doc/Git-Management/Git-Management.md
提交 PR 后,请根据实际情况删除不适用的项。
1. 请在右侧面板中:
- 关联 Issue
- 选择 PR 类型bug 修复 / 新功能 / 文档 / 优化 等)
- 添加必要的标签和审查人
- 请添加里程碑
- 如必要请设置优先级
2. 在下面的“检查清单”里,用 `- [x]` 标记已完成,用 `- [ ]` 标记未完成。例如:
- [x] 已阅读并遵守项目规范
- [ ] 本地通过所有测试
- [ ] 文档已更新(如有必要)
3. 确认所有勾选项都已完成后,再创建 Pull Request。
感谢你的配合!🙏
-->
## 描述 (Description)
请简要描述本次变更的目的和内容。
## 主要改动 (Changes)
- 改动点 1
- 改动点 2
## 检查清单 (Checklist)
- [ ] 已阅读并遵守项目规范
- [ ] 本地通过所有测试
- [ ] 文档已更新(如有必要)

4
.gitignore vendored
View File

@ -37,3 +37,7 @@ target/
/.idea/ /.idea/
/Snow.tar /Snow.tar
/src/main/java/org/jcnc/snow/compiler/ir.tar /src/main/java/org/jcnc/snow/compiler/ir.tar
### Snow 虚拟机指令 ###
*.water
/.lingma/

11
.run/Bug1.run.xml Normal file
View File

@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Bug1" type="Application" factoryName="Application" folderName="BugFarm">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug1 -o target/Bug1" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

11
.run/Bug2.run.xml Normal file
View File

@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Bug2" type="Application" factoryName="Application" folderName="BugFarm">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug2 -o target/Bug2" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

11
.run/Bug3.run.xml Normal file
View File

@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Bug3" type="Application" factoryName="Application" folderName="BugFarm">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug3 -o target/Bug3 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

11
.run/Bug4.run.xml Normal file
View File

@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Bug4" type="Application" factoryName="Application" folderName="BugFarm">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug4 -o target/Bug4 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

11
.run/Bug5.run.xml Normal file
View File

@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Bug5" type="Application" factoryName="Application" folderName="BugFarm">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug5 -o target/Bug5 " />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Bug6.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Bug6" type="Application" factoryName="Application" folderName="BugFarm">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug6 -o target/Bug6 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

View File

@ -1,15 +1,9 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo1" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false"> <configuration default="false" name="Demo1" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" /> <option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" /> <option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" /> <module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="-d playground/Demo1" /> <option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo1 -o target/Demo1 --debug" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>

11
.run/Demo10.run.xml Normal file
View File

@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo10" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo10 -o target/Demo10 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

11
.run/Demo11.run.xml Normal file
View File

@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo11" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo11 -o target/Demo11 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

11
.run/Demo12.run.xml Normal file
View File

@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo12" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo12 -o target/Demo12 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo13.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo13" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo13 -o target/Demo13 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

18
.run/Demo14.run.xml Normal file
View File

@ -0,0 +1,18 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo14" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo14 -o target/Demo14 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration default="false" name="Demo14" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo14 -o target/Demo14" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo15.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo15" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo15 -o target/Demo15 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo16.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo16" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo16 -o target/Demo16 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo17.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo17" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo17 -o target/Demo17 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo18.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo18" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo18 -o target/Demo18 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo19.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo19" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo19 -o target/Demo19 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

View File

@ -1,15 +1,9 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo2" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false"> <configuration default="false" name="Demo2" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" /> <option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" /> <option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" /> <module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="-d playground/Demo2" /> <option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo2 -o target/Demo2 --debug" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>

10
.run/Demo20.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo20" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo20 -o target/Demo20 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo21.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo21" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo21 -o target/Demo21 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo22.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo22" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo22 -o target/Demo22" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo23.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo23" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo23 -o target/Demo23 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo24.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo24" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo24 -o target/Demo24" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Demo25.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo25" type="Application" factoryName="Application" folderName="Demo">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo25 -o target/Demo25" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

View File

@ -1,15 +1,9 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo3" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false"> <configuration default="false" name="Demo3" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" /> <option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" /> <option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" /> <module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="-d playground/Demo3" /> <option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo3 -o target/Demo3 --debug" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>

View File

@ -1,15 +1,9 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo4" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false"> <configuration default="false" name="Demo4" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" /> <option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" /> <option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" /> <module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="-d playground/Demo4" /> <option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo4 -o target/Demo4 --debug" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>

View File

@ -1,15 +1,9 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo5" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false"> <configuration default="false" name="Demo5" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" /> <option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" /> <option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" /> <module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="-d playground/Demo5" /> <option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo5 -o target/Demo5 --debug" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>

View File

@ -1,15 +1,9 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo6" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false"> <configuration default="false" name="Demo6" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" /> <option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" /> <option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" /> <module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="-d playground/Demo6" /> <option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo6 -o target/Demo6 --debug" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>

View File

@ -1,15 +1,9 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo7" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false"> <configuration default="false" name="Demo7" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" /> <option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" /> <option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" /> <module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="-d playground/Demo7" /> <option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo7 -o target/Demo7 --debug" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2"> <method v="2">
<option name="Make" enabled="true" /> <option name="Make" enabled="true" />
</method> </method>

11
.run/Demo8.run.xml Normal file
View File

@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo8" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo8 -o target/Demo8 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

11
.run/Demo9.run.xml Normal file
View File

@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo9" type="Application" factoryName="Application" folderName="Demo">
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo9 -o target/Demo9 --debug" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Help.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Help" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="--help" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

View File

@ -1,7 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run" type="CompoundRunConfigurationType">
<toRun name="build_project2tar.ps1" type="PowerShellRunType" />
<toRun name="Demo1" type="Application" />
<method v="2" />
</configuration>
</component>

15
.run/Snow.run.xml Normal file
View File

@ -0,0 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Snow" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.jcnc.snow.cli.SnowCLI" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

10
.run/Version.run.xml Normal file
View File

@ -0,0 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Version" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<option name="PROGRAM_PARAMETERS" value="--version" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

View File

@ -0,0 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="build-project2tar.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/build-project2tar.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
<envs />
<method v="2" />
</configuration>
</component>

View File

@ -1,9 +1,9 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="build_project2tar.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/build_project2tar.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe"> <configuration default="false" name="build-release-all.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/build-release-all.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
<envs /> <envs />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration default="false" name="build_project2tar.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/build_project2tar.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe"> <configuration default="false" name="build-release-all.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/build-release-all.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
<envs /> <envs />
<method v="2" /> <method v="2" />
</configuration> </configuration>

View File

@ -0,0 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="release-linux.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/release-linux.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
<envs />
<method v="2" />
</configuration>
</component>

View File

@ -0,0 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="release-windows.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/release-windows.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
<envs />
<method v="2" />
</configuration>
</component>

29
.run/测试.run.xml Normal file
View File

@ -0,0 +1,29 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="测试" type="CompoundRunConfigurationType">
<toRun name="Demo1" type="Application" />
<toRun name="Demo10" type="Application" />
<toRun name="Demo11" type="Application" />
<toRun name="Demo12" type="Application" />
<toRun name="Demo13" type="Application" />
<toRun name="Demo14" type="Application" />
<toRun name="Demo15" type="Application" />
<toRun name="Demo16" type="Application" />
<toRun name="Demo17" type="Application" />
<toRun name="Demo18" type="Application" />
<toRun name="Demo19" type="Application" />
<toRun name="Demo2" type="Application" />
<toRun name="Demo20" type="Application" />
<toRun name="Demo21" type="Application" />
<toRun name="Demo22" type="Application" />
<toRun name="Demo23" type="Application" />
<toRun name="Demo24" type="Application" />
<toRun name="Demo25" type="Application" />
<toRun name="Demo3" type="Application" />
<toRun name="Demo4" type="Application" />
<toRun name="Demo6" type="Application" />
<toRun name="Demo7" type="Application" />
<toRun name="Demo8" type="Application" />
<toRun name="Demo9" type="Application" />
<method v="2" />
</configuration>
</component>

57
Dockerfile Normal file
View File

@ -0,0 +1,57 @@
# Stage 1: 官方 GraalVM 社区版(已含 native-image
FROM ghcr.io/graalvm/native-image-community:24.0.2 AS builder
RUN microdnf install -y \
gcc gcc-c++ make git wget tar gzip which findutils maven \
&& microdnf clean all
# ---------- 构建 musl ----------
ARG MUSL_VER=1.2.5
WORKDIR /tmp
RUN wget -q https://musl.libc.org/releases/musl-${MUSL_VER}.tar.gz \
&& tar -xzf musl-${MUSL_VER}.tar.gz \
&& cd musl-${MUSL_VER} \
&& ./configure --prefix=/opt/musl-${MUSL_VER} --disable-shared \
&& make -j"$(nproc)" \
&& make install \
&& ln -s /opt/musl-${MUSL_VER} /opt/musl \
&& cd / && rm -rf /tmp/musl-${MUSL_VER}*
RUN ln -s /opt/musl/bin/musl-gcc /usr/local/bin/x86_64-linux-musl-gcc \
&& ln -s /opt/musl/bin/musl-gcc /usr/local/bin/x86_64-linux-musl-cc
ENV PATH="/opt/musl/bin:${PATH}"
ENV CC="musl-gcc"
ENV C_INCLUDE_PATH="/opt/musl/include"
ENV LIBRARY_PATH="/opt/musl/lib"
# ---------- 静态 zlib ----------
ARG ZLIB_VERSION=1.3.1
WORKDIR /tmp
RUN wget -q https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \
&& tar -xzf zlib-${ZLIB_VERSION}.tar.gz \
&& cd zlib-${ZLIB_VERSION} \
&& CC=musl-gcc ./configure --static --prefix=/opt/musl \
&& make -j"$(nproc)" \
&& make install \
&& cd / && rm -rf /tmp/zlib-${ZLIB_VERSION}*
# ---------- Maven 缓存优化 ----------
WORKDIR /app
COPY pom.xml ./
# 先拉依赖并缓存
RUN mvn -B -P native-linux dependency:go-offline
# ---------- 复制源码 ----------
COPY . /app
# ---------- 编译 native image ----------
RUN mvn -P native-linux -DskipTests clean package
# ------------------------------------------------------------
# Stage 2: 输出产物镜像(可以直接 cp 出二进制)
# ------------------------------------------------------------
FROM busybox AS export
WORKDIR /export
COPY --from=builder /app/org.jcnc.snow.cli.SnowCLI /export/Snow

View File

@ -186,7 +186,8 @@
same "printed page" as the copyright notice for easier same "printed page" as the copyright notice for easier
identification within third-party archives. identification within third-party archives.
Copyright [yyyy] [name of copyright owner] Copyright © 2025 Ke Xu (Luke), on behalf of the SnowLang Project
Repository: https://gitee.com/jcnc-org/snow
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

15
NOTICE Normal file
View File

@ -0,0 +1,15 @@
==========================================
SnowLang Project NOTICE
==========================================
Copyright © 2025 Ke Xu (Luke), on behalf of the SnowLang Project
Repository: https://gitee.com/jcnc-org/snow
Licensed under the Apache License, Version 2.0 (the "License")
You may obtain a copy of the License at:
http://www.apache.org/licenses/LICENSE-2.0
===============================================================================
This product includes software developed by the SnowLang Project and
its contributors.
===============================================================================

474
README.md
View File

@ -1,5 +1,5 @@
<p align="center"> <p align="center">
<img src="doc/README/IMG/IMG_Snow_icon_128.svg" alt="Snow Icon"> <img src="docs/README/IMG/icon/IMG_Snow_icon_128.svg" alt="Snow Icon">
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Snow编程语言</h1> <h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Snow编程语言</h1>
<p align="center"> <p align="center">
@ -11,8 +11,8 @@
<a href="https://gitee.com/jcnc-org/snow/blob/main/LICENSE"> <a href="https://gitee.com/jcnc-org/snow/blob/main/LICENSE">
<img src="https://img.shields.io/badge/%20license-Apache--2.0%20-blue" alt=""> <img src="https://img.shields.io/badge/%20license-Apache--2.0%20-blue" alt="">
</a> </a>
<a href="https://gitee.com/jcnc-org/snow/tree/v0.3.0/"> <a href="https://gitee.com/jcnc-org/snow/tree/v0.8.0/">
<img src="https://img.shields.io/badge/version-v0.3.0-blue" alt=""> <img src="https://img.shields.io/badge/version-v0.8.0-blue" alt="">
</a> </a>
</p> </p>
@ -30,45 +30,67 @@
## 项目简介 ## 项目简介
Snow 语言是一个正在发展的编程语言,采用类模块module语法风格,支持函数定义和类型注解。它设计目标是让大型语言模型LLM更容易生成和理解编程代码。该项目实现了 Snow 语言的完整编译流程,包括词法分析,语法分析,语义分析,中间表示IR生成以及最终的虚拟机VM指令生成和执行器。通过 Snow 编译器,可以将 `.snow` 源文件编译为中间表示和自定义的虚拟机指令,并在内置的虚拟机上直接运行。 Snow 是一门受 LLM 时代启发的、面向 AI 友好的编程语言。它设计目标是让 LLM 更容易生成和理解编程代码。
该项目实现了 Snow
语言的完整编译流程,包括词法分析,语法分析,语义分析,中间表示IR生成以及最终的虚拟机VM指令生成和执行器提供从源码到字节码再到自研编程语言虚拟机 (
SnowVM) 的完整编译-执行链路。
通过 Snow 编译器,可以将 `.snow` 源文件编译为 `.water`虚拟机指令,并在 SnowVM 上直接运行。
从源码编译、构建管理、依赖管理、项目标准化、可视化调试面板到原生镜像发布,全部由 Snow 官方工具完成,降低学习与集成成本。
## 背景理念 ## 背景理念
Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助人工智能模型更好地理解程序结构。语言使用显式的 `module` 声明来组织代码,用 `function`,`parameter`,`return_type`,`body` 等关键字分隔不同代码块,语法结构固定且易读。此外,Snow 实现了语义分析来检查变量作用域和类型一致性,在编译阶段捕获错误并确保生成的中间代码正确无误。这种自上而下的编译流程,使得代码设计和生成更加模块化,可解释,也有利于调试和优化。 Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助 LLM 更好地理解程序
相关背景: [心路历程](doc/Snow's-Journey/Snow's-Journey.md) 语言使用显式的 `module` 声明来组织代码,用 `function`,`params`,`returns`,`body` 等关键字分隔不同代码块,语法结构固定且易读。此外,Snow
实现了语义分析来检查变量作用域和类型一致性,在编译阶段捕获错误并确保生成的中间代码正确无误。这种自上而下的编译流程,使得代码设计和生成更加模块化,可解释,也有利于调试和优化。
## 下载Snow发行版 相关背景: [心路历程](docs/Snow-Lang-Journey/Snow-Lang-Journey.md)
访问: https://gitee.com/jcnc-org/snow/releases
## 相关文档
[Git 管理规范](doc/Git-Management/Git-Management.md)
## 功能特性 ## 功能特性
* **模块化语法**:支持顶层的 `module:` 声明和 `import:` 导入语句,用于组织代码和依赖管理。 | 类别 | 关键特性 |
* **函数与类型**:支持函数定义,函数参数和返回值。在函数体中可以声明变量并进行类型检查。 |----------|---------------------------------------------------------------------------------------------------|
* **丰富语句**:支持变量声明(`declare name:Type`,可选初始化),条件语句(`if ... end if`,循环语句(`loop ... end loop`,返回语句等。 | 语言层 | module / import / function / loop / ifelse / Pratt 表达式解析<br>静态类型检查 & 作用域分析 |
* **表达式解析**:实现了 Pratt 算法的表达式解析器,支持算术,比较和逻辑运算,以及函数调用,成员访问等操作。 | 编译器前端 | Lexer / Parser / Semantic Analyzer 全栈自研,生成 JSON-AST |
* **完整编译器前端**包含词法分析器Lexer,语法分析器Parser和语义分析器,对源代码生成抽象语法树AST并检查类型/作用域。 | IR & 后端 | 三地址式 IR ➜ 线性扫描寄存器分配 ➜ SnowVM 指令 |
* **中间表示IR**:将高层 AST 转换为自定义的三地址式 IRIntermediate Representation,结构清晰便于后端优化。 | 虚拟机 | 栈 + 寄存器混合架构、GUI 局部变量监视 |
* **后端指令生成**IR 模块通过线性扫描寄存器分配器映射寄存器,使用指令生成器将 IR 翻译为定制的 VM 指令集。 | snow pkg | - `.cloud` DSL 描述项目、依赖与构建<br>- 预设 `clean / compile / run / package / publish` 任务<br>- 离线缓存与远程仓库解析 |
* **虚拟机执行**自带虚拟机引擎VirtualMachineEngine,能够加载并执行生成的指令序列,支持调试模式输出虚拟机状态。 | CLI | init, compile, run, clean, build, generate,debug |
* **调试与输出**:编译过程会输出源码,ASTJSON 格式),IR 和最终生成的 VM 代码,方便用户查看编译中间结果和调试。
## Snow-Lang 官网
[https://snow-lang.com](https://snow-lang.com)
## 下载 Snow 发行版
[https://gitee.com/jcnc-org/snow/releases](https://gitee.com/jcnc-org/snow/releases)
## 相关文档
[Snow-Lang 指南](docs/Snow-Lang-Syntax/Snow-Lang-Syntax.md)
[Snow-Lang 语法规范](docs/Snow-Lang-Syntax/Snow-Lang-Grammar-Specification.md)
[Git 管理规范](docs/Snow-Lang-Git-Management/Snow-Lang-Git-Management.md)
[SnowVM OpCode 指令表](docs/SnowVM-OpCode/SnowVM-OpCode.md)
[Snow-Lang GraalVM AOT 打包指南](docs/Snow-Lang-GraalVM-AOT-Native-Image-Package/Snow-Lang-GraalVM-AOT-Native-Image-Package.md)
## 开发计划 ## 开发计划
[Snow 语言现状和下一阶段开发路线图-2025-06-11](doc/Snow's-current-language-situation-and-the-development-roadmap-for-the-next-stage/Snow's-current-language-situation-and-the-development-roadmap-for-the-next-stage.md) ~~[Snow 语言现状和下一阶段开发路线图-2025-06-11-已废弃](docs/Snow-Lang-Roadmap/Snow-Lang-Roadmap-2025-06-11.md)~~
## 开发环境安装 ## 开发环境安装
1. **开发环境准备** 1. **开发环境准备**:
1. 安装集成开发环境 [IntelliJ IDEA](https://www.jetbrains.com/idea/download) 1. 安装集成开发环境 [IntelliJ IDEA](https://www.jetbrains.com/idea/download)
2. 安装 Java 开发工具 [Graalvm-jdk-24](https://www.graalvm.org/downloads/) 2. 安装 Java 开发工具 [Graalvm-jdk-24](https://www.graalvm.org/downloads/)
2. **获取源码** 2. **获取源码**:
将项目源码下载或克隆到本地目录。 将项目源码下载或克隆到本地目录。
```bash ```bash
git clone https://gitee.com/jcnc-org/snow.git git clone https://gitee.com/jcnc-org/snow.git
@ -76,40 +98,150 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
3. **运行项目** 3. **运行项目**
使用IDEA配置好的运行配置SnowCompiler 使用IDEA配置好的运行配置 `Demo1`
![IMG_运行配置文件_1.png](doc/README/IMG/IMG_Run-Profile_1.png) ![IMG_运行配置文件_1.png](docs/README/IMG/IMG_Run-Profile_1.png)
4. **运行成功** 4. **运行成功**
``` snow `````snow
## 源代码 (main.snow) ## 编译器输出
### Snow 源代码
#### Main.snow
module: Main module: Main
import:Math import:Math
function: main function: main
parameter: returns: int
return_type: int
body: body:
Math.factorial(6L,1L) Math.add(6,1)
return 0 return 0
end body end body
end function end function
end module end module
line col type lexeme
----------------------------------------------------
1 1 KEYWORD module
1 7 COLON :
1 9 IDENTIFIER Main
1 13 NEWLINE \n
## 源代码 (test.snow) 2 5 KEYWORD import
2 11 COLON :
2 12 IDENTIFIER Math
2 16 NEWLINE \n
3 5 KEYWORD function
3 13 COLON :
3 15 IDENTIFIER main
3 19 NEWLINE \n
4 9 KEYWORD returns
4 20 COLON :
4 22 TYPE int
4 25 NEWLINE \n
5 9 KEYWORD body
5 13 COLON :
5 14 NEWLINE \n
6 13 IDENTIFIER Math
6 17 DOT .
6 18 IDENTIFIER add
6 21 LPAREN (
6 22 NUMBER_LITERAL 6
6 23 COMMA ,
6 24 NUMBER_LITERAL 1
6 25 RPAREN )
6 26 NEWLINE \n
7 13 KEYWORD return
7 20 NUMBER_LITERAL 0
7 21 NEWLINE \n
8 9 KEYWORD end
8 13 KEYWORD body
8 17 NEWLINE \n
9 5 KEYWORD end
9 9 KEYWORD function
9 17 NEWLINE \n
10 1 KEYWORD end
10 5 KEYWORD module
10 1 EOF
## 词法分析通过,没有发现错误
#### Math.snow
module: Math module: Math
function: factorial function: add
parameter: params:
declare n1: long declare n1: int
declare n2: long declare n2: int
return_type: long returns: int
body: body:
return n1 + n2 return n1 + n2
end body end body
end function end function
end module end module
line col type lexeme
----------------------------------------------------
1 1 KEYWORD module
1 7 COLON :
1 9 IDENTIFIER Math
1 13 NEWLINE \n
2 5 KEYWORD function
2 13 COLON :
2 15 IDENTIFIER add
2 18 NEWLINE \n
3 9 KEYWORD params
3 18 COLON :
3 19 NEWLINE \n
4 13 KEYWORD declare
4 21 IDENTIFIER n1
4 23 COLON :
4 25 TYPE int
4 28 NEWLINE \n
5 13 KEYWORD declare
5 21 IDENTIFIER n2
5 23 COLON :
5 25 TYPE int
5 28 NEWLINE \n
6 9 KEYWORD returns
6 20 COLON :
6 22 TYPE int
6 25 NEWLINE \n
7 9 KEYWORD body
7 13 COLON :
7 14 NEWLINE \n
8 12 KEYWORD return
8 19 IDENTIFIER n1
8 22 PLUS +
8 24 IDENTIFIER n2
8 26 NEWLINE \n
9 9 KEYWORD end
9 13 KEYWORD body
9 17 NEWLINE \n
10 5 KEYWORD end
10 9 KEYWORD function
10 17 NEWLINE \n
11 1 KEYWORD end
11 5 KEYWORD module
11 1 EOF
## 词法分析通过,没有发现错误
## 语义分析通过,没有发现错误
## 编译器输出
### AST ### AST
[ [
{ {
@ -117,8 +249,8 @@ end module
"name": "Main", "name": "Main",
"imports": [ "imports": [
{ {
"module": "Math", "type": "Import",
"type": "Import" "module": "Math"
} }
], ],
"functions": [ "functions": [
@ -140,16 +272,16 @@ end module
"type": "Identifier", "type": "Identifier",
"name": "Math" "name": "Math"
}, },
"member": "factorial" "member": "add"
}, },
"arguments": [ "arguments": [
{ {
"type": "NumberLiteral", "type": "NumberLiteral",
"value": "6L" "value": "6"
}, },
{ {
"type": "NumberLiteral", "type": "NumberLiteral",
"value": "1L" "value": "1"
} }
] ]
} }
@ -174,18 +306,18 @@ end module
"functions": [ "functions": [
{ {
"type": "Function", "type": "Function",
"name": "factorial", "name": "add",
"parameters": [ "parameters": [
{ {
"name": "n1", "name": "n1",
"type": "long" "type": "int"
}, },
{ {
"name": "n2", "name": "n2",
"type": "long" "type": "int"
} }
], ],
"returnType": "long", "returnType": "int",
"body": [ "body": [
{ {
"type": "Return", "type": "Return",
@ -211,38 +343,49 @@ end module
func main() { func main() {
%0 = CONST 6 %0 = CONST 6
%1 = CONST 1 %1 = CONST 1
%2 = CALL Math.factorial, %0, %1 %2 = CALL Math.add, %0, %1
%3 = CONST 0 %3 = CONST 0
RET %3 RET %3
} }
func factorial(%0, %1) { func add(%0, %1) {
%2 = ADD_L64 %0, %1 %2 = ADD_I32 %0, %1
RET %2 RET %2
} }
### VM code ### VM code
112 6 0000: I_PUSH 6
152 0 0001: I_STORE 0
112 1 0002: I_PUSH 1
152 1 0003: I_STORE 1
162 0 0004: I_LOAD 0
162 1 0005: I_LOAD 1
201 12 2 0006: CALL 13 2
152 2 0007: I_STORE 2
111 0 0008: I_PUSH 0
151 3 0009: I_STORE 3
161 3 0010: I_LOAD 3
255 0011: HALT
162 0 0012: HALT
162 1 0013: I_LOAD 0
11 0014: I_LOAD 1
152 2 0015: I_ADD
162 2 0016: I_STORE 2
202 0017: I_LOAD 2
Calling function at address: 12 0018: RET
0019: RET
Written to D:\Devs\IdeaProjects\Snow\target\Demo1.water
=== Launching VM ===
Calling function at address: 13
Return 7 Return 7
Process has ended Process has ended
Operand Stack state:[0]
--- Call Stack State ---
### VM Local Variable Table: ### VM Local Variable Table:
0: 6 0: 6
@ -250,35 +393,108 @@ Process has ended
2: 7 2: 7
3: 0 3: 0
``` === VM exited ===
`````
## 编译 Snow 源代码 ## 编译 Snow 源代码
1. **运行编译器** ### 1. 独立编译 (Standalone Compilation)
运行 Snow 来编译 `.snow` 源文件 (Windows环境) 并且在Snow虚拟机运行,默认以 DEBUG 模式显示执行过程和状态。例如:
独立编译不依赖 `.cloud` 文件,而是直接使用 `Snow` 编译器进行 `.snow` 文件的编译和执行。
#### 独立编译步骤:
1. **运行编译器:**
你可以通过以下命令来编译单个或多个 `.snow` 文件,或者递归编译一个目录中的所有 `.snow` 源文件为`.water`虚拟机指令。
* **单个文件编译:**
```bash ```bash
# 单个文件编译 Snow complete [SnowCode].snow
Snow.exe [SnowCode].snow ```
# 多个文件编译
Snow.exe [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow
# 目录递归编译(-d 参数)
Snow.exe -d path/to/source_dir
* **多个文件编译:**
编译器会输出源代码,AST,IR 和 VM 指令等内容,并自动执行虚拟机引擎,最后打印所有局部变量的值 ```bash
2. **查看 AST/IR/VM 输出**:在编译器输出中,可看到 `### AST`,`### IR``### VM code` 等分段内容。AST 部分为 JSON 格式,IR 和 VM 部分为逐行指令文本。 Snow complete [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow -o [Name]
```
* **目录递归编译:**
```bash
Snow -d path/to/source_dir
```
2. **查看编译输出:**
编译过程会输出源代码、抽象语法树AST、中间表示IR以及虚拟机指令等内容。你可以看到如下几个分段输出:
* **AST**(抽象语法树)部分以 JSON 格式输出。
* **IR**(中间表示)部分会列出逐行的中间代码。
* **VM code**(虚拟机指令)会展示虚拟机的字节码指令。
3. **默认执行模式:**
编译器会在 **RUN 模式** 下运行,**DEBUG 模式**显示详细的执行过程和状态,并且在虚拟机中执行编译后的代码,最后会打印出所有局部变量的值。
---
### 2. **集成编译 (Integrated Compilation)**
集成编译需要使用 `.cloud` 文件来指定项目的配置和结构,适用于项目标准化、依赖管理、构建管理和项目分发等场景。
#### 集成编译命令:
1. **基本用法:**
```bash
snow [OPTIONS] <command>
```
2. **命令选项:**
* `-h, --help`: 显示帮助信息并退出。
* `-v, --version`: 打印 Snow 编程语言的版本并退出。
3. **可用命令:**
* `compile`: 将 `.snow` 源文件编译成虚拟机字节码文件(`.water`)。此命令会使用 `.cloud` 文件来指导编译过程。
* `clean`: 清理构建输出和本地缓存,移除中间产物,释放磁盘空间。
* `version`: 打印 Snow 的版本。
* `run`: 运行已编译的虚拟机字节码文件(`.water`)。
* `init`: 初始化一个新项目,生成 `project.cloud` 文件。
* `generate`: 根据 `project.cloud` 生成项目目录结构。
* `build`: 构建当前项目,按顺序解析依赖、编译和打包。
4. **例如,执行集成编译命令:**
```bash
snow compile [SnowCode].snow
```
* 此命令会使用 `.cloud` 文件中的配置信息来指导编译过程,并生成 `.water`
5. **使用帮助:**
如果你需要了解某个命令的详细选项,可以使用:
```bash
snow <command> --help
```
例如,查看 `compile` 命令的具体选项:
```bash
snow compile --help
```
---
## 示例代码片段 ## 示例代码片段
以下是一个简单的 Snow 代码示例,演示模块定义,导入和函数声明的基本语法: 以下是一个简单的 Snow 代码示例,演示模块定义,导入和函数声明的基本语法:
```snow ```snow
module: Math module: Math
function: main function: main
parameter: returns: int
return_type: int
body: body:
Math.factorial(6) Math.factorial(6)
return 0 return 0
@ -286,17 +502,17 @@ module: Math
end function end function
function: factorial function: factorial
parameter: params:
declare n:int declare n:int
return_type: int returns: int
body: body:
declare num1:int = 1 declare num1:int = 1
loop: loop:
initializer: init:
declare counter:int = 1 declare counter:int = 1
condition: cond:
counter <= n counter <= n
update: step:
counter = counter + 1 counter = counter + 1
body: body:
num1 = num1 * counter num1 = num1 * counter
@ -306,34 +522,72 @@ module: Math
end body end body
end function end function
end module end module
``` ```
上述代码定义了一个名为 `Math` 的模块,其中包含两个函数 上述代码定义了一个名为 `Math` 的模块,其中包含两个函数:
* `main`:不接收任何参数,返回类型为 `int`。在函数体内调用了 `Math.factorial(6)`,然后返回 `0` * `main`: 不接收任何参数,返回类型为 `int`。在函数体内调用了 `Math.factorial(6)`,然后返回 `0`
* `factorial`:接收一个 `int` 类型的参数 `n`,返回类型为 `int`。函数体内先声明并初始化局部变量 `num1``1`,然后通过一个 `loop` 循环(从 `counter = 1``counter <= n`)依次将 `num1` 乘以 `counter`,循环结束后返回 `num1`,即 `n` 的阶乘值。 * `factorial`: 接收一个 `int` 类型的参数 `n`,返回类型为 `int`。函数体内先声明并初始化局部变量 `num1``1`,然后通过一个
`loop` 循环(从 `counter = 1``counter <= n`)依次将 `num1` 乘以 `counter`,循环结束后返回 `num1`,即 `n` 的阶乘值。
> 更多示例代码见 [playground 目录](https://gitee.com/jcnc-org/snow/tree/main/playground)
## 项目结构说明 ## 项目结构说明
* `compiler/`Snow 编译器源代码目录 * `compiler/`: Snow 编译器源代码目录
* `cli/`:命令行接口,包括 `SnowCompiler` 主程序 * `lexer/`: 词法分析模块,负责将源码切分为 Token
* `lexer/`:词法分析模块,负责将源码切分为 Token * `parser/`: 语法分析模块,将 Token 流解析为 AST含模块/函数/语句解析)
* `parser/`:语法分析模块,将 Token 流解析为 AST包括模块解析,函数解析,语句解析等子模块 * `semantic/`: 语义分析模块,负责符号表管理、类型检查等
* `semantic/`:语义分析模块,负责符号表管理,类型检查等 * `ir/`: 中间表示IR模块生成并管理三地址码形式的中间代码
* `ir/`中间表示IR模块,生成和管理三地址码形式的中间代码 * `backend/`: 编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器
* `backend/`:编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器
* `vm/`:虚拟机相关源代码目录 * `vm/`: 虚拟机相关源代码目录
* `commands/`: 定义 SnowVM 指令集的具体实现
* `engine/`: 核心执行引擎,提供指令执行和寄存器/栈管理
* `execution/`: 执行流程控制(按指令顺序执行、分支跳转等)
* `io/`: 输入输出辅助类(加载指令、文件解析等)
* `gui/`: Swing 可视化调试面板,实时展示局部变量表
* `factories/``utils/`: 指令创建、日志调试等公共工具
* `pkg/`: 内置构建与包管理器 **snow pkg**
* `dsl/`: `.cloud` 描述文件解析器
* `tasks/`: 预设任务实现(`clean · compile · run · package · publish` 等)
* `resolver/`: 本地/远程仓库解析与缓存
* `lifecycle/`: 任务生命周期钩子pre/post 脚本等)
* `model/`: 项目、依赖、版本等模型
* `utils/`: 文件、日志、校验和等通用工具
* `doc/`: 开发者文档与示例 `.cloud` 配置
* `cli/`: 独立的命令行前端
* `commands/`: `compile` / `run` / `pkg` 等子命令实现
* `api/`: 公共选项解析、终端交互抽象
* `utils/`: 终端颜色、进度条、异常格式化等
* `SnowCLI.java`: CLI 主入口
## 版权声明
版权所有 © 2025 许轲Luke代表 SnowLang 项目。
仓库地址: <https://gitee.com/jcnc-org/snow>
本项目依据 [Apache 2.0 许可证](LICENSE) 进行许可和发布。
“SnowLang 项目”为由许轲Luke发起的独立开源项目。
未来,项目可能会成立正式的组织或实体,以进一步负责本项目的开发和管理。
## 支持我们
如果你喜欢我们的项目,欢迎给我们一个 Star
你们的关注和支持,是我们团队持续进步的动力源泉!谢谢大家!
* `commands/`:定义 VM 指令集的具体实现
* `engine/`:核心执行引擎,提供指令执行和寄存器栈管理
* `execution/`:执行流程控制(按指令顺序执行,分支跳转等)
* `io/`:输入输出辅助类(加载指令,文件解析等)
* 其他如 `factories/`,`utils/` 等目录包含指令创建和调试工具类
## 加入我们 ## 加入我们
* 微信: `xuxiaolankaka`
* QQ: `1399528359` - 微信: `xuxiaolankaka`
* E-Mail: `luke.k.xu@hotmail.com` - QQ: `1399528359`
- 邮箱: `luke.k.xu [at] hotmail.com`

View File

@ -2,27 +2,27 @@
在执行 `build-project2tar.ps1` 脚本之前,您需要确保 PowerShell 的执行策略允许运行脚本。默认情况下PowerShell 可能阻止未签名的脚本执行。因此,您需要设置适当的执行策略。 在执行 `build-project2tar.ps1` 脚本之前,您需要确保 PowerShell 的执行策略允许运行脚本。默认情况下PowerShell 可能阻止未签名的脚本执行。因此,您需要设置适当的执行策略。
#### 步骤 1以管理员身份打开 PowerShell #### 步骤 1: 以管理员身份打开 PowerShell
* 在 Windows 系统中,搜索 **PowerShell**,右键点击 **Windows PowerShell**,并选择 **以管理员身份运行** * 在 Windows 系统中,搜索 **PowerShell**,右键点击 **Windows PowerShell**,并选择 **以管理员身份运行**
#### 步骤 2设置 PowerShell 执行策略 #### 步骤 2: 设置 PowerShell 执行策略
为了允许执行 PowerShell 脚本,您需要调整当前用户的执行策略。输入以下命令并按 Enter 为了允许执行 PowerShell 脚本,您需要调整当前用户的执行策略。输入以下命令并按 Enter:
```powershell ```powershell
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
``` ```
#### 解释 #### 解释:
* `-Scope CurrentUser`此参数指定该执行策略仅对当前用户有效,而不会影响系统范围内的其他用户。 * `-Scope CurrentUser`: 此参数指定该执行策略仅对当前用户有效,而不会影响系统范围内的其他用户。
* `-ExecutionPolicy RemoteSigned`:此策略表示: * `-ExecutionPolicy RemoteSigned`: 此策略表示:
* 本地创建的脚本可以直接运行。 * 本地创建的脚本可以直接运行。
* 从互联网下载的脚本必须具备有效的数字签名才能运行。没有签名的脚本将无法执行,除非您先解除阻止该脚本。 * 从互联网下载的脚本必须具备有效的数字签名才能运行。没有签名的脚本将无法执行,除非您先解除阻止该脚本。
#### 步骤 3运行 `build-project2tar.ps1` 脚本 #### 步骤 3: 运行 `build-project2tar.ps1` 脚本
设置完成后,您可以在 PowerShell 中运行 `build-project2tar.ps1` 脚本。确保您已经切换到包含该脚本的目录,或提供完整的文件路径来执行它。 设置完成后,您可以在 PowerShell 中运行 `build-project2tar.ps1` 脚本。确保您已经切换到包含该脚本的目录,或提供完整的文件路径来执行它。

View File

@ -0,0 +1,48 @@
# Set the tar package name
$tarName = "Snow.tar"
# Get the script's current directory (build folder)
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
# Get the parent directory (the project root)
$parentDir = Split-Path -Parent $scriptDir
# Set the full path to the tar package
$tarPath = Join-Path $parentDir $tarName
# Output message: starting to create tar package
Write-Output "Starting to create tar package: $tarName in $parentDir ..."
# Remove old tar package if it exists
if (Test-Path $tarPath) {
Write-Output "Found an old $tarName, removing it..."
Remove-Item $tarPath -Force
}
# Make sure the tar command is available
$tarCommand = "tar"
if (-not (Get-Command $tarCommand -ErrorAction SilentlyContinue)) {
Write-Error "❌ 'tar' command is not available. Please make sure 'tar' is installed and can be run from PowerShell."
exit 1
}
# Execute tar: change to org\jcnc directory and compress the snow folder
try {
# Build the command and run it
$tarCommandArgs = "-cf", $tarPath, "-C", "$scriptDir\..\src\main\java\org\jcnc", "snow"
Write-Output "Running tar command: tar $tarCommandArgs"
& $tarCommand @tarCommandArgs
} catch {
Write-Error "❌ Failed to create tar package. Error: $_"
exit 1
}
# Check if tar package was created successfully
if (Test-Path $tarPath) {
Write-Output "✅ Successfully created $tarName"
exit 0
} else {
Write-Error "❌ Creation failed. Please check the tar command and paths."
exit 1
}

129
build/build-release-all.ps1 Normal file
View File

@ -0,0 +1,129 @@
param(
[string]$LogDir = (Join-Path $PSScriptRoot 'target\parallel-logs')
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$winScript = Join-Path $PSScriptRoot 'release-windows.ps1'
$linScript = Join-Path $PSScriptRoot 'release-linux.ps1'
if (-not (Test-Path $winScript)) { throw "File not found: $winScript" }
if (-not (Test-Path $linScript)) { throw "File not found: $linScript" }
$winLogOut = [System.IO.Path]::GetTempFileName()
$winLogErr = [System.IO.Path]::GetTempFileName()
$linLogOut = [System.IO.Path]::GetTempFileName()
$linLogErr = [System.IO.Path]::GetTempFileName()
$winProc = Start-Process powershell.exe -ArgumentList @('-NoProfile','-ExecutionPolicy','Bypass','-File',"`"$winScript`"") `
-RedirectStandardOutput $winLogOut -RedirectStandardError $winLogErr -NoNewWindow -PassThru
$linProc = Start-Process powershell.exe -ArgumentList @('-NoProfile','-ExecutionPolicy','Bypass','-File',"`"$linScript`"") `
-RedirectStandardOutput $linLogOut -RedirectStandardError $linLogErr -NoNewWindow -PassThru
$winPosOut = 0
$winPosErr = 0
$linPosOut = 0
$linPosErr = 0
Write-Host "===== Build Started ====="
while (-not $winProc.HasExited -or -not $linProc.HasExited) {
# windows-release stdout
if (Test-Path $winLogOut) {
$size = (Get-Item $winLogOut).Length
if ($size -gt $winPosOut) {
$fs = [System.IO.File]::Open($winLogOut, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
$fs.Position = $winPosOut
$sr = New-Object System.IO.StreamReader($fs)
while (!$sr.EndOfStream) {
$line = $sr.ReadLine()
if ($line) { Write-Host "[windows-release][OUT] $line" }
}
$winPosOut = $fs.Position
$sr.Close()
$fs.Close()
}
}
# windows-release stderr
if (Test-Path $winLogErr) {
$size = (Get-Item $winLogErr).Length
if ($size -gt $winPosErr) {
$fs = [System.IO.File]::Open($winLogErr, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
$fs.Position = $winPosErr
$sr = New-Object System.IO.StreamReader($fs)
while (!$sr.EndOfStream) {
$line = $sr.ReadLine()
if ($line) { Write-Host "[windows-release][ERR] $line" -ForegroundColor Red }
}
$winPosErr = $fs.Position
$sr.Close()
$fs.Close()
}
}
# linux-release stdout
if (Test-Path $linLogOut) {
$size = (Get-Item $linLogOut).Length
if ($size -gt $linPosOut) {
$fs = [System.IO.File]::Open($linLogOut, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
$fs.Position = $linPosOut
$sr = New-Object System.IO.StreamReader($fs)
while (!$sr.EndOfStream) {
$line = $sr.ReadLine()
if ($line) { Write-Host "[linux-release][OUT] $line" }
}
$linPosOut = $fs.Position
$sr.Close()
$fs.Close()
}
}
# linux-release stderr
if (Test-Path $linLogErr) {
$size = (Get-Item $linLogErr).Length
if ($size -gt $linPosErr) {
$fs = [System.IO.File]::Open($linLogErr, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
$fs.Position = $linPosErr
$sr = New-Object System.IO.StreamReader($fs)
while (!$sr.EndOfStream) {
$line = $sr.ReadLine()
if ($line) { Write-Host "[linux-release][ERR] $line" -ForegroundColor Red }
}
$linPosErr = $fs.Position
$sr.Close()
$fs.Close()
}
}
Start-Sleep -Milliseconds 200
}
# After processes exit, print any remaining output
$tasks = @(
@{proc=$winProc; log=$winLogOut; tag='windows-release'; type='OUT'; skip=$winPosOut},
@{proc=$winProc; log=$winLogErr; tag='windows-release'; type='ERR'; skip=$winPosErr},
@{proc=$linProc; log=$linLogOut; tag='linux-release'; type='OUT'; skip=$linPosOut},
@{proc=$linProc; log=$linLogErr; tag='linux-release'; type='ERR'; skip=$linPosErr}
)
foreach ($item in $tasks) {
if (Test-Path $item.log) {
$fs = [System.IO.File]::Open($item.log, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
$fs.Position = $item.skip
$sr = New-Object System.IO.StreamReader($fs)
while (!$sr.EndOfStream) {
$line = $sr.ReadLine()
if ($line) {
if ($item.type -eq 'ERR') {
Write-Host "[$($item.tag)][ERR] $line" -ForegroundColor Red
} else {
Write-Host "[$($item.tag)][OUT] $line"
}
}
}
$sr.Close()
$fs.Close()
}
}
Write-Host ""
Write-Host "All tasks completed successfully." -ForegroundColor Green
Remove-Item $winLogOut, $winLogErr, $linLogOut, $linLogErr -Force
exit 0

View File

@ -1,47 +0,0 @@
# 设定 tar 包的名称
$tarName = "Snow.tar"
# 获取脚本当前目录build文件夹
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
# 获取上一级目录snow 根目录)
$parentDir = Split-Path -Parent $scriptDir
# 设置 tar 包的完整路径
$tarPath = Join-Path $parentDir $tarName
# 输出开始创建 tar 包的消息
Write-Output "开始创建 tar 包:$tarName$parentDir ..."
# 如果存在旧 tar 包,先删除它
if (Test-Path $tarPath) {
Write-Output "发现旧的 $tarName,正在删除..."
Remove-Item $tarPath -Force
}
# 确保 tar 命令可用
$tarCommand = "tar"
if (-not (Get-Command $tarCommand -ErrorAction SilentlyContinue)) {
Write-Error "❌ tar 命令不可用。请确保 tar 已安装并可在 PowerShell 中执行。"
exit 1
}
# 执行打包操作:切换到 org\jcnc 目录下再压缩 snow 文件夹
try {
# 构建命令并执行
$tarCommandArgs = "-cf", $tarPath, "-C", "$scriptDir\..\src\main\java\org\jcnc", "snow"
Write-Output "执行 tar 命令: tar $tarCommandArgs"
& $tarCommand @tarCommandArgs
} catch {
Write-Error "❌ 创建 tar 包失败。错误信息:$_"
exit 1
}
# 检查 tar 包是否创建成功
if (Test-Path $tarPath) {
Write-Output "✅ 成功创建 $tarName"
} else {
Write-Error "❌ 创建失败,请检查 tar 命令和路径是否正确。"
exit 1
}

136
build/release-linux.ps1 Normal file
View File

@ -0,0 +1,136 @@
# run-linux-snow-export.ps1
# Build and package linux-snow-export, version read from SNOW_VERSION in .env
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
# Import shared dotenv parser function
. "$PSScriptRoot\tools\dotenv.ps1"
Write-Host "Step 0: Generate .env..."
try {
& "$PSScriptRoot\tools\generate-dotenv.ps1" -ErrorAction Stop
} catch {
Write-Error "Failed to generate .env: $( $_.Exception.Message )"
exit 1
}
Write-Host "Step 1: Build and run linux-snow-export..."
docker compose run --build --rm linux-snow-export
if ($LASTEXITCODE -ne 0) {
Write-Error "Build & Run failed, exiting script."
exit $LASTEXITCODE
}
Write-Host "Step 2: Run linux-snow-export without rebuild..."
docker compose run --rm linux-snow-export
if ($LASTEXITCODE -ne 0) {
Write-Error "Run without rebuild failed, exiting script."
exit $LASTEXITCODE
}
# ===== Step 3: Read version from .env =====
$projectRoot = Resolve-Path (Join-Path $PSScriptRoot "..")
$dotenvPath = Join-Path $projectRoot ".env"
if (-not (Test-Path -LiteralPath $dotenvPath)) {
Write-Error ".env not found at: $dotenvPath"
exit 1
}
$version = Read-DotEnvValue -FilePath $dotenvPath -Key 'SNOW_VERSION'
if (-not $version) {
Write-Error "SNOW_VERSION not found in .env"
exit 1
}
# ===== Step 4: Define output paths =====
$targetDir = Join-Path $projectRoot "target\release"
$outDir = Join-Path $targetDir "Snow-v$version-linux-x64"
$tgzPath = Join-Path $targetDir "Snow-v$version-linux-x64.tgz"
# ===== Step 5: Package to .tgz (no extra top-level dir, max compression) =====
Write-Host "Step 5: Package to .tgz..."
if (-not (Test-Path -LiteralPath $outDir)) {
Write-Error "Output directory not found: $outDir"
exit 1
}
# Ensure target directory exists
if (-not (Test-Path -LiteralPath $targetDir)) {
New-Item -ItemType Directory -Force -Path $targetDir | Out-Null
}
# Remove old package if exists
if (Test-Path -LiteralPath $tgzPath) {
Write-Host "→ Removing existing tgz: $tgzPath"
Remove-Item -LiteralPath $tgzPath -Force
}
function Invoke-TarGz {
param(
[Parameter(Mandatory = $true)][string]$SourceDir,
[Parameter(Mandatory = $true)][string]$DestTgz
)
$tarExe = "tar"
$isWindows = $env:OS -eq 'Windows_NT'
if ($isWindows) {
$psi = @{
FilePath = $tarExe
ArgumentList= @("-C", $SourceDir, "-czf", $DestTgz, ".")
NoNewWindow = $true
Wait = $true
}
try {
$p = Start-Process @psi -PassThru -ErrorAction Stop
$p.WaitForExit()
if ($p.ExitCode -ne 0) {
throw "tar exited with code $($p.ExitCode)"
}
} catch {
throw "Packaging failed (Windows tar): $($_.Exception.Message)"
}
} else {
try {
$psi = @{
FilePath = $tarExe
ArgumentList= @("-C", $SourceDir, "-c", "-f", $DestTgz, "-I", "gzip -9", ".")
NoNewWindow = $true
Wait = $true
}
$p = Start-Process @psi -PassThru -ErrorAction Stop
$p.WaitForExit()
if ($p.ExitCode -eq 0) { return }
} catch { }
try {
$psi = @{
FilePath = $tarExe
ArgumentList= @("-C", $SourceDir, "-c", "-z", "-f", $DestTgz, ".")
NoNewWindow = $true
Wait = $true
}
$p = Start-Process @psi -PassThru -ErrorAction Stop
$p.WaitForExit()
if ($p.ExitCode -ne 0) {
throw "tar exited with code $($p.ExitCode)"
}
} catch {
throw "Packaging failed (Linux tar): $($_.Exception.Message)"
}
}
}
try {
Invoke-TarGz -SourceDir $outDir -DestTgz $tgzPath
} catch {
Write-Error $_.Exception.Message
exit 1
}
Write-Host ">>> Package ready!" -ForegroundColor Green
Write-Host "Version : $version"
Write-Host "Output Dir : $outDir"
Write-Host "Tgz File : $tgzPath"

117
build/release-windows.ps1 Normal file
View File

@ -0,0 +1,117 @@
# release-windows.ps1
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'
Set-StrictMode -Version Latest
# Import shared dotenv parser function
. "$PSScriptRoot\tools\dotenv.ps1"
# ===== Utility Functions =====
function Find-PomUpwards([string]$startDir) {
$dir = Resolve-Path $startDir
while ($true) {
$pom = Join-Path $dir "pom.xml"
if (Test-Path $pom) { return $pom }
$parent = Split-Path $dir -Parent
if ($parent -eq $dir -or [string]::IsNullOrEmpty($parent)) { return $null }
$dir = $parent
}
}
# ===== Step 0: Generate .env =====
Write-Host "Step 0: Generate .env..."
try {
& "$PSScriptRoot\tools\generate-dotenv.ps1" -ErrorAction Stop
} catch {
Write-Error "Failed to generate .env: $($_.Exception.Message)"
exit 1
}
# ===== Step 1: Locate project root & build =====
Write-Host "Step 1: Locate project root and build..."
$pom = Find-PomUpwards -startDir $PSScriptRoot
if (-not $pom) {
Write-Error "pom.xml not found. Please run this script within the project."
exit 1
}
$projectRoot = Split-Path $pom -Parent
Push-Location $projectRoot
try {
Write-Host "→ Running: mvn clean package"
mvn clean package
if ($LASTEXITCODE -ne 0) {
Write-Error "Maven build failed, exiting script."
exit $LASTEXITCODE
}
# ===== Step 2: Read SNOW_VERSION =====
Write-Host "Step 2: Read SNOW_VERSION from .env..."
$dotenvPath = Join-Path $projectRoot ".env"
$snowVersion = Read-DotEnvValue -FilePath $dotenvPath -Key "SNOW_VERSION"
if (-not $snowVersion) {
Write-Host "SNOW_VERSION not found in .env, using placeholder 0.0.0." -ForegroundColor Yellow
$snowVersion = "0.0.0"
}
Write-Host "SNOW_VERSION = $snowVersion"
# ===== Step 3: Prepare release directory structure =====
Write-Host "Step 3: Prepare release directory structure..."
$targetDir = Join-Path $projectRoot "target"
$exePath = Join-Path $targetDir "Snow.exe"
if (-not (Test-Path $exePath)) {
Write-Error "Expected build artifact not found: $exePath"
exit 1
}
$verName = "Snow-v${snowVersion}-windows-x64"
$releaseRoot = Join-Path $targetDir "release"
$outDir = Join-Path $releaseRoot $verName
$binDir = Join-Path $outDir "bin"
$libDir = Join-Path $outDir "lib"
# Clean old directory
if (Test-Path $outDir) {
Write-Host "→ Cleaning previous output directory..."
Remove-Item $outDir -Recurse -Force
}
New-Item -ItemType Directory -Force -Path $binDir | Out-Null
Copy-Item -Path $exePath -Destination (Join-Path $binDir "Snow.exe") -Force
Write-Host ">>> Collected Snow.exe"
# Optional lib
$projectLib = Join-Path $projectRoot "lib"
if (Test-Path $projectLib) {
New-Item -ItemType Directory -Force -Path $libDir | Out-Null
Copy-Item -Path (Join-Path $projectLib "*") -Destination $libDir -Recurse -Force
Write-Host ">>> Copied lib directory"
} else {
Write-Host ">>> lib directory not found, skipping." -ForegroundColor Yellow
}
# ===== Step 4: Create release zip =====
Write-Host "Step 4: Create release zip..."
New-Item -ItemType Directory -Force -Path $releaseRoot | Out-Null
$zipPath = Join-Path $releaseRoot ("{0}.zip" -f $verName)
if (Test-Path $zipPath) {
Write-Host "→ Removing existing zip: $zipPath"
Remove-Item $zipPath -Force
}
try {
Compress-Archive -Path (Join-Path $outDir '*') -DestinationPath $zipPath -CompressionLevel Optimal -Force
} catch {
Write-Error "Failed to create zip: $($_.Exception.Message)"
exit 1
}
Write-Host ">>> Package ready!" -ForegroundColor Green
Write-Host "Version : $snowVersion"
Write-Host "Output Dir : $outDir"
Write-Host "Zip File : $zipPath"
}
finally {
Pop-Location
}

53
build/tools/dotenv.ps1 Normal file
View File

@ -0,0 +1,53 @@
# tools/dotenv.ps1
# Unified .env reader function:
# - Supports `KEY=VAL` and `export KEY=VAL`
# - Skips blank lines and comments
# - Handles quoted values (single or double quotes)
# - Allows inline comments at the end of a line (space + #)
# - If the same KEY is defined multiple times, the last one takes precedence
Set-StrictMode -Version Latest
function Read-DotEnvValue {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)][string]$FilePath,
[Parameter(Mandatory=$true)][string]$Key
)
if (-not (Test-Path -LiteralPath $FilePath)) { return $null }
# Match the target key (escaped), allowing optional "export" prefix
$pattern = '^(?:\s*export\s+)?(?<k>' + [regex]::Escape($Key) + ')\s*=\s*(?<v>.*)$'
$value = $null
# Read line by line for large file compatibility
Get-Content -LiteralPath $FilePath | ForEach-Object {
$line = $_
# Skip blank lines and full-line comments
if ($line -match '^\s*$') { return }
if ($line -match '^\s*#') { return }
if ($line -match $pattern) {
$v = $matches['v']
# Remove surrounding quotes if present
$trimmed = $v.Trim()
if ($trimmed -match '^\s*"(.*)"\s*$') {
$v = $matches[1]
} elseif ($trimmed -match "^\s*'(.*)'\s*$") {
$v = $matches[1]
} else {
# Strip inline comments (space + # …), ignoring escaped \#
if ($v -match '^(.*?)(?<!\\)\s+#.*$') {
$v = $matches[1]
}
}
$value = $v.Trim()
}
}
return $value
}

View File

@ -0,0 +1,23 @@
# build\tools\generate-dotenv.ps1
# Repository root: go up two levels from build\tools\
$repoRoot = (Get-Item $PSScriptRoot).Parent.Parent.FullName
$envPath = Join-Path $repoRoot ".env"
$pomPath = Join-Path $repoRoot "pom.xml"
if (-not (Test-Path $pomPath -PathType Leaf)) {
throw "pom.xml not found: $pomPath"
}
[xml]$pom = Get-Content $pomPath -Encoding UTF8
$version = $pom.project.version
$lines = @(
"# Auto-generated by build\tools\generate-dotenv.ps1"
"SNOW_VERSION=$version"
)
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
[System.IO.File]::WriteAllLines($envPath, $lines, $utf8NoBom)
Write-Host "Generated/overwritten $envPath (version: $version)"
return

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

24
docker-compose.yml Normal file
View File

@ -0,0 +1,24 @@
services:
# Run with: docker compose run --rm linux-snow-export
linux-snow-export:
build:
context: .
target: export
command:
- /bin/sh
- -c
- |
set -e
ver="Snow-v${SNOW_VERSION}-linux-x64"
mkdir -p "/output/release/$$ver/bin"
cp /export/Snow "/output/release/$$ver/bin/"
if [ -d /export/lib ]; then
mkdir -p "/output/release/$$ver/lib"
cp -a /export/lib/. "/output/release/$$ver/lib/"
fi
tar -C /output/release -czf "/output/release/$$ver.tgz" "$$ver"
volumes:
- ./target:/output
- ./lib:/export/lib:ro
env_file:
- .env

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 455 B

After

Width:  |  Height:  |  Size: 455 B

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 976 B

After

Width:  |  Height:  |  Size: 976 B

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -2,7 +2,7 @@
## 1. 版本控制基础 ## 1. 版本控制基础
本项目使用 Git 进行版本控制,并遵循以下基本原则 本项目使用 Git 进行版本控制,并遵循以下基本原则:
* 所有代码更改必须通过 Git 提交,并推送至远程仓库。 * 所有代码更改必须通过 Git 提交,并推送至远程仓库。
* 每次提交必须包括清晰、简洁且具描述性的提交信息,确保团队成员能够轻松理解变更的目的和内容。 * 每次提交必须包括清晰、简洁且具描述性的提交信息,确保团队成员能够轻松理解变更的目的和内容。
@ -10,23 +10,23 @@
## 2. 分支管理 ## 2. 分支管理
本项目采用以下分支策略进行代码管理 本项目采用以下分支策略进行代码管理:
### 2.1 主分支 (`main`) ### 2.1 主分支 (`main`)
* **用途**`main` 分支始终保持项目的稳定版本,且此分支的代码随时可以部署到生产环境。 * **用途**: `main` 分支始终保持项目的稳定版本,且此分支的代码随时可以部署到生产环境。
* **更新规则**仅允许经过充分测试并审查的代码合并到 `main` 分支。每次从 `dev``release` 分支合并到 `main` 时,必须打上版本标签。 * **更新规则**: 仅允许经过充分测试并审查的代码合并到 `main` 分支。每次从 `dev``release` 分支合并到 `main` 时,必须打上版本标签。
### 2.2 开发分支 (`dev`) ### 2.2 开发分支 (`dev`)
* **用途**`dev` 分支是所有开发工作的集成分支。所有的新功能开发应首先合并至 `dev` 分支,并经过集成测试后再合并到 `main` * **用途**: `dev` 分支是所有开发工作的集成分支。所有的新功能开发应首先合并至 `dev` 分支,并经过集成测试后再合并到 `main`
* **更新规则**所有功能开发完成后,应合并至 `dev` 分支进行集成测试,确认没有问题后再合并到 `main` * **更新规则**: 所有功能开发完成后,应合并至 `dev` 分支进行集成测试,确认没有问题后再合并到 `main`
### 2.3 功能分支 (`feature/*`) ### 2.3 功能分支 (`feature/*`)
* **用途**每个新功能的开发都应从 `dev` 分支创建一个独立的功能分支。 * **用途**: 每个新功能的开发都应从 `dev` 分支创建一个独立的功能分支。
* **命名规范**`feature/功能描述`,例如:`feature/ast-folding``feature/user-cli`。所有分支名称应使用小写字母,并且使用破折号(`-`)分隔单词。 * **命名规范**: `feature/功能描述`,例如: `feature/ast-folding``feature/user-cli`。所有分支名称应使用小写字母,并且使用破折号(`-`)分隔单词。
* **开发流程** * **开发流程**:
1. 从 `dev` 分支拉取最新代码。 1. 从 `dev` 分支拉取最新代码。
2. 完成功能开发后,在本地提交代码并推送至远程仓库。 2. 完成功能开发后,在本地提交代码并推送至远程仓库。
@ -34,9 +34,9 @@
### 2.4 修复分支 (`bugfix/*`) ### 2.4 修复分支 (`bugfix/*`)
* **用途**用于修复 Bug修复分支可以从 `dev``main` 分支创建。 * **用途**: 用于修复 Bug修复分支可以从 `dev``main` 分支创建。
* **命名规范**`bugfix/bug描述`,例如:`bugfix/fix-ast-error` * **命名规范**: `bugfix/bug描述`,例如: `bugfix/fix-ast-error`
* **开发流程** * **开发流程**:
1. 从 `dev``main` 分支拉取最新代码。 1. 从 `dev``main` 分支拉取最新代码。
2. 完成修复后,提交修改并推送至远程仓库。 2. 完成修复后,提交修改并推送至远程仓库。
@ -44,9 +44,9 @@
### 2.5 发布分支 (`release/*`) ### 2.5 发布分支 (`release/*`)
* **用途**`dev` 分支的功能开发完成且准备发布时,应创建一个 `release` 分支进行发布准备。 * **用途**: `dev` 分支的功能开发完成且准备发布时,应创建一个 `release` 分支进行发布准备。
* **命名规范**`release/vX.X.X`,例如:`release/v1.0.0` * **命名规范**: `release/vX.X.X`,例如: `release/v1.0.0`
* **开发流程** * **开发流程**:
1. 从 `dev` 分支创建 `release` 分支。 1. 从 `dev` 分支创建 `release` 分支。
2. 在 `release` 分支上进行版本发布的最终准备工作,如文档更新、版本号调整等。 2. 在 `release` 分支上进行版本发布的最终准备工作,如文档更新、版本号调整等。
@ -54,24 +54,24 @@
### 2.6 热修复分支 (`hotfix/*`) ### 2.6 热修复分支 (`hotfix/*`)
* **用途**当生产环境中发现紧急问题(如 Bug 或系统崩溃等),需在 `main` 分支上进行快速修复时,应创建一个 `hotfix` 分支进行修复。 * **用途**: 当生产环境中发现紧急问题(如 Bug 或系统崩溃等),需在 `main` 分支上进行快速修复时,应创建一个 `hotfix` 分支进行修复。
* **命名规范**`hotfix/bug描述`,例如:`hotfix/fix-production-crash` * **命名规范**: `hotfix/bug描述`,例如: `hotfix/fix-production-crash`
* **开发流程** * **开发流程**:
1. 从 `main` 分支创建 `hotfix` 分支,确保该分支包含生产环境中最新的稳定版本。 1. 从 `main` 分支创建 `hotfix` 分支,确保该分支包含生产环境中最新的稳定版本。
2. 在 `hotfix` 分支上进行问题修复和相关调整。 2. 在 `hotfix` 分支上进行问题修复和相关调整。
3. 完成修复后,提交修改并推送至远程仓库。 3. 完成修复后,提交修改并推送至远程仓库。
4. 创建拉取请求PR`hotfix` 分支合并至 `main` 分支并打上版本标签,确保生产环境修复生效。 4. 创建拉取请求PR`hotfix` 分支合并至 `main` 分支并打上版本标签,确保生产环境修复生效。
5. 将修复后的变更合并回 `dev` 分支,确保所有的修复和调整同步到开发分支,防止后续开发中出现同样的问题。 5. 将修复后的变更合并回 `dev` 分支,确保所有的修复和调整同步到开发分支,防止后续开发中出现同样的问题。
6. **回滚策略**如果热修复未能解决问题,立即回滚合并,删除 `hotfix` 分支并通知团队,确保不影响生产环境。 6. **回滚策略**: 如果热修复未能解决问题,立即回滚合并,删除 `hotfix` 分支并通知团队,确保不影响生产环境。
## 3. 提交规范 ## 3. 提交规范
为确保提交信息清晰且易于理解,遵循以下提交规范 为确保提交信息清晰且易于理解,遵循以下提交规范:
### 3.1 提交信息格式 ### 3.1 提交信息格式
提交信息应简洁且具有描述性,格式如下 提交信息应简洁且具有描述性,格式如下:
``` ```
[类型] 描述 [类型] 描述
@ -81,20 +81,20 @@
#### 提交类型 #### 提交类型
* `feat`新增功能 * `feat`: 新增功能
* `fix`修复 Bug * `fix`: 修复 Bug
* `docs`文档更新 * `docs`: 文档更新
* `style`代码格式调整(不影响功能) * `style`: 代码格式调整(不影响功能)
* `refactor`代码重构 * `refactor`: 代码重构
* `test`增加/修改测试 * `test`: 增加/修改测试
* `chore`工具配置等其他杂项任务 * `chore`: 工具配置等其他杂项任务
* `ci`持续集成相关改动 * `ci`: 持续集成相关改动
* `perf`性能优化 * `perf`: 性能优化
#### 示例 #### 示例
* `feat: 添加 IR 折叠功能` * `feat: 添加 IR 折叠功能`
* `fix: 修复问题 Y原因X bug解决方案Z` * `fix: 修复问题 Y原因: X bug解决方案: Z`
* `docs: 更新 API 文档` * `docs: 更新 API 文档`
* `refactor: 优化 AST 逻辑` * `refactor: 优化 AST 逻辑`
@ -114,7 +114,7 @@
### 4.2 代码审查 ### 4.2 代码审查
* 所有 PR 必须经过至少一名开发者的代码审查。 * 所有 PR 必须经过至少一名开发者的代码审查。
* 审查时应关注以下方面 * 审查时应关注以下方面:
* 代码是否符合项目的编码规范。 * 代码是否符合项目的编码规范。
* 是否提供了足够的单元测试覆盖。 * 是否提供了足够的单元测试覆盖。
@ -124,14 +124,14 @@
## 5. 版本发布 ## 5. 版本发布
版本发布基于 Git 标签,发布流程如下 版本发布基于 Git 标签,发布流程如下:
### 5.1 打标签 ### 5.1 打标签
每当版本准备发布时,应在 `main` 分支上打上版本标签 每当版本准备发布时,应在 `main` 分支上打上版本标签:
* **版本号规则**采用语义化版本控制SemVer格式版本号由三部分组成`主版本号.次版本号.修订号`(例如:`v1.0.0`)。 * **版本号规则**: 采用语义化版本控制SemVer格式版本号由三部分组成: `主版本号.次版本号.修订号`(例如: `v1.0.0`)。
* **标签命令** * **标签命令**:
```bash ```bash
git tag v1.0.0 git tag v1.0.0

View File

@ -0,0 +1,174 @@
# Snow-Lang GraalVM AOT 打包指南
## 1. 概述
本文档介绍如何使用 GraalVM 的 AOTAhead-of-Time编译功能将一个 Snow-Lang 项目打包成原生可执行文件Native Image
## 2. 前置条件
1. 操作系统: Linux/macOS/Windows
2. Java 项目Maven
3. GraalVM建议 24+ 版本)
## 3. 环境准备
### 3.1 安装 GraalVM
1. 下载对应平台的 GraalVM Community 版本: [https://www.graalvm.org/downloads/](https://www.graalvm.org/downloads/)
2. 解压并配置环境变量:
3. 验证安装:
```bash
java -version
# 应显示 GraalVM 版本信息
java version "24.0.1" 2025-04-15
Java(TM) SE Runtime Environment Oracle GraalVM 24.0.1+9.1 (build 24.0.1+9-jvmci-b01)
Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 24.0.1+9.1 (build 24.0.1+9-jvmci-b01, mixed mode, sharing)
```
### 3.2 Windows 上 Native Image 的先决条件
在 Windows 上Native Image 需要 Visual Studio 和 Microsoft Visual C++(MSVC)。
1. 从 [visualstudio.microsoft.com](https://visualstudio.microsoft.com/zh-hans/vs/) 下载 Visual Studio Build Tools 2022 或更高版本C 开发环境)。
2. 通过打开下载的文件来启动安装,然后单击 **继续**
![IMG_VS_1.png](img/IMG_VS_1.png)
3. 在主窗口中选择 **使用 C++ 进行桌面开发** 复选框。在右侧的“安装详细信息”下,确保选择了两个要求,**Windows 11 SDK** 和 **MSVC (…) C++ x64/x86 构建工具**。单击 **安装** 继续。
![IMG_VS_2.png](img/IMG_VS_2.png)
您现在能够使用 GraalVM Native Image 进行构建。
## 4. Maven 项目配置文件
通过将以下配置文件添加到 `pom.xml` 中,为 Native Image 启用 Maven 插件:
```xml
<profiles>
<!--
原生镜像构建: Linux 平台
- 使用 GraalVM 的 native-image 工具,生成静态链接的可执行文件
- 依赖 musl libc需提前安装并配置 musl-gcc 工具链
-->
<profile>
<id>native-linux</id>
<activation>
<os>
<family>unix</family>
</os>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>${native.maven.plugin.version}</version>
<!-- 启用插件扩展,允许在 build 生命周期中无须额外配置 -->
<extensions>true</extensions>
<executions>
<!-- 打包阶段生成原生可执行文件 -->
<execution>
<id>build-native</id>
<goals>
<!-- compile-no-fork 在当前 JVM 进程中执行 native-image -->
<goal>compile-no-fork</goal>
</goals>
<phase>package</phase>
</execution>
<!-- 测试阶段运行原生镜像的测试 -->
<execution>
<id>test-native</id>
<goals>
<goal>test</goal>
</goals>
<phase>test</phase>
</execution>
</executions>
<configuration>
<buildArgs>
<!-- 静态链接 -->
<buildArg>--static</buildArg>
<!-- 指定 musl libc -->
<buildArg>--libc=musl</buildArg>
<!-- 输出构建报告 -->
<buildArg>--emit build-report</buildArg>
<!-- 优化级别 O2 -->
<buildArg>-O2</buildArg>
</buildArgs>
<environment>
<!-- 指定使用 musl 工具链 -->
<PATH>/opt/musl-1.2.5/bin:${env.PATH}</PATH>
<C_INCLUDE_PATH>/opt/musl-1.2.5/include</C_INCLUDE_PATH>
<LIBRARY_PATH>/opt/musl-1.2.5/lib</LIBRARY_PATH>
</environment>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<!--
原生镜像构建: Windows 平台
- 使用 GraalVM 的 native-image 工具,生成 Windows 可执行文件
- Windows 上不使用 musl因此不配置静态链接
-->
<profile>
<id>native-windows</id>
<activation>
<os>
<family>Windows</family>
</os>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>${native.maven.plugin.version}</version>
<extensions>true</extensions>
<executions>
<!-- 打包阶段生成 Windows 可执行文件 -->
<execution>
<id>build-native</id>
<goals>
<goal>compile-no-fork</goal>
</goals>
<phase>package</phase>
</execution>
<!-- 测试阶段运行原生镜像测试 -->
<execution>
<id>test-native</id>
<goals>
<goal>test</goal>
</goals>
<phase>test</phase>
</execution>
</executions>
<configuration>
<buildArgs>
<!-- 输出构建报告 -->
<buildArg>--emit build-report</buildArg>
<!-- 优化级别 O2 -->
<buildArg>-O2</buildArg>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
```
## 5. 构建 Native Image
1. 确保项目已在 JVM 下通过测试。
2. 点击 `Maven` `生命周期` `package`
![IMG_Maven_Package_1.png](img/IMG_Maven_Package_1.png)
3. 等待 Native Image 构建完成: 这个过程可能较慢(数分钟)。
4. 可执行文件即可直接运行,无需 JVM。
> 生成的可执行文件位于 target/ 目录。

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@ -7,22 +7,22 @@
## 1.2 背景与目标读者 ## 1.2 背景与目标读者
自 ChatGPT 3.5 诞生以来,越来越多的个人和企业将 LLM 生成的代码融入日常开发与自动化。然而,实践证明LLM 生成的代码虽然“看起来没问题”,却常因对底层语言细节把握不准导致微妙 Bug——比如运算符优先级混淆、作用域处理错误、甚至基础库调用都无法编译通过。 自 ChatGPT 3.5 诞生以来,越来越多的个人和企业将 LLM 生成的代码融入日常开发与自动化。然而,实践证明: LLM 生成的代码虽然“看起来没问题”,却常因对底层语言细节把握不准导致微妙 Bug——比如运算符优先级混淆、作用域处理错误、甚至基础库调用都无法编译通过。
于是,我萌生了这样一个想法**能否设计一门编程语言,让 LLM 在“语法层面”能够更精准、高效地理解和生成代码?** 于是,我萌生了这样一个想法: **能否设计一门编程语言,让 LLM 在“语法层面”能够更精准、高效地理解和生成代码?**
传统编程语言的设计多偏重“计算机”的执行效率程序员往往在抽象表达和底层性能之间不断权衡。Ruby 之父松本行弘提出“为人而不是为机器编程”的理念。而在 LLM 日益普及的今天,我们应当承认大型模型正成为“超级程序员”,它们不仅是助手,更是“代码生产的中介”。如果一门语言的语法和设计能最大化发挥 LLM 的推理与生成能力,人机协作的效率将被极大提升。 传统编程语言的设计多偏重“计算机”的执行效率程序员往往在抽象表达和底层性能之间不断权衡。Ruby 之父松本行弘提出“为人而不是为机器编程”的理念。而在 LLM 日益普及的今天,我们应当承认: 大型模型正成为“超级程序员”,它们不仅是助手,更是“代码生产的中介”。如果一门语言的语法和设计能最大化发挥 LLM 的推理与生成能力,人机协作的效率将被极大提升。
因此,**Snow** 的使命是让编程语言不再“让人头疼”,而是“让 LLM 更加从容地书写”。目标受众涵盖 LLM 爱好者、开发者、对编译原理感兴趣的学生,以及对性能有追求的工程师甚至是初学者——每个人都能在 Snow 中找到乐趣与成长。 因此,**Snow** 的使命是: 让编程语言不再“让人头疼”,而是“让 LLM 更加从容地书写”。目标受众涵盖 LLM 爱好者、开发者、对编译原理感兴趣的学生,以及对性能有追求的工程师甚至是初学者——每个人都能在 Snow 中找到乐趣与成长。
## 1.3 文章目的 ## 1.3 文章目的
本文将带你完整体验 Snow 从零到 v0.1 的诞生历程,围绕四个核心目标 本文将带你完整体验 Snow 从零到 v0.1 的诞生历程,围绕四个核心目标:
* **兴趣驱动的坚持**用真实经历激励更多人相信“兴趣是最好的动力”,哪怕工作再忙,也能靠热爱坚持探索。 * **兴趣驱动的坚持**: 用真实经历激励更多人相信“兴趣是最好的动力”,哪怕工作再忙,也能靠热爱坚持探索。
* **从规划到实践的拆解**详解在有限资源下如何一步步拆解出词法分析、语法解析、AST 构建、解释执行等关键模块,以“先可用后完备”为原则,稳步推进。 * **从规划到实践的拆解**: 详解在有限资源下如何一步步拆解出词法分析、语法解析、AST 构建、解释执行等关键模块,以“先可用后完备”为原则,稳步推进。
* **经验与反思**不仅有“成功输出 1+1=2”的成就感也有调试死循环、运算符冲突等踩坑经历全方位展示编程语言设计的挑战与思考。 * **经验与反思**: 不仅有“成功输出 1+1=2”的成就感也有调试死循环、运算符冲突等踩坑经历全方位展示编程语言设计的挑战与思考。
* **激励与号召**希望 Snow 成为开源社区的新起点,邀请更多伙伴参与,见证从 v0.2、v1.0 甚至到未来并发、标准库、包管理等更大梦想的实现。 * **激励与号召**: 希望 Snow 成为开源社区的新起点,邀请更多伙伴参与,见证从 v0.2、v1.0 甚至到未来并发、标准库、包管理等更大梦想的实现。
--- ---
@ -31,18 +31,18 @@
## 2.1 现有工具的痛点 ## 2.1 现有工具的痛点
* **编程语言过于灵活,缺乏规范** * **编程语言过于灵活,缺乏规范**
常见的编程语言如 Python、PHP、Ruby虽然语法简洁、上手快但“灵活性”本身也带来了不少隐患变量类型可以随意变化,作用域和命名规则宽松,团队协作时代码风格极易失控,隐蔽 Bug 难以及时发现。自动化运维和日常数据处理脚本往往随手一写,维护与交接时却漏洞百出、沟通成本高。许多开发者都在思考如果有一门语法严谨、行为可预测,并天然适合团队协作与 LLM 生成的编程语言,是不是能让代码质量和工程效率都上一个台阶? 常见的编程语言如 Python、PHP、Ruby虽然语法简洁、上手快但“灵活性”本身也带来了不少隐患: 变量类型可以随意变化,作用域和命名规则宽松,团队协作时代码风格极易失控,隐蔽 Bug 难以及时发现。自动化运维和日常数据处理脚本往往随手一写,维护与交接时却漏洞百出、沟通成本高。许多开发者都在思考: 如果有一门语法严谨、行为可预测,并天然适合团队协作与 LLM 生成的编程语言,是不是能让代码质量和工程效率都上一个台阶?
* **缺乏专为 LLM 设计的编程语言** * **缺乏专为 LLM 设计的编程语言**
当下主流编程语言,基本都是“为人类程序员”而设计,很少考虑 LLM 的生成和推理习惯。比如部分语法容易混淆作用域和可见性规则不直观LLM 在生成时不仅需要大量提示,结果还常常不理想。缺少一门语法清晰、特征单一、对 LLM 友好的编程语言,导致自动化和智能生成代码场景下,仍然存在很多不可控和效率瓶颈。 当下主流编程语言,基本都是“为人类程序员”而设计,很少考虑 LLM 的生成和推理习惯。比如: 部分语法容易混淆作用域和可见性规则不直观LLM 在生成时不仅需要大量提示,结果还常常不理想。缺少一门语法清晰、特征单一、对 LLM 友好的编程语言,导致自动化和智能生成代码场景下,仍然存在很多不可控和效率瓶颈。
## 2.2 触发想法的场景 ## 2.2 触发想法的场景
* **对高效与规范的需求日益突出** * **对高效与规范的需求日益突出**
在实际开发和运维工作中,我们经常要写各种自动化脚本。由于编程语言过于灵活,代码风格极易失控,维护起来痛苦不堪。团队中常常讨论能否有一门语法严谨、易于规范化、适合团队协作的编程语言?大家都希望提升代码质量,减少后期返工。 在实际开发和运维工作中,我们经常要写各种自动化脚本。由于编程语言过于灵活,代码风格极易失控,维护起来痛苦不堪。团队中常常讨论: 能否有一门语法严谨、易于规范化、适合团队协作的编程语言?大家都希望提升代码质量,减少后期返工。
* **自研编程语言的大胆设想** * **自研编程语言的大胆设想**
随着 LLM 在自动化、辅助编程中的应用普及,越来越多场景下希望直接“让 LLM 写代码”。但事实是,不管是让 LLM 生成 Python 还是 PHP总要写很多提示还要人工修正各种细节。由此引发思考如果有一门对 LLM 友好的编程语言,语法特征清晰、行为可预测,能不能大幅提升代码自动生成与落地的效率? 随着 LLM 在自动化、辅助编程中的应用普及,越来越多场景下希望直接“让 LLM 写代码”。但事实是,不管是让 LLM 生成 Python 还是 PHP总要写很多提示还要人工修正各种细节。由此引发思考: 如果有一门对 LLM 友好的编程语言,语法特征清晰、行为可预测,能不能大幅提升代码自动生成与落地的效率?
## 2.3 项目愿景 ## 2.3 项目愿景
@ -62,12 +62,12 @@
## 3.1 为什么开源 ## 3.1 为什么开源
* **获得社区反馈,检验设计思路**闭门造车易“自嗨”,开源能快速获得用户和专家的多视角建议。 * **获得社区反馈,检验设计思路**: 闭门造车易“自嗨”,开源能快速获得用户和专家的多视角建议。
* **边开源边完善,更吸引贡献者**功能精简但可用时就发布,容易吸引早期用户参与共建。 * **边开源边完善,更吸引贡献者**: 功能精简但可用时就发布,容易吸引早期用户参与共建。
## 3.2 开源准备工作 ## 3.2 开源准备工作
* **许可证选择** * **许可证选择**:
采用 [Apache-2.0](https://gitee.com/jcnc-org/snow/blob/main/LICENSE),最大程度降低贡献门槛。 采用 [Apache-2.0](https://gitee.com/jcnc-org/snow/blob/main/LICENSE),最大程度降低贡献门槛。
## 3.3 项目运行输出 ## 3.3 项目运行输出
@ -76,8 +76,8 @@
module: Main module: Main
import:Math import:Math
function: main function: main
parameter: params:
return_type: int returns: int
body: body:
Math.factorial(6L,1L) Math.factorial(6L,1L)
@ -90,10 +90,10 @@ end module
## 源代码 (test.snow) ## 源代码 (test.snow)
module: Math module: Math
function: factorial function: factorial
parameter: params:
declare n1: long declare n1: long
declare n2: long declare n2: long
return_type: long returns: long
body: body:
return n1+n2 return n1+n2
end body end body
@ -248,11 +248,11 @@ Process has ended
## 4.1 v0.2 初步目标 ## 4.1 v0.2 初步目标
1. **完善变量作用域与高级函数调用** 1. **完善变量作用域与高级函数调用**:
支持函数参数、返回值、本地与全局变量隔离,以及闭包基础,为并发/异步打基础。 支持函数参数、返回值、本地与全局变量隔离,以及闭包基础,为并发/异步打基础。
2. **完善错误提示与调试信息** 2. **完善错误提示与调试信息**:
报错更精准,方便新手调试。 报错更精准,方便新手调试。
3. **预计发布日期2025 年 7 月 30 日** 3. **预计发布日期: 2025 年 7 月 30 日**
## 4.2 v0.3 目标 ## 4.2 v0.3 目标
1. **IDE的支持** 1. **IDE的支持**
@ -262,11 +262,11 @@ Process has ended
## 4.3 v1.0 长期规划 ## 4.3 v1.0 长期规划
1. **初步标准库** 1. **初步标准库**:
I/O、字符串、JSON、文件系统满足日常脚本需求。 I/O、字符串、JSON、文件系统满足日常脚本需求。
2. **包管理与模块加载** 2. **包管理与模块加载**:
设计 `snowpkg`,支持一键安装依赖、自动模块导入。 设计 `snowpkg`,支持一键安装依赖、自动模块导入。
3. **社区协作与贡献** 3. **社区协作与贡献**:
开设设计讨论区、每月线上分享,鼓励贡献代码与案例,让更多人参与 Snow 的成长。 开设设计讨论区、每月线上分享,鼓励贡献代码与案例,让更多人参与 Snow 的成长。
--- ---
@ -275,15 +275,15 @@ Process has ended
## 5.1 学习收获与成就感 ## 5.1 学习收获与成就感
回望从零到 v0.1 的历程,我最开始设计了虚拟机,然后设计的编译器,最震撼的是让一个想法变成可运行的代码哪怕只输出一句“Hello, Snow!”也足以令人热血沸腾。每一次 Snow 在屏幕上输出,都让我更深刻理解了编译原理的乐趣。 回望从零到 v0.1 的历程,我最开始设计了虚拟机,然后设计的编译器,最震撼的是: 让一个想法变成可运行的代码哪怕只输出一句“Hello, Snow!”也足以令人热血沸腾。每一次 Snow 在屏幕上输出,都让我更深刻理解了编译原理的乐趣。
## 5.2 技术敬畏与情感共鸣 ## 5.2 技术敬畏与情感共鸣
也许有人会说“输出一句话算什么”,但其实,每一个简单的表达式背后,都凝结了无数技术细节多字符运算符的处理、优先级解析、AST 与符号表、作用域管理、底层 GC 可行性……每一环都让人敬畏计算机科学之美。 也许有人会说“输出一句话算什么”,但其实,每一个简单的表达式背后,都凝结了无数技术细节: 多字符运算符的处理、优先级解析、AST 与符号表、作用域管理、底层 GC 可行性……每一环都让人敬畏计算机科学之美。
## 5.3 欢迎你的加入 ## 5.3 欢迎你的加入
真诚邀请所有对编程语言、编译原理、LLM 应用感兴趣的小伙伴 真诚邀请所有对编程语言、编译原理、LLM 应用感兴趣的小伙伴:
1. 在 Gitee 提交 Issue反馈使用体验和建议 1. 在 Gitee 提交 Issue反馈使用体验和建议
2. Fork 仓库、贡献 PR参与语法和功能共建 2. Fork 仓库、贡献 PR参与语法和功能共建
@ -294,7 +294,7 @@ Process has ended
> 微信: xuxiaolankaka > 微信: xuxiaolankaka
> QQ: 1399528359 > QQ: 1399528359
对于从未写过语言的初学者,我想说**不要害怕,从 Hello World 开始,你会发现编译原理其实很有趣。** 让我们一起,把 Snow 打造为兼顾 LLM 友好和人类易用的创新编程语言。也许,下一个改变编程世界的创举,就在我们手中诞生。 对于从未写过语言的初学者,我想说: **不要害怕,从 Hello World 开始,你会发现编译原理其实很有趣。** 让我们一起,把 Snow 打造为兼顾 LLM 友好和人类易用的创新编程语言。也许,下一个改变编程世界的创举,就在我们手中诞生。
--- ---

View File

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 190 KiB

View File

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 192 KiB

View File

@ -1,6 +1,6 @@
# Snow 语言现状和下一阶段开发路线图 # Snow 语言现状和下一阶段开发路线图
> 日期2025-06-11 > 日期: 2025-06-11
## 1. 代码结构与职责 ## 1. 代码结构与职责
| 层次 | 主要包/目录 | 说明 | | 层次 | 主要包/目录 | 说明 |
@ -30,7 +30,7 @@
6. **VM** 6. **VM**
* 栈-基 / 寄存器混合架构 * 栈-基 / 寄存器混合架构
* 96 条已实现指令(按数据宽度泛化B/S/I/L/F/D * 96 条已实现指令(按数据宽度泛化: B/S/I/L/F/D
* 运行时启动器 `VMLauncher` * 运行时启动器 `VMLauncher`
@ -50,7 +50,7 @@
## 4. 下一阶段开发路线图 ## 4. 下一阶段开发路线图
> 优先级P0 = 当前版本必须P1 = 下一个小版本P2 = 中长期 > 优先级: P0 = 当前版本必须P1 = 下一个小版本P2 = 中长期
| 优先级 | 功能 | 关键任务 | | 优先级 | 功能 | 关键任务 |
|--------|------------------|----------------------------------------------------------------------------------------------------------------------| |--------|------------------|----------------------------------------------------------------------------------------------------------------------|
@ -58,18 +58,18 @@
| **P0** | **一元表达式解析** | \* 实现 `UnaryOperatorParselet``-`, `+`, `!`)<br>\* 对应 `UnaryOpGenerator` 注册 | | **P0** | **一元表达式解析** | \* 实现 `UnaryOperatorParselet``-`, `+`, `!`)<br>\* 对应 `UnaryOpGenerator` 注册 |
| **P1** | **数组与切片** | \* 设计 `ArrayType`(元素类型 + 维度)<br>\* 新增 `IndexExpressionNode``NewArrayNode`<br>\* VM 扩充 `ALOAD/ASTORE` 指令 | | **P1** | **数组与切片** | \* 设计 `ArrayType`(元素类型 + 维度)<br>\* 新增 `IndexExpressionNode``NewArrayNode`<br>\* VM 扩充 `ALOAD/ASTORE` 指令 |
| **P1** | **基础标准库** | \* `print/println`, 文件读写<br>\* 编译期内置绑定到 VM calls | | **P1** | **基础标准库** | \* `print/println`, 文件读写<br>\* 编译期内置绑定到 VM calls |
| **P1** | **测试与 CI** | \* JUnit5 单测Lexer / Parser / Semantic / VM<br>\* CI/CD 自动构建、示例编译运行 | | **P1** | **测试与 CI** | \* JUnit5 单测: Lexer / Parser / Semantic / VM<br>\* CI/CD 自动构建、示例编译运行 |
| **P2** | **结构体 / 简单面向对象** | \* 结构体 语法、记录类型布局<br>\* 方法调度静态 or 虚表 | | **P2** | **结构体 / 简单面向对象** | \* 结构体 语法、记录类型布局<br>\* 方法调度: 静态 or 虚表 |
| **P2** | **优化管线** | \* 常量折叠、公共子表达式消除<br>\* 简易死代码清除 | | **P2** | **优化管线** | \* 常量折叠、公共子表达式消除<br>\* 简易死代码清除 |
| **P2** | **错误与异常系统** | \* 语法`try … catch … end`<br>\* VM展开-收缩栈,异常表 | | **P2** | **错误与异常系统** | \* 语法: `try … catch … end`<br>\* VM: 展开-收缩栈,异常表 |
| **P2** | **包管理 & CLI** | \* `snowc` 命令`build`, `run`, `test`<br>\* 本地缓存 `.snowpkg`与包版本语义 | | **P2** | **包管理 & CLI** | \* `snowc` 命令: `build`, `run`, `test`<br>\* 本地缓存 `.snowpkg`与包版本语义 |
## 5.1 里程碑排期 ## 5.1 里程碑排期
| 时间 | 目标 | | 时间 | 目标 |
|---------|----------------------------------------| |---------|----------------------------------------|
| 2025-07 | 发布 **v0.2.0**布尔类型 + 一元运算、20+ 单元测试 | | 2025-07 | 发布 **v0.2.0**: 布尔类型 + 一元运算、20+ 单元测试 |
| 2025-08 | 发布 **v0.3.0**数组/切片 & 基础标准库;引入 CLI | | 2025-08 | 发布 **v0.3.0**: 数组/切片 & 基础标准库;引入 CLI |
| 2025-10 | 发布 **v0.4.0**结构体支持、首批优化 Pass、>80% 覆盖率 | | 2025-10 | 发布 **v0.4.0**: 结构体支持、首批优化 Pass、>80% 覆盖率 |
| 2026-11 | 发布 **v1.0.0**异常系统、稳定包管理、文档完善 | | 2026-11 | 发布 **v1.0.0**: 异常系统、稳定包管理、文档完善 |

View File

@ -0,0 +1,581 @@
# SnowLang 语法规范
---
## 0 · 符号约定
* ⟦ … ⟧: 可选项0 或 1 次)
* { … }\*: 可重复项0 次或多次)
---
## 1 · 词汇结构
### 1.1 编码与字符集
源文件采用 UTF8 编码。除注释外,标识符只允许英文大小写字母 (AZ az)、数字 (09) 与下划线 _首字符不能为数字。
```ebnf
identifier ::= [A-Za-z_][A-Za-z0-9_]* ;
```
* **区分大小写**: Foo 与 foo 为不同标识符。
* 保留字 (见 §1.3) **禁止** 用作标识符。
### 1.2 分隔符与强制空白
相邻两个标记之间 **推荐** 至少以 1 个空白字符分隔,除非记号本身带有定界符 (( ) , : = < > 等)。示例:
```snow
module: Foo // 推荐
module:Foo // 不推荐
```
### 1.3 保留关键字
```
module import end module globals struct end struct
function end function params returns body end body
declare if then else end if loop init cond step
end loop break continue self
```
以上列表 **均为关键词**,大小写固定,不能作为标识符。
### 1.4 文字量 (Literal)
* **整型**: 123 0 -42
* **浮点**: 3.14 0.0
* **布尔**: true false
* **字符串**: 未来版本保留;当前规范未定义。
### 1.5 注释
* **单行注释**: 以 // 起,至当行行尾。
* **多行注释**: /* … */ 可跨行。**不可嵌套**;嵌套会在最内层 */ 处终止外层,导致编译错误。
---
### 1.6 换行与缩进
* **只有换行有语义**: 以行末冒号(:)打开一个块时(如 module:、function:、if、loop: 等),块体**必须另起新行**。
* **缩进没有语义**: 缩进仅用于提高代码可读性,对语法无影响。缩进不一致不会报错。
* 块体通过显式关闭关键字(如 end module、end function 等)结束。
* 若关闭关键字与开始关键字之间的缩进不一致,不会报错,仍以关闭关键字为准。
> 块体结构完全由行分隔和显式关闭关键字决定,缩进仅为美观,不影响代码执行。
---
## 2 · 模块与导入
### 2.1 模块声明
```snow
module: <ModuleName>
end module
```
* 一个源文件只能出现 **一次** module: 声明,且文件名与模块名无必然关系。
* 模块名可使用点号(.)分隔表示包层级,例如 util.math。
* **允许** 不同文件夹下声明同名模块,但模块全名(含包路径,用点分隔)在全项目中必须唯一。
* 若项目中出现重复的模块全名,编译阶段将报重定义错误。
例如:
> src/util/math.snow // module: util.math
> src/core/math.snow // module: core.math
>
> 两者都声明了 module: math但由于包路径不同util.math 与 core.math互不冲突。
### 2.2 导入
```snow
import: <ModuleA>⟦ as <AliasA>⟧, <ModuleB>⟦ as <AliasB>⟧, …
```
* **别名 (Alias)** 可为任何合法标识符,放在 as 关键字之后。
* **重复导入**: 对同一模块多次导入(无论是否带 alias只解析一次其余忽略告警。
* **循环依赖**: 当前规范未定义,若出现编译器可拒绝或延迟解析。
* **子模块**(诸如 A.B暂不支持。
### 2.3 全路径引用
* 跨模块引用必须使用 _Prefix_._Name_其中 *Prefix* 是模块名或导入时的别名。
例如: Math.Point 或 M.sin。
* **解析顺序**: 未加前缀的标识符只在本模块查找;找不到则视为编译错误,不会隐式搜索导入模块。
---
## 3 · 命名与作用域
### 3.1 作用域层级
1. **模块顶层**: 全局变量、结构体、模块级函数。
2. **结构体内部**: 字段、方法、构造函数。
3. **函数/方法**: 形参与局部变量。
4. **局部嵌套块** (if / loop 等) 的局部变量。
### 3.2 唯一性规则
* **模块顶层唯一**: 同一模块的 *结构体名*、*模块级函数名*、*全局变量名* **不得重名**
* **结构体内部**: 字段名与方法名不得相同;**允许有多个与结构体名同名的函数(即构造函数重载),但其参数签名必须互不相同。**
* **构造函数重载**: 结构体内部可以声明多个与结构体名同名的函数作为构造函数,参数类型与数量必须不同,否则属于 DuplicateName 错误。
* **跨层级遮蔽**: 内层可定义与外层同名标识符(除关键字限制外),遵循最近作用域原则。
### 3.3 访问控制约定
* **私有成员与方法**: 以单个下划线 `_` 开头的变量名、字段名或方法名,**仅在其所属结构体或模块内部可见**。外部不可访问,编译器应报错 `AccessDenied`
- 例如 `_foo`, `_barMethod`
* **公有成员与方法**: 非下划线开头的变量、字段、方法,默认为公有。可在模块外部通过模块名/别名前缀访问。
#### 影响范围
- **模块级变量与函数**: `globals``function` 语句声明的以 `_` 开头者,仅限本模块访问。
- **结构体字段与方法**: 声明为 `_name``_doSomething` 的,仅结构体本身或其方法体可访问。
---
#### 访问示例
```snow
// module: foo
globals:
declare _secret: int = 42 // 仅 foo 模块内部可见
declare visible: int = 1 // 公有
function: _hidden // 仅 foo 模块内部可见
returns: int
body:
return 100
end body
end function
function: publicFunc
returns: int
body:
return _secret + 1 // 合法
end body
end function
// module: bar
import: foo
declare x: int = foo.visible // 合法
declare y: int = foo._secret // 编译错误 AccessDenied
declare z: int = foo._hidden() // 编译错误 AccessDenied
```
## 4 · 声明语法
### 4.1 全局变量
```snow
globals:
declare VarName: Type ⟦= Expr⟧
```
* 后续对该变量赋值时 **不得** 使用 declare。
### 4.2 结构体
```snow
struct: StructName
declare field1: Type1
declare field2: Type2
// ──────────── 构造函数(可以不存在, 可重载) ──────────────
function: StructName
params:
declare p1: Type1
body:
self.field1 = p1
end body
end function
function: StructName
params:
declare q1: TypeQ
declare q2: TypeQ
body:
// ...
end body
end function
// ...可继续声明更多参数签名各异的构造函数...
// ─────────────────────────────────────────────
// ────────── 结构体内函数 (可以不存在) ──────────
function: method1
⟦params:
declare x: TypeX
…⟧
returns: ReturnType
body:
end body
end function
// ─────────────────────────────────────────────
end struct
```
**实例化**:
* declare p: Point = Point(1, 2)
* declare p2: Point = Point(3)
- 实参顺序 = 构造函数 params: 声明顺序;与字段声明顺序无关。
- **构造函数重载时**,调用 Point(...) 时根据参数数量和类型匹配唯一的构造函数。若无匹配或多重匹配,则为编译错误。
- 不支持命名实参、缺省实参或字段名字面量初始化。
### 4.3 函数
```snow
function: FuncName
returns: Type // 无返回值的时候写 void
⟦params:
declare x: TypeX // 无参数的时候不写 params
…⟧
body:
end body
end function
```
* **返回检查**: 若 returns: 指定类型非 void所有控制流路径必须显式 return 该类型值。
* 在 loop 内或经 break 跳出后能到达的路径亦计入检查;若缺失,编译错误。
---
## 5 · 语句
### 5.1 变量声明与赋值
```snow
declare x: int = 0
x = 1
```
* 同一作用域中 declare 仅能出现一次。
### 5.2 条件语句
```snow
if Condition then
else
end if
```
* Condition 类型必须为 bool。
### 5.3 循环语句
```snow
loop:
init:
declare i: int = 0
cond:
i < 10
step:
i = i + 1
body:
end body
end loop
```
* **作用域**: init 块声明的变量仅在本 loop 的 init/cond/step/body 有效。
* break 立即终止当前循环continue 跳过剩余 body执行 step → cond。
---
## 6 · 类型系统
### 6.1 数值类型
Snow-Lang 支持下列**数值类型**,用于声明变量、参数、结构体字段、函数返回等:
| 类型名 | 关键字 | 位数 | 描述 |
|----------|--------|----|---------------------------|
| byte8 | byte | 8 | 8 位有符号整数 |
| short16 | short | 16 | 16 位有符号整数 |
| int32 | int | 32 | 32 位有符号整数(默认整数类型) |
| long64 | long | 64 | 64 位有符号整数 |
| float32 | float | 32 | 32 位 IEEE-754 浮点数 |
| double64 | double | 64 | 64 位 IEEE-754 浮点数(默认浮点类型) |
**说明**
* 没有无符号整型,所有整型均为有符号。
* `int` 为整数常量与变量的默认类型。
* `double` 为浮点常量与变量的默认类型。
* `bool` 类型只表示真/假,不允许与数值类型直接互转。
#### 数值字面量后缀
为指定具体类型,可在数值字面量后加后缀字母(大小写均可):
| 后缀 | 类型 | 例子 |
|----|--------|----------|
| b | byte | 7b, -2B |
| s | short | 123s |
| l | long | 5l, 123L |
| f | float | 3.14f |
- 没有后缀的整数字面量自动为 `int`
- 没有后缀的浮点字面量自动为 `double`
**示例: **
```snow
declare a: int = 7 // int (默认)
declare b: long = 9l // long
declare c: float = 2.5f // float
declare d: double = 2.5 // double (默认)
declare e: byte = 127b // byte
declare f: short = 100s // short
````
---
### 6.2 布尔类型
* 关键字为 `bool`
* 字面量为 `true``false`
* 仅用于逻辑判断、条件分支,不与整型互转
---
### 6.3 数组类型
支持一维和多维数组。数组类型以 `T[]` 表示元素类型为 T 的一维数组,多维数组以 `T[][]``T[][][]` 依次类推。
#### 声明与初始化
````snow
declare arr: int[] = [1, 2, 3]
declare matrix: double[][] = [
[1.1, 2.2],
[3.3, 4.4]
]
declare cube: bool[][][] = [
[[true, false], [false, true]],
[[false, false], [true, true]]
]
````
#### 访问与赋值
````snow
arr[0] = 10
matrix[1][1] = 5.6
declare x: int = arr[2]
declare y: double = matrix[0][1]
````
---
### 6.4 结构体类型
* 使用 `struct` 关键字声明
* 结构体类型为用户自定义类型,**值类型**(赋值、传参时会拷贝整个结构体)
* 字段类型可以为任何合法类型(包括数组、其它结构体)
````snow
struct: Point
declare x: int
declare y: int
end struct
declare a: Point = Point(1, 2)
````
---
### 6.5 传值说明
* **所有变量、参数、返回值**均为**值传递**(按值拷贝)
* 结构体、数组在赋值与传参时,均会复制整个值;后续修改不会影响原对象
---
## 7 · 名字解析算法(概览)
1. **输入**: 未限定前缀的标识符 N当前作用域 S。
2. 自内向外遍历作用域链查找 N首次匹配即确定绑定。
3. 若遍历至模块顶层仍未匹配,编译错误 *UnresolvedIdentifier*
4. 限定名 Prefix.N: 直接在模块表中查 Prefix包括别名成功后在该模块顶层查找 N找不到即 *UnresolvedQualifiedIdentifier*
---
## 8 · 编译单位与入口
* **单一入口**: 编译器需指定某模块某函数作为启动入口。
* **模块初始化**: globals 块中的带初值变量在程序启动时自顶向下按出现顺序初始化;不同模块按依赖拓扑顺序初始化(循环依赖未定义)。
---
## 9 · 错误分类
| 编译期错误代码 | 产生条件 |
|----------------------|----------------------------|
| DuplicateName | 违反唯一性规则;结构体内有参数签名完全相同的构造函数 |
| UnresolvedIdentifier | 名字无法解析 |
| ReturnMissing | 非 void 函数缺少 return |
| TypeMismatch | 赋值或返回类型不兼容 |
| ImportCycle | (可选)检测到循环依赖 |
| CtorAmbiguous | 构造函数重载时参数匹配不唯一 |
| CtorNotFound | 构造函数重载时无匹配参数签名 |
| AccessDenied | 访问了以 `_` 开头的私有变量或方法但不在允许范围 |
---
## 10 · 完整示例
````snow
module: RectExample
import: Geometry
struct: Point
declare x: int
declare y: int
// 构造函数1: 两个参数
function: Point
params:
declare x: int
declare y: int
body:
self.x = x
self.y = y
end body
end function
// 构造函数2: 一个参数
function: Point
params:
declare xy: int
body:
self.x = xy
self.y = xy
end body
end function
end struct
struct: Rectangle
declare left_top: Point
declare right_bottom: Point
function: Rectangle
params:
declare x1: int
declare y1: int
declare x2: int
declare y2: int
body:
self.left_top = Point(x1, y1)
self.right_bottom = Point(x2, y2)
end body
end function
function: Rectangle
params:
declare width: int
declare height: int
body:
self.left_top = Point(0, 0)
self.right_bottom = Point(width, height)
end body
end function
function: width
returns: int
body:
return self.right_bottom.x - self.left_top.x
end body
end function
function: height
returns: int
body:
return self.right_bottom.y - self.left_top.y
end body
end function
function: area
returns: int
body:
return self.width() * self.height()
end body
end function
end struct
function: main
returns: int
body:
declare rect1: Rectangle = Rectangle(0, 0, 10, 10)
declare rect2: Rectangle = Rectangle(5, 6)
declare result: int = 0
if rect1.area() > 50 then
loop:
init:
declare i: int = 1
cond:
i <= rect1.width()
step:
i = i + 1
body:
if i == 3 then
continue
end if
if i == 8 then
break
end if
result = result + i
end body
end loop
else
result = rect1.area()
end if
return result
end body
end function
end module
````
---
## 11 · 构造函数重载示例
````snow
struct: Point
declare x: int
declare y: int
function: Point
params:
declare x: int
declare y: int
body:
self.x = x
self.y = y
end body
end function
function: Point
params:
declare xy: int
body:
self.x = xy
self.y = xy
end body
end function
end struct
declare a: Point = Point(1, 2) // 匹配第一个构造函数
declare b: Point = Point(5) // 匹配第二个构造函数
````

View File

@ -0,0 +1,258 @@
# Snow-Lang 语法
## 快速入门
一个简单的 snow 程序
```snow
module: Main
function: main
returns: int
body:
return 1 + 1
end body
end function
end module
```
## 基础
### 注释
```snow
// 单行注释
/*
多行注释
多行注释
多行注释
*/
```
### 数据类型
bool 类型:
两种值: `true``false`
数值类型:
| Number | keyword |
|----------|---------|
| byte8 | byte |
| short16 | short |
| int32 | int |
| long64 | long |
| float32 | float |
| double64 | double |
默认整数的类型为 int浮点数的类型为 double。
数值字面量后缀:
| 数值字面量后缀 | 例子 |
|---------|----|
| b、B | 7b |
| s、S | 7s |
| l、L | 7l |
| f、F | 7f |
### 变量
定义变量的形式如下,中括号表示可选:
```snow
declare name: type [= initial_value]
```
其中 `name` 是变量名,`type` 是变量类型,`initial_value` 是初始值
例:
```snow
declare x: int
declare y: long = 123456789
```
读取变量值的方法,直接写变量的名字即可:
```snow
x
```
设置变量值的方法,先写变量名,后面接 `=`,最后写一个表达式即可:
```snow
x = 10
```
于是可以通过这种方式让变量参与计算并保存结果:
```snow
x = y + 1
```
读取 `y` 的值加 1 并保存到变量 `x`
变量只能定义在函数体中、函数参数列表、loop 初始化器中。
## 流程控制
### if
if 语句的形式如下else 是可选的:
```snow
if cond then
// 条件成立执行的代码
else
// 以上条件不成立执行的代码
end if
```
cond 可以是表达式(结果为 bool 类型)或者 bool 字面量
例:
```snow
module: Main
function: main
returns: int
body:
if 5 > 7 then
return 5
else
return 7
end if
return 0
end body
end function
end module
```
### loop
loop 语句的形式如下:
```snow
loop:
init:
// 循环开始前可声明循环变量,有且只能声明一个
declare i: int = 1
cond:
// 循环条件,成立则执行 body 的代码,
// 不成立则退出循环,有且只能写一条
i <= 100
step:
// 循环体执行完后执行的代码,有且只能写一条
i = i + 1
body:
// 每次执行的代码写这里
end body
end loop
```
例子(求 1 ~ 100 的和):
```snow
module: Main
function: main
returns: int
body:
declare sum: int = 0
loop:
init:
declare i: int = 1
cond:
i <= 100
step:
i = i + 1
body:
sum = sum + i
end body
end loop
return sum
end body
end function
end module
```
## 函数
函数的形式如下:
```snow
function: add
params:
declare a: int
declare b: int
returns: int
body:
return a + b
end body
end function
```
其中 add 是函数名params 下面是参数列表(可省略),与变量的定义类似,但是不允许赋初值,
接着 returns 设置返回值类型,最后的 body 为函数体。
## 模块
一个模块可以包含多个函数,
通过 import 语句导入模块,
snow 会自动将同名模块的函数合并。
在我们最初的例子中,就用了 module 这个关键字。让我们回忆一下:
```snow
module: Main
function: main
returns: int
body:
return 1 + 1
end body
end function
end module
```
可以看到模块名是 Main里面有函数 main。
假如现在有一个模块 Math代码如下:
```snow
// Math.snow
module: Math
function: add
params:
declare a: int
declare b: int
returns: int
body:
return a + b
end body
end function
end module
```
可以使用 import 来导入 Math 模块:
```snow
// main.snow
module: Main
import: Math
function: main
returns: int
body:
return Math.add(5, 7)
end body
end function
end module
```
可以同时导入多个模块,用逗号(半角)分隔模块名即可:
```snow
// main.snow
module: Main
import: Math, Time
function: main
returns: int
body:
return Math.add(5, 7)
end body
end function
end module
```

View File

@ -0,0 +1,233 @@
# SnowVM-OpCode
## Type Control (0x0000-0x00BF)
### Byte8 (0x0000-0x001F)
| 指令名 | 十六进制 | 说明 |
|----------|--------|----------------|
| B\_ADD | 0x0000 | byte8 加法 |
| B\_SUB | 0x0001 | byte8 减法 |
| B\_MUL | 0x0002 | byte8 乘法 |
| B\_DIV | 0x0003 | byte8 除法 |
| B\_MOD | 0x0004 | byte8 取余 |
| B\_NEG | 0x0005 | byte8 取负 |
| B\_INC | 0x0006 | byte8 自增 |
| B\_AND | 0x0007 | byte8 按位与 |
| B\_OR | 0x0008 | byte8 按位或 |
| B\_XOR | 0x0009 | byte8 按位异或 |
| B\_PUSH | 0x000A | byte8 入栈 |
| B\_LOAD | 0x000B | byte8 本地变量加载 |
| B\_STORE | 0x000C | byte8 本地变量存储 |
| B\_CE | 0x000D | byte8 等于条件判断 |
| B\_CNE | 0x000E | byte8 不等于条件判断 |
| B\_CG | 0x000F | byte8 大于条件判断 |
| B\_CGE | 0x0010 | byte8 大于等于条件判断 |
| B\_CL | 0x0011 | byte8 小于条件判断 |
| B\_CLE | 0x0012 | byte8 小于等于条件判断 |
---
### Short16 (0x0020-0x003F)
| 指令名 | 十六进制 | 说明 |
|----------|--------|------------------|
| S\_ADD | 0x0020 | short16 加法 |
| S\_SUB | 0x0021 | short16 减法 |
| S\_MUL | 0x0022 | short16 乘法 |
| S\_DIV | 0x0023 | short16 除法 |
| S\_MOD | 0x0024 | short16 取余 |
| S\_NEG | 0x0025 | short16 取负 |
| S\_INC | 0x0026 | short16 自增 |
| S\_AND | 0x0027 | short16 按位与 |
| S\_OR | 0x0028 | short16 按位或 |
| S\_XOR | 0x0029 | short16 按位异或 |
| S\_PUSH | 0x002A | short16 入栈 |
| S\_LOAD | 0x002B | short16 本地变量加载 |
| S\_STORE | 0x002C | short16 本地变量存储 |
| S\_CE | 0x002D | short16 等于条件判断 |
| S\_CNE | 0x002E | short16 不等于条件判断 |
| S\_CG | 0x002F | short16 大于条件判断 |
| S\_CGE | 0x0030 | short16 大于等于条件判断 |
| S\_CL | 0x0031 | short16 小于条件判断 |
| S\_CLE | 0x0032 | short16 小于等于条件判断 |
---
### Int32 (0x0040-0x005F)
| 指令名 | 十六进制 | 说明 |
|----------|--------|----------------|
| I\_ADD | 0x0040 | int32 加法 |
| I\_SUB | 0x0041 | int32 减法 |
| I\_MUL | 0x0042 | int32 乘法 |
| I\_DIV | 0x0043 | int32 除法 |
| I\_MOD | 0x0044 | int32 取余 |
| I\_NEG | 0x0045 | int32 取负 |
| I\_INC | 0x0046 | int32 自增 |
| I\_AND | 0x0047 | int32 按位与 |
| I\_OR | 0x0048 | int32 按位或 |
| I\_XOR | 0x0049 | int32 按位异或 |
| I\_PUSH | 0x004A | int32 入栈 |
| I\_LOAD | 0x004B | int32 本地变量加载 |
| I\_STORE | 0x004C | int32 本地变量存储 |
| I\_CE | 0x004D | int32 等于条件判断 |
| I\_CNE | 0x004E | int32 不等于条件判断 |
| I\_CG | 0x004F | int32 大于条件判断 |
| I\_CGE | 0x0050 | int32 大于等于条件判断 |
| I\_CL | 0x0051 | int32 小于条件判断 |
| I\_CLE | 0x0052 | int32 小于等于条件判断 |
---
### Long64 区域0x0060-0x007F
| 指令名 | 十六进制 | 说明 |
|----------|--------|-----------------|
| L\_ADD | 0x0060 | long64 加法 |
| L\_SUB | 0x0061 | long64 减法 |
| L\_MUL | 0x0062 | long64 乘法 |
| L\_DIV | 0x0063 | long64 除法 |
| L\_MOD | 0x0064 | long64 取余 |
| L\_NEG | 0x0065 | long64 取负 |
| L\_INC | 0x0066 | long64 自增 |
| L\_AND | 0x0067 | long64 按位与 |
| L\_OR | 0x0068 | long64 按位或 |
| L\_XOR | 0x0069 | long64 按位异或 |
| L\_PUSH | 0x006A | long64 入栈 |
| L\_LOAD | 0x006B | long64 本地变量加载 |
| L\_STORE | 0x006C | long64 本地变量存储 |
| L\_CE | 0x006D | long64 等于条件判断 |
| L\_CNE | 0x006E | long64 不等于条件判断 |
| L\_CG | 0x006F | long64 大于条件判断 |
| L\_CGE | 0x0070 | long64 大于等于条件判断 |
| L\_CL | 0x0071 | long64 小于条件判断 |
| L\_CLE | 0x0072 | long64 小于等于条件判断 |
---
### Float32 区域0x0080-0x009F
| 指令名 | 十六进制 | 说明 |
|----------|--------|------------------|
| F\_ADD | 0x0080 | float32 加法 |
| F\_SUB | 0x0081 | float32 减法 |
| F\_MUL | 0x0082 | float32 乘法 |
| F\_DIV | 0x0083 | float32 除法 |
| F\_MOD | 0x0084 | float32 取余 |
| F\_NEG | 0x0085 | float32 取负 |
| F\_INC | 0x0086 | float32 自增 |
| F\_PUSH | 0x0087 | float32 入栈 |
| F\_LOAD | 0x0088 | float32 本地变量加载 |
| F\_STORE | 0x0089 | float32 本地变量存储 |
| F\_CE | 0x008A | float32 等于条件判断 |
| F\_CNE | 0x008B | float32 不等于条件判断 |
| F\_CG | 0x008C | float32 大于条件判断 |
| F\_CGE | 0x008D | float32 大于等于条件判断 |
| F\_CL | 0x008E | float32 小于条件判断 |
| F\_CLE | 0x008F | float32 小于等于条件判断 |
---
### Double64 区域0x00A0-0x00BF
| 指令名 | 十六进制 | 说明 |
|----------|--------|-------------------|
| D\_ADD | 0x00A0 | double64 加法 |
| D\_SUB | 0x00A1 | double64 减法 |
| D\_MUL | 0x00A2 | double64 乘法 |
| D\_DIV | 0x00A3 | double64 除法 |
| D\_MOD | 0x00A4 | double64 取余 |
| D\_NEG | 0x00A5 | double64 取负 |
| D\_INC | 0x00A6 | double64 自增 |
| D\_PUSH | 0x00A7 | double64 入栈 |
| D\_LOAD | 0x00A8 | double64 本地变量加载 |
| D\_STORE | 0x00A9 | double64 本地变量存储 |
| D\_CE | 0x00AA | double64 等于条件判断 |
| D\_CNE | 0x00AB | double64 不等于条件判断 |
| D\_CG | 0x00AC | double64 大于条件判断 |
| D\_CGE | 0x00AD | double64 大于等于条件判断 |
| D\_CL | 0x00AE | double64 小于条件判断 |
| D\_CLE | 0x00AF | double64 小于等于条件判断 |
---
## Type Conversion (0x00C0-0x00DF)
| 指令名 | 十六进制 | 说明 |
|-----|--------|--------------------|
| B2S | 0x00C0 | byte8 转 short16 |
| B2I | 0x00C1 | byte8 转 int32 |
| B2L | 0x00C2 | byte8 转 long64 |
| B2F | 0x00C3 | byte8 转 float32 |
| B2D | 0x00C4 | byte8 转 double64 |
| S2B | 0x00C5 | short16 转 byte8 |
| S2I | 0x00C6 | short16 转 int32 |
| S2L | 0x00C7 | short16 转 long64 |
| S2F | 0x00C8 | short16 转 float32 |
| S2D | 0x00C9 | short16 转 double64 |
| I2B | 0x00CA | int32 转 byte8 |
| I2S | 0x00CB | int32 转 short16 |
| I2L | 0x00CC | int32 转 long64 |
| I2F | 0x00CD | int32 转 float32 |
| I2D | 0x00CE | int32 转 double64 |
| L2B | 0x00CF | long64 转 byte8 |
| L2S | 0x00D0 | long64 转 short16 |
| L2I | 0x00D1 | long64 转 int32 |
| L2F | 0x00D2 | long64 转 float32 |
| L2D | 0x00D3 | long64 转 double64 |
| F2B | 0x00D4 | float32 转 byte8 |
| F2S | 0x00D5 | float32 转 short16 |
| F2I | 0x00D6 | float32 转 int32 |
| F2L | 0x00D7 | float32 转 long64 |
| F2D | 0x00D8 | float32 转 double64 |
| D2B | 0x00D9 | double64 转 byte8 |
| D2S | 0x00DA | double64 转 short16 |
| D2I | 0x00DB | double64 转 int32 |
| D2L | 0x00DC | double64 转 long64 |
| D2F | 0x00DD | double64 转 float32 |
---
## Reference Control (0x00E0-0x00EF)
| 指令名 | 十六进制 | 说明 |
|----------|--------|---------------------------|
| R\_PUSH | 0x00E0 | 将对象引用压入操作数栈 |
| R\_LOAD | 0x00E1 | 从本地变量表加载对象引用并压入操作数栈 |
| R\_STORE | 0x00E2 | 将操作数栈顶的对象引用弹出并存入本地变量表指定槽位 |
## Stack Control (0x0100-0x01FF)
| 指令名 | 十六进制 | 说明 |
|------|--------|----------|
| POP | 0x0100 | 弹出栈顶元素 |
| DUP | 0x0101 | 复制栈顶元素 |
| SWAP | 0x0102 | 交换栈顶前两元素 |
---
## Flow Control (0x0200-0x02FF)
| 指令名 | 十六进制/十进制 | 说明 |
|------|----------|-------|
| JUMP | 0x0200 | 无条件跳转 |
| CALL | 0x0201 | 子程序调用 |
| RET | 0x0202 | 子程序返回 |
---
## Register Control (0x0300-0x03FF)
| 指令名 | 十六进制 | 说明 |
|-----|--------|---------|
| MOV | 0x0300 | 局部变量间赋值 |
---
## System Control (0x0400-0x04FF)
| 指令名 | 十六进制 | 说明 |
|-------------|--------|------|
| HALT | 0x0400 | 程序终止 |
| SYSCALL | 0x0401 | 系统调用 |
| DEBUG\_TRAP | 0x0402 | 调试断点 |

View File

@ -1,7 +1,7 @@
module: Math module: Math
function: main function: main
parameter: params:
return_type: int returns: int
body: body:
Math.factorial(6) Math.factorial(6)
return 0 return 0
@ -9,17 +9,17 @@ module: Math
end function end function
function: factorial function: factorial
parameter: params:
declare n:int declare n:int
return_type: int returns: int
body: body:
declare num1:int = 1 declare num1:int = 1
loop: loop:
initializer: init:
declare counter:int = 1 declare counter:int = 1
condition: cond:
counter <= n counter <= n
update: step:
counter = counter + 1 counter = counter + 1
body: body:
num1 = num1 * counter num1 = num1 * counter

11
lib/os/OS.snow Normal file
View File

@ -0,0 +1,11 @@
module: os
import: os
function: print
params:
declare i1: int
returns: void
body:
syscall("PRINT",i1)
end body
end function
end module

View File

@ -1,13 +1,13 @@
function: main function: main
parameter: params:
return_type: int returns: int
body: body:
loop: loop:
initializer: init:
declare i:int = 0 declare i:int = 0
condition: cond:
1 == 1 1 == 1
update: step:
i = i + 1 i = i + 1
body: body:

View File

@ -0,0 +1,8 @@
module: Main
function: main
returns: void
body:
declare abc:int =1
end body
end function
end module

View File

@ -0,0 +1,33 @@
module: Main
import: os
function: main
returns: void
body:
loop:
init:
declare outer_i: int = 1
cond:
outer_i <= 10
step:
outer_i = outer_i + 1
body:
print(outer_i)
loop:
init:
// 注意这一行使用了外层循环的变量 outer_i
declare inter_j: int = outer_i
cond:
inter_j <= 10
step:
inter_j = inter_j + 1
body:
end body
end loop
end body
end loop
end body
end function
end module

View File

@ -0,0 +1,11 @@
module: os
import: os
function: print
params:
declare i1: int
returns: void
body:
syscall("PRINT",i1)
end body
end function
end module

View File

@ -0,0 +1,14 @@
module: Main
import: os
function: main
returns: void
body:
// 合法
declare b1: byte = 127b
declare s1: short = 32767s
declare i1: int = 2147483647
declare l1: long = 9223372036854775807L
end body
end function
end module

View File

@ -0,0 +1,11 @@
module: os
import: os
function: print
params:
declare i1: int
returns: void
body:
syscall("PRINT",i1)
end body
end function
end module

View File

@ -0,0 +1,9 @@
module: Main
import: ModuleB
function: main
returns: int
body:
return ModuleB.fun()
end body
end function
end module

Some files were not shown because too many files have changed in this diff Show More