Compare commits
346 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5b3d807bbc | |||
| 44b2ebb64a | |||
| eb7e2e7e93 | |||
| 77eddb83f4 | |||
| 4181ff8ae2 | |||
| 49b5e61e8e | |||
| e75a60026d | |||
| 83eb29fa3c | |||
| bc512fd02d | |||
| 0bbd82e9ce | |||
| 2fc2a93414 | |||
| 9bdc6245bf | |||
| 16ba11c391 | |||
| 19e473e93c | |||
| 5537a448e8 | |||
| caa62b0bfb | |||
| 3595631e2c | |||
| b033d53d28 | |||
| 8eda4fcbce | |||
| b02af0728a | |||
| b058ee4526 | |||
| 71cbb3a737 | |||
| ac0d3b9785 | |||
| f69dd85365 | |||
| c412d1194b | |||
| f39aece9cf | |||
| 439304c86a | |||
| 6e31185519 | |||
| 1c86c1dce7 | |||
| 1f8176d15e | |||
| f8a331809f | |||
| 0d6c6cef5a | |||
| 06bb647c83 | |||
| cc66eee75f | |||
| 1e2b0e4e0d | |||
| 1a0c3a38cb | |||
| fcdc3a49f8 | |||
| 139c42a90e | |||
| 2dfcc4c95e | |||
| 91aef32a42 | |||
| 18c9cbad7b | |||
| 310e909359 | |||
| d10b7336c1 | |||
| 3b39e9059b | |||
| c44f8a4630 | |||
| c4e9e541fb | |||
| da7d7bbcaa | |||
| d0c34ce1c2 | |||
| 1872221666 | |||
| 0a35289ad0 | |||
| 5f42beaf2a | |||
| b454d65962 | |||
| d536bd17ce | |||
| 3b3478ee30 | |||
| 926e87888c | |||
| f7db4fcce8 | |||
| 9afc1caac7 | |||
| 2a9d2b7f5f | |||
| f11303f0e8 | |||
| 7dd273759a | |||
| e626553a9c | |||
| b2c0b986c4 | |||
| a16f0ac059 | |||
| d3646c86ec | |||
| 39dff9efc5 | |||
| 80efd7c357 | |||
| 99345ddd19 | |||
| df07531edc | |||
| 5511978ed8 | |||
| 3406e1a2dd | |||
| 00f73ecb47 | |||
| e51ba01962 | |||
|
|
a9b4a6682a | ||
|
|
6c5bafb3e9 | ||
|
|
8d04397f32 | ||
|
|
7898505717 | ||
| 5fdb86cd1b | |||
|
|
60adecf808 | ||
|
|
4ae77434dc | ||
|
|
582ba2ce27 | ||
|
|
359c65228d | ||
|
|
3e7e5f2dad | ||
|
|
9a61798d81 | ||
|
|
9f3b3ad860 | ||
|
|
62f58cd83a | ||
|
|
a8cf93671e | ||
|
|
d11822f4ba | ||
|
|
87560db20d | ||
|
|
3a2a1363e6 | ||
| d54a2c59b6 | |||
| 4eb1aff553 | |||
| 80ee450b41 | |||
| f876f66414 | |||
| 2188171b63 | |||
| 7fab3cc662 | |||
| 62f2baab03 | |||
| 60388f6846 | |||
| 7c242d998f | |||
| d3a85a24bf | |||
| 477591303a | |||
| f4a269540a | |||
| cedc77cbc6 | |||
| f61cfa5638 | |||
| f6c877a7a1 | |||
| 6083c0b024 | |||
| b093f8db72 | |||
| 4a84f37b20 | |||
| 2a6fa8034c | |||
| 102e84bc01 | |||
| e5f23b77bd | |||
| 028561fc4f | |||
| 82f4ba1a6e | |||
| f1069d6e5d | |||
| ad11efe974 | |||
| 736e088a91 | |||
| d77368bb13 | |||
| e1a7f3310c | |||
| b7e9c8121e | |||
| 466b6ca2be | |||
| 1cb5951e68 | |||
| 1d73fc298e | |||
| 156f2b76c4 | |||
| 8e26b57cde | |||
| be8e57ef60 | |||
| 2c3c4089f8 | |||
| cadace165a | |||
| 15cd43a7d5 | |||
| f3409f32ce | |||
| 1293ac1f83 | |||
| 9a2b5d5e4e | |||
| fdeaa36366 | |||
| 3dfc8b63c8 | |||
| 30fa84604b | |||
| 025ea75f08 | |||
| c49b9f3df9 | |||
| d932ba10f0 | |||
| f1699bfbbe | |||
| 63835a1cce | |||
| 7c0a5e2524 | |||
| 1eaaacdf8c | |||
| 2f16dd2749 | |||
| 7395256b5a | |||
| 187ec7e0e9 | |||
| c334dd3e28 | |||
| 5b15b2d170 | |||
| 21e4668b16 | |||
| 5b8d7b98f3 | |||
| 63e8b0163a | |||
| 856d113b53 | |||
| 0cb2132e80 | |||
| 83b2122bd7 | |||
| 9132c79c54 | |||
| 12fc14e6e7 | |||
| 52d811b6aa | |||
| e0ad945202 | |||
| 2e4b76dfe2 | |||
| 9fb2dfae51 | |||
| 21ca6e6cab | |||
| 421eb0a0d9 | |||
| f5a6443c8a | |||
| 8d992001f9 | |||
| 4081d7d928 | |||
| 16a5d8d6ac | |||
| 9a4ebaadce | |||
| a86fb4826d | |||
| 589b0a96b9 | |||
| f81dba0210 | |||
| 688d6d7393 | |||
| 34e5de0454 | |||
| 210fdb62f0 | |||
| ebc322668e | |||
| 4860aba07f | |||
| b826fc43aa | |||
| f777841937 | |||
| 4ccff72a5b | |||
| e788e9c437 | |||
| 1486a1e3a5 | |||
| 80deaa9c4f | |||
| ebb9524db0 | |||
| 6f81feab3f | |||
| da7fc0b046 | |||
| 0dbe39eff3 | |||
| 1605390f08 | |||
| 70feb1fe5e | |||
| 07b7d5c40e | |||
| 6d79e28c51 | |||
| e84aedc100 | |||
| 074f0b6809 | |||
| a454eed26f | |||
| b30b6aeaaa | |||
| 33d89e9908 | |||
| 5ef36d5700 | |||
| a7117717bd | |||
| 6098a290b1 | |||
| e7c7451004 | |||
| b4c933e3d4 | |||
| 8eeed6f6b9 | |||
| 6a339149f1 | |||
| 3aef7cd906 | |||
| 970976ecc5 | |||
| 7a52c7dd78 | |||
| fec9fe3527 | |||
| 2cb428ed9b | |||
| c6067a8758 | |||
| 3aa38027c8 | |||
| b8c57b6c49 | |||
| b332c76ef8 | |||
| 983a287c42 | |||
| 72982c1127 | |||
| 64cefebee5 | |||
| 4e3de185b8 | |||
| 8ec5120e54 | |||
| dad69eabfb | |||
| 6f21cec444 | |||
| c388edd0cf | |||
|
|
6fb24f3f2f | ||
|
|
3dd06261e2 | ||
|
|
901d2f842a | ||
|
|
e2d4f97d75 | ||
|
|
f44fc18c52 | ||
| 08cfc1ffb9 | |||
| 59aef0c661 | |||
| 23c6de3601 | |||
| bf9190dec6 | |||
| 3758e3da40 | |||
| bfcfcbb107 | |||
| e6ad4ff282 | |||
| 5f0931155d | |||
| e4c6faf923 | |||
| 593930ccfc | |||
| 7f09b0e501 | |||
| 9acb52a7e1 | |||
| 5c6f61f25a | |||
| f185b12620 | |||
| d0e8cee6bd | |||
| ac5b73e320 | |||
| 69b4a418ba | |||
| 2093201173 | |||
| 268f1aa09a | |||
| cc106f57e1 | |||
| 93a553ea93 | |||
| f23e15339c | |||
| 2be4848735 | |||
| c4d9be8403 | |||
| 4a26bd50ca | |||
| e931d9ec06 | |||
| f540d7fad5 | |||
| 3d35e81a97 | |||
| f6382c4ccd | |||
| cd64137148 | |||
| eae66eac8c | |||
| 85d3b129ae | |||
|
|
3b168a134a | ||
|
|
59fdc6b39e | ||
| 2a31d57a53 | |||
| 8f96716ac4 | |||
| d8e3fb6e9c | |||
| 536ee64f6d | |||
| 054ab5d63d | |||
| d2732857f1 | |||
| fb1c54998b | |||
| 2c4850cc8f | |||
| b135a4b37b | |||
| d92e3d0e17 | |||
| bc309dfa97 | |||
| 1141abf231 | |||
| e2896eb37d | |||
| e18d7426bc | |||
| c1d0e03b6c | |||
| d2a6bde8cd | |||
| f820b9e9c0 | |||
| 3e59529666 | |||
| bc679d9b90 | |||
| 7310884047 | |||
|
|
da997a54c7 | ||
| d8c329ac94 | |||
| cf3e645845 | |||
| 30573a4e45 | |||
| 93f65585e0 | |||
| 68c1e3a412 | |||
| aa96fc89ab | |||
| 58a2c88b2b | |||
| e7d7e7f96f | |||
| 099f4f934c | |||
| 81ca858cc1 | |||
| 82069629dd | |||
| 5177d00dce | |||
| bba560a468 | |||
| bf1ab316fc | |||
| adc8b6a3a7 | |||
|
|
e881bffe85 | ||
|
|
69d6617855 | ||
|
|
1230e63923 | ||
|
|
e33ad15475 | ||
|
|
a69cbb868a | ||
|
|
9d21eeace9 | ||
| e82bac7046 | |||
|
|
61a2fda6fa | ||
|
|
e66a5a3078 | ||
|
|
609e380664 | ||
|
|
e0fda2e104 | ||
| 55c7bae77c | |||
| 304d3e1c0e | |||
| 3e8b3f7629 | |||
|
|
9cfd3ba29a | ||
|
|
f6780194a5 | ||
|
|
c5810bce7b | ||
|
|
cd61fdf295 | ||
|
|
efc88b33e3 | ||
|
|
9026b2deb3 | ||
|
|
bbb908428e | ||
| 565cc79329 | |||
|
|
9f6a1edccb | ||
| d9b3593e9b | |||
| 34247fb70d | |||
| 7f074cb798 | |||
| e1f36d9689 | |||
| 230d0d21a5 | |||
| 43aa055d7d | |||
|
|
4f63f88b40 | ||
|
|
f382b2bc54 | ||
|
|
872865268b | ||
|
|
9c69c1f37b | ||
|
|
85fae69c97 | ||
|
|
4595583ca4 | ||
|
|
9e2eb6731f | ||
|
|
2289cf3ee4 | ||
| c83a584795 | |||
|
|
2a25abcf03 | ||
| 45eed2aefc | |||
|
|
65b12ddd4c | ||
| aefa9e2dff | |||
| f4d96cfa53 | |||
|
|
fabde0026f | ||
| 50c778b9b1 | |||
| 47b3e994d1 | |||
| 840ac25e8a | |||
| 84a6b2701c | |||
|
|
eee77ea451 | ||
|
|
3466c27c9e | ||
|
|
fe9a8e7505 | ||
|
|
ec94191153 | ||
|
|
ccc9e3e50f | ||
|
|
9d7d03e91c | ||
|
|
8340e2bacc | ||
|
|
f3f8a8de70 |
2
.env
Normal file
2
.env
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Auto-generated by build\tools\generate-dotenv.ps1
|
||||||
|
SNOW_VERSION=0.8.0
|
||||||
@ -69,7 +69,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: 软件版本/分支
|
label: 软件版本/分支
|
||||||
options:
|
options:
|
||||||
- v0.4.0
|
- v0.8.0
|
||||||
- main
|
- main
|
||||||
- dev
|
- dev
|
||||||
- 其他
|
- 其他
|
||||||
|
|||||||
@ -11,7 +11,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: 任务标题
|
label: 任务标题
|
||||||
description: 简要描述维护内容
|
description: 简要描述维护内容
|
||||||
placeholder: "如:升级 JDK 版本"
|
placeholder: "如: 升级 JDK 版本"
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
@ -20,6 +20,6 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: 任务详情
|
label: 任务详情
|
||||||
description: 描述执行步骤或相关脚本命令
|
description: 描述执行步骤或相关脚本命令
|
||||||
placeholder: "如:修改 pom.xml…"
|
placeholder: "如: 修改 pom.xml…"
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@ -20,7 +20,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: 优化方案
|
label: 优化方案
|
||||||
description: 详细描述改进思路与实现方式
|
description: 详细描述改进思路与实现方式
|
||||||
placeholder: "如:缓存机制、算法优化…"
|
placeholder: "如: 缓存机制、算法优化…"
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
@ -29,6 +29,6 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: 预期收益
|
label: 预期收益
|
||||||
description: 描述优化后带来的效益或体验提升
|
description: 描述优化后带来的效益或体验提升
|
||||||
placeholder: "如:响应时间缩短 30%…"
|
placeholder: "如: 响应时间缩短 30%…"
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@ -32,6 +32,6 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: 修复截止日期
|
label: 修复截止日期
|
||||||
description: 填写计划完成的日期 (YYYY-MM-DD)
|
description: 填写计划完成的日期 (YYYY-MM-DD)
|
||||||
placeholder: "例如:2025-06-20"
|
placeholder: "例如: 2025-06-20"
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@ -20,7 +20,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: 已尝试方法
|
label: 已尝试方法
|
||||||
description: 列出已尝试过的解决方案或思路
|
description: 列出已尝试过的解决方案或思路
|
||||||
placeholder: "如:查阅文档、尝试示例代码…"
|
placeholder: "如: 查阅文档、尝试示例代码…"
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
@ -29,6 +29,6 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: 期望答案
|
label: 期望答案
|
||||||
description: 描述希望获得的解答或帮助方向
|
description: 描述希望获得的解答或帮助方向
|
||||||
placeholder: "如:最佳实践、配置示例…"
|
placeholder: "如: 最佳实践、配置示例…"
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@ -20,7 +20,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: 重构原因
|
label: 重构原因
|
||||||
description: 说明当前存在的痛点或待改进之处
|
description: 说明当前存在的痛点或待改进之处
|
||||||
placeholder: "如:变量命名不规范、函数职责过多…"
|
placeholder: "如: 变量命名不规范、函数职责过多…"
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
@ -29,6 +29,6 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: 预期效果
|
label: 预期效果
|
||||||
description: 说明重构后带来的好处或验证方式
|
description: 说明重构后带来的好处或验证方式
|
||||||
placeholder: "如:提高性能、增强可读性…"
|
placeholder: "如: 提高性能、增强可读性…"
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@ -3,14 +3,14 @@
|
|||||||
https://gitee.com/jcnc-org/snow/blob/main/doc/Git-Management/Git-Management.md
|
https://gitee.com/jcnc-org/snow/blob/main/doc/Git-Management/Git-Management.md
|
||||||
提交 PR 后,请根据实际情况删除不适用的项。
|
提交 PR 后,请根据实际情况删除不适用的项。
|
||||||
|
|
||||||
1. 请在右侧面板中:
|
1. 请在右侧面板中:
|
||||||
- 关联 Issue
|
- 关联 Issue
|
||||||
- 选择 PR 类型(bug 修复 / 新功能 / 文档 / 优化 等)
|
- 选择 PR 类型(bug 修复 / 新功能 / 文档 / 优化 等)
|
||||||
- 添加必要的标签和审查人
|
- 添加必要的标签和审查人
|
||||||
- 请添加里程碑
|
- 请添加里程碑
|
||||||
- 如必要请设置优先级
|
- 如必要请设置优先级
|
||||||
|
|
||||||
2. 在下面的“检查清单”里,用 `- [x]` 标记已完成,用 `- [ ]` 标记未完成。例如:
|
2. 在下面的“检查清单”里,用 `- [x]` 标记已完成,用 `- [ ]` 标记未完成。例如:
|
||||||
- [x] 已阅读并遵守项目规范
|
- [x] 已阅读并遵守项目规范
|
||||||
- [ ] 本地通过所有测试
|
- [ ] 本地通过所有测试
|
||||||
- [ ] 文档已更新(如有必要)
|
- [ ] 文档已更新(如有必要)
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -40,3 +40,4 @@ target/
|
|||||||
|
|
||||||
### Snow 虚拟机指令 ###
|
### Snow 虚拟机指令 ###
|
||||||
*.water
|
*.water
|
||||||
|
/.lingma/
|
||||||
|
|||||||
@ -4,12 +4,6 @@
|
|||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug1 -o target/Bug1" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug1 -o target/Bug1" />
|
||||||
<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/Bug2.run.xml
Normal file
11
.run/Bug2.run.xml
Normal 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
11
.run/Bug3.run.xml
Normal 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
11
.run/Bug4.run.xml
Normal 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
11
.run/Bug5.run.xml
Normal 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
10
.run/Bug6.run.xml
Normal 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>
|
||||||
@ -3,13 +3,7 @@
|
|||||||
<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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo1 -o target/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>
|
||||||
|
|||||||
@ -1,15 +1,9 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="Demo10" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false">
|
<configuration default="false" name="Demo10" 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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo10 -o target/Demo10" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo10 -o target/Demo10 --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>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo11 -o target/Demo11" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo11 -o target/Demo11 --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/Demo12.run.xml
Normal file
11
.run/Demo12.run.xml
Normal 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
10
.run/Demo13.run.xml
Normal 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
18
.run/Demo14.run.xml
Normal 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
10
.run/Demo15.run.xml
Normal 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
10
.run/Demo16.run.xml
Normal 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
10
.run/Demo17.run.xml
Normal 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
10
.run/Demo18.run.xml
Normal 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
10
.run/Demo19.run.xml
Normal 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>
|
||||||
@ -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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo2 -o target/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
10
.run/Demo20.run.xml
Normal 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
10
.run/Demo21.run.xml
Normal 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
10
.run/Demo22.run.xml
Normal 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
10
.run/Demo23.run.xml
Normal 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
10
.run/Demo24.run.xml
Normal 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
10
.run/Demo25.run.xml
Normal 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>
|
||||||
@ -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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo3 -o target/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>
|
||||||
|
|||||||
@ -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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo4 -o target/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>
|
||||||
|
|||||||
@ -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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo5 -o target/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>
|
||||||
|
|||||||
@ -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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo6 -o target/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>
|
||||||
|
|||||||
@ -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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo7 -o target/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>
|
||||||
|
|||||||
@ -1,15 +1,9 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="Demo8" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false">
|
<configuration default="false" name="Demo8" 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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo8 -o target/Demo8" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo8 -o target/Demo8 --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>
|
||||||
|
|||||||
@ -1,15 +1,9 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="Demo9" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false">
|
<configuration default="false" name="Demo9" 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.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo9 -o target/Demo9" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo9 -o target/Demo9 --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>
|
||||||
|
|||||||
@ -3,12 +3,6 @@
|
|||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="--help" />
|
<option name="PROGRAM_PARAMETERS" value="--help" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.cli.SnowCLI" />
|
|
||||||
<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>
|
||||||
|
|||||||
@ -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
15
.run/Snow.run.xml
Normal 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>
|
||||||
@ -3,12 +3,6 @@
|
|||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="--version" />
|
<option name="PROGRAM_PARAMETERS" value="--version" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.cli.SnowCLI" />
|
|
||||||
<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>
|
||||||
|
|||||||
6
.run/build-project2tar.ps1.run.xml
Normal file
6
.run/build-project2tar.ps1.run.xml
Normal 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>
|
||||||
@ -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>
|
||||||
6
.run/release-linux.ps1.run.xml
Normal file
6
.run/release-linux.ps1.run.xml
Normal 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>
|
||||||
6
.run/release-windows.ps1.run.xml
Normal file
6
.run/release-windows.ps1.run.xml
Normal 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>
|
||||||
@ -3,7 +3,21 @@
|
|||||||
<toRun name="Demo1" type="Application" />
|
<toRun name="Demo1" type="Application" />
|
||||||
<toRun name="Demo10" type="Application" />
|
<toRun name="Demo10" type="Application" />
|
||||||
<toRun name="Demo11" 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="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="Demo3" type="Application" />
|
||||||
<toRun name="Demo4" type="Application" />
|
<toRun name="Demo4" type="Application" />
|
||||||
<toRun name="Demo6" type="Application" />
|
<toRun name="Demo6" type="Application" />
|
||||||
|
|||||||
57
Dockerfile
Normal file
57
Dockerfile
Normal 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
|
||||||
401
README.md
401
README.md
@ -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.4.0/">
|
<a href="https://gitee.com/jcnc-org/snow/tree/v0.8.0/">
|
||||||
<img src="https://img.shields.io/badge/version-v0.4.0-blue" alt="">
|
<img src="https://img.shields.io/badge/version-v0.8.0-blue" alt="">
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ SnowVM) 的完整编译-执行链路。
|
|||||||
|
|
||||||
Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助 LLM 更好地理解程序。
|
Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助 LLM 更好地理解程序。
|
||||||
|
|
||||||
语言使用显式的 `module` 声明来组织代码,用 `function`,`parameter`,`return_type`,`body` 等关键字分隔不同代码块,语法结构固定且易读。此外,Snow
|
语言使用显式的 `module` 声明来组织代码,用 `function`,`params`,`returns`,`body` 等关键字分隔不同代码块,语法结构固定且易读。此外,Snow
|
||||||
实现了语义分析来检查变量作用域和类型一致性,在编译阶段捕获错误并确保生成的中间代码正确无误。这种自上而下的编译流程,使得代码设计和生成更加模块化,可解释,也有利于调试和优化。
|
实现了语义分析来检查变量作用域和类型一致性,在编译阶段捕获错误并确保生成的中间代码正确无误。这种自上而下的编译流程,使得代码设计和生成更加模块化,可解释,也有利于调试和优化。
|
||||||
|
|
||||||
相关背景: [心路历程](docs/Snow-Lang-Journey/Snow-Lang-Journey.md)
|
相关背景: [心路历程](docs/Snow-Lang-Journey/Snow-Lang-Journey.md)
|
||||||
@ -53,12 +53,12 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
|||||||
|
|
||||||
| 类别 | 关键特性 |
|
| 类别 | 关键特性 |
|
||||||
|----------|---------------------------------------------------------------------------------------------------|
|
|----------|---------------------------------------------------------------------------------------------------|
|
||||||
| 语言层 | `module` / `import` / `function` / `loop` / `if–else` / Pratt 表达式解析<br>静态类型检查 & 作用域分析 |
|
| 语言层 | module / import / function / loop / if–else / Pratt 表达式解析<br>静态类型检查 & 作用域分析 |
|
||||||
| 编译器前端 | **Lexer / Parser / Semantic Analyzer** 全栈自研,生成 JSON-AST |
|
| 编译器前端 | Lexer / Parser / Semantic Analyzer 全栈自研,生成 JSON-AST |
|
||||||
| IR & 后端 | 三地址式 IR ➜ 线性扫描寄存器分配 ➜ SnowVM 指令 |
|
| IR & 后端 | 三地址式 IR ➜ 线性扫描寄存器分配 ➜ SnowVM 指令 |
|
||||||
| 虚拟机 | 栈 + 寄存器混合架构、GUI 局部变量监视 |
|
| 虚拟机 | 栈 + 寄存器混合架构、GUI 局部变量监视 |
|
||||||
| snow pkg | - `.cloud` DSL 描述项目、依赖与构建<br>- 预设 `clean / compile / run / package / publish` 任务<br>- 离线缓存与远程仓库解析 |
|
| snow pkg | - `.cloud` DSL 描述项目、依赖与构建<br>- 预设 `clean / compile / run / package / publish` 任务<br>- 离线缓存与远程仓库解析 |
|
||||||
| CLI | `snow init`, `snow compile`, `snow run`, `snow clean`, `snow build`, `snow generate` |
|
| CLI | init, compile, run, clean, build, generate,debug |
|
||||||
|
|
||||||
## Snow-Lang 官网
|
## Snow-Lang 官网
|
||||||
|
|
||||||
@ -69,6 +69,10 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
|||||||
[https://gitee.com/jcnc-org/snow/releases](https://gitee.com/jcnc-org/snow/releases)
|
[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)
|
[Git 管理规范](docs/Snow-Lang-Git-Management/Snow-Lang-Git-Management.md)
|
||||||
|
|
||||||
@ -82,11 +86,11 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
|||||||
|
|
||||||
## 开发环境安装
|
## 开发环境安装
|
||||||
|
|
||||||
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
|
||||||
@ -100,45 +104,157 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
|||||||
|
|
||||||
4. **运行成功**
|
4. **运行成功**
|
||||||
|
|
||||||
`````snow
|
`````snow
|
||||||
## 编译器输出
|
## 编译器输出
|
||||||
### Snow 源代码
|
### Snow 源代码
|
||||||
#### Main.snow
|
#### Main.snow
|
||||||
module: Main
|
module: Main
|
||||||
import:Math
|
import:Math
|
||||||
function: main
|
function: main
|
||||||
return_type: int
|
returns: int
|
||||||
body:
|
body:
|
||||||
Math.add(6,1)
|
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
|
||||||
|
|
||||||
|
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
|
#### Math.snow
|
||||||
module: Math
|
module: Math
|
||||||
function: add
|
function: add
|
||||||
parameter:
|
params:
|
||||||
declare n1: int
|
declare n1: int
|
||||||
declare n2: int
|
declare n2: int
|
||||||
return_type: int
|
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
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"type": "Module",
|
"type": "Module",
|
||||||
"name": "Main",
|
"name": "Main",
|
||||||
"imports": [
|
"imports": [
|
||||||
{
|
{
|
||||||
"module": "Math",
|
"type": "Import",
|
||||||
"type": "Import"
|
"module": "Math"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"functions": [
|
"functions": [
|
||||||
{
|
{
|
||||||
"type": "Function",
|
"type": "Function",
|
||||||
"name": "main",
|
"name": "main",
|
||||||
"parameters": [
|
"parameters": [
|
||||||
@ -146,97 +262,96 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
|||||||
],
|
],
|
||||||
"returnType": "int",
|
"returnType": "int",
|
||||||
"body": [
|
"body": [
|
||||||
{
|
{
|
||||||
"type": "ExpressionStatement",
|
"type": "ExpressionStatement",
|
||||||
"expression": {
|
"expression": {
|
||||||
"type": "CallExpression",
|
"type": "CallExpression",
|
||||||
"callee": {
|
"callee": {
|
||||||
"type": "MemberExpression",
|
"type": "MemberExpression",
|
||||||
"object": {
|
"object": {
|
||||||
"type": "Identifier",
|
"type": "Identifier",
|
||||||
"name": "Math"
|
"name": "Math"
|
||||||
},
|
},
|
||||||
"member": "add"
|
"member": "add"
|
||||||
},
|
},
|
||||||
"arguments": [
|
"arguments": [
|
||||||
{
|
{
|
||||||
"type": "NumberLiteral",
|
"type": "NumberLiteral",
|
||||||
"value": "6"
|
"value": "6"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "NumberLiteral",
|
"type": "NumberLiteral",
|
||||||
"value": "1"
|
"value": "1"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Return",
|
"type": "Return",
|
||||||
"value": {
|
"value": {
|
||||||
"type": "NumberLiteral",
|
"type": "NumberLiteral",
|
||||||
"value": "0"
|
"value": "0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Module",
|
"type": "Module",
|
||||||
"name": "Math",
|
"name": "Math",
|
||||||
"imports": [
|
"imports": [
|
||||||
|
|
||||||
],
|
],
|
||||||
"functions": [
|
"functions": [
|
||||||
{
|
{
|
||||||
"type": "Function",
|
"type": "Function",
|
||||||
"name": "add",
|
"name": "add",
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
"name": "n1",
|
"name": "n1",
|
||||||
"type": "int"
|
"type": "int"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "n2",
|
"name": "n2",
|
||||||
"type": "int"
|
"type": "int"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"returnType": "int",
|
"returnType": "int",
|
||||||
"body": [
|
"body": [
|
||||||
{
|
{
|
||||||
"type": "Return",
|
"type": "Return",
|
||||||
"value": {
|
"value": {
|
||||||
"type": "BinaryExpression",
|
"type": "BinaryExpression",
|
||||||
"left": {
|
"left": {
|
||||||
"type": "Identifier",
|
"type": "Identifier",
|
||||||
"name": "n1"
|
"name": "n1"
|
||||||
},
|
},
|
||||||
"operator": "+",
|
"operator": "+",
|
||||||
"right": {
|
"right": {
|
||||||
"type": "Identifier",
|
"type": "Identifier",
|
||||||
"name": "n2"
|
"name": "n2"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
### IR
|
### IR
|
||||||
func main() {
|
func main() {
|
||||||
%0 = CONST 6
|
%0 = CONST 6
|
||||||
%1 = CONST 1
|
%1 = CONST 1
|
||||||
%2 = CALL Math.add, %0, %1
|
%2 = CALL Math.add, %0, %1
|
||||||
%3 = CONST 0
|
%3 = CONST 0
|
||||||
RET %3
|
RET %3
|
||||||
}
|
}
|
||||||
func add(%0, %1) {
|
func add(%0, %1) {
|
||||||
%2 = ADD_I32 %0, %1
|
%2 = ADD_I32 %0, %1
|
||||||
RET %2
|
RET %2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
### VM code
|
### VM code
|
||||||
0000: I_PUSH 6
|
0000: I_PUSH 6
|
||||||
0001: I_STORE 0
|
0001: I_STORE 0
|
||||||
@ -244,35 +359,41 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
|||||||
0003: I_STORE 1
|
0003: I_STORE 1
|
||||||
0004: I_LOAD 0
|
0004: I_LOAD 0
|
||||||
0005: I_LOAD 1
|
0005: I_LOAD 1
|
||||||
0006: CALL 12 2
|
0006: CALL 13 2
|
||||||
0007: I_STORE 2
|
0007: I_STORE 2
|
||||||
0008: I_PUSH 0
|
0008: I_PUSH 0
|
||||||
0009: I_STORE 3
|
0009: I_STORE 3
|
||||||
0010: I_LOAD 3
|
0010: I_LOAD 3
|
||||||
0011: HALT
|
0011: HALT
|
||||||
0012: I_LOAD 0
|
0012: HALT
|
||||||
0013: I_LOAD 1
|
0013: I_LOAD 0
|
||||||
0014: I_ADD
|
0014: I_LOAD 1
|
||||||
0015: I_STORE 2
|
0015: I_ADD
|
||||||
0016: I_LOAD 2
|
0016: I_STORE 2
|
||||||
0017: RET
|
0017: I_LOAD 2
|
||||||
|
0018: RET
|
||||||
|
0019: RET
|
||||||
Written to D:\Devs\IdeaProjects\Snow\target\Demo1.water
|
Written to D:\Devs\IdeaProjects\Snow\target\Demo1.water
|
||||||
|
|
||||||
=== Launching VM ===
|
=== Launching VM ===
|
||||||
Calling function at address: 12
|
|
||||||
|
Calling function at address: 13
|
||||||
|
|
||||||
Return 7
|
Return 7
|
||||||
|
|
||||||
Process has ended
|
Process has ended
|
||||||
|
|
||||||
Operand Stack state:[0]
|
Operand Stack state:[0]
|
||||||
|
|
||||||
--- Call Stack State ---
|
--- Call Stack State ---
|
||||||
|
|
||||||
|
|
||||||
### VM Local Variable Table:
|
### VM Local Variable Table:
|
||||||
0: 6
|
0: 6
|
||||||
1: 1
|
1: 1
|
||||||
2: 7
|
2: 7
|
||||||
3: 0
|
3: 0
|
||||||
|
|
||||||
|
=== VM exited ===
|
||||||
`````
|
`````
|
||||||
|
|
||||||
## 编译 Snow 源代码
|
## 编译 Snow 源代码
|
||||||
@ -281,38 +402,38 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
|||||||
|
|
||||||
独立编译不依赖 `.cloud` 文件,而是直接使用 `Snow` 编译器进行 `.snow` 文件的编译和执行。
|
独立编译不依赖 `.cloud` 文件,而是直接使用 `Snow` 编译器进行 `.snow` 文件的编译和执行。
|
||||||
|
|
||||||
#### 独立编译步骤:
|
#### 独立编译步骤:
|
||||||
|
|
||||||
1. **运行编译器:**
|
1. **运行编译器:**
|
||||||
你可以通过以下命令来编译单个或多个 `.snow` 文件,或者递归编译一个目录中的所有 `.snow` 源文件为`.water`虚拟机指令。
|
你可以通过以下命令来编译单个或多个 `.snow` 文件,或者递归编译一个目录中的所有 `.snow` 源文件为`.water`虚拟机指令。
|
||||||
|
|
||||||
* **单个文件编译:**
|
* **单个文件编译:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
Snow complete [SnowCode].snow
|
Snow complete [SnowCode].snow
|
||||||
```
|
```
|
||||||
|
|
||||||
* **多个文件编译:**
|
* **多个文件编译:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
Snow complete [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow -o [Name]
|
Snow complete [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow -o [Name]
|
||||||
```
|
```
|
||||||
|
|
||||||
* **目录递归编译:**
|
* **目录递归编译:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
Snow -d path/to/source_dir
|
Snow -d path/to/source_dir
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **查看编译输出:**
|
2. **查看编译输出:**
|
||||||
编译过程会输出源代码、抽象语法树(AST)、中间表示(IR)以及虚拟机指令等内容。你可以看到如下几个分段输出:
|
编译过程会输出源代码、抽象语法树(AST)、中间表示(IR)以及虚拟机指令等内容。你可以看到如下几个分段输出:
|
||||||
|
|
||||||
* **AST**(抽象语法树)部分以 JSON 格式输出。
|
* **AST**(抽象语法树)部分以 JSON 格式输出。
|
||||||
* **IR**(中间表示)部分会列出逐行的中间代码。
|
* **IR**(中间表示)部分会列出逐行的中间代码。
|
||||||
* **VM code**(虚拟机指令)会展示虚拟机的字节码指令。
|
* **VM code**(虚拟机指令)会展示虚拟机的字节码指令。
|
||||||
|
|
||||||
3. **默认执行模式:**
|
3. **默认执行模式:**
|
||||||
编译器会在 **DEBUG 模式** 下运行,显示详细的执行过程和状态,并且在虚拟机中执行编译后的代码,最后会打印出所有局部变量的值。
|
编译器会在 **RUN 模式** 下运行,**DEBUG 模式**显示详细的执行过程和状态,并且在虚拟机中执行编译后的代码,最后会打印出所有局部变量的值。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -320,30 +441,30 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
|||||||
|
|
||||||
集成编译需要使用 `.cloud` 文件来指定项目的配置和结构,适用于项目标准化、依赖管理、构建管理和项目分发等场景。
|
集成编译需要使用 `.cloud` 文件来指定项目的配置和结构,适用于项目标准化、依赖管理、构建管理和项目分发等场景。
|
||||||
|
|
||||||
#### 集成编译命令:
|
#### 集成编译命令:
|
||||||
|
|
||||||
1. **基本用法:**
|
1. **基本用法:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
snow [OPTIONS] <command>
|
snow [OPTIONS] <command>
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **命令选项:**
|
2. **命令选项:**
|
||||||
|
|
||||||
* `-h, --help`:显示帮助信息并退出。
|
* `-h, --help`: 显示帮助信息并退出。
|
||||||
* `-v, --version`:打印 Snow 编程语言的版本并退出。
|
* `-v, --version`: 打印 Snow 编程语言的版本并退出。
|
||||||
|
|
||||||
3. **可用命令:**
|
3. **可用命令:**
|
||||||
|
|
||||||
* `compile`:将 `.snow` 源文件编译成虚拟机字节码文件(`.water`)。此命令会使用 `.cloud` 文件来指导编译过程。
|
* `compile`: 将 `.snow` 源文件编译成虚拟机字节码文件(`.water`)。此命令会使用 `.cloud` 文件来指导编译过程。
|
||||||
* `clean`:清理构建输出和本地缓存,移除中间产物,释放磁盘空间。
|
* `clean`: 清理构建输出和本地缓存,移除中间产物,释放磁盘空间。
|
||||||
* `version`:打印 Snow 的版本。
|
* `version`: 打印 Snow 的版本。
|
||||||
* `run`:运行已编译的虚拟机字节码文件(`.water`)。
|
* `run`: 运行已编译的虚拟机字节码文件(`.water`)。
|
||||||
* `init`:初始化一个新项目,生成 `project.cloud` 文件。
|
* `init`: 初始化一个新项目,生成 `project.cloud` 文件。
|
||||||
* `generate`:根据 `project.cloud` 生成项目目录结构。
|
* `generate`: 根据 `project.cloud` 生成项目目录结构。
|
||||||
* `build`:构建当前项目,按顺序解析依赖、编译和打包。
|
* `build`: 构建当前项目,按顺序解析依赖、编译和打包。
|
||||||
|
|
||||||
4. **例如,执行集成编译命令:**
|
4. **例如,执行集成编译命令:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
snow compile [SnowCode].snow
|
snow compile [SnowCode].snow
|
||||||
@ -351,14 +472,14 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
|||||||
|
|
||||||
* 此命令会使用 `.cloud` 文件中的配置信息来指导编译过程,并生成 `.water`。
|
* 此命令会使用 `.cloud` 文件中的配置信息来指导编译过程,并生成 `.water`。
|
||||||
|
|
||||||
5. **使用帮助:**
|
5. **使用帮助:**
|
||||||
如果你需要了解某个命令的详细选项,可以使用:
|
如果你需要了解某个命令的详细选项,可以使用:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
snow <command> --help
|
snow <command> --help
|
||||||
```
|
```
|
||||||
|
|
||||||
例如,查看 `compile` 命令的具体选项:
|
例如,查看 `compile` 命令的具体选项:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
snow compile --help
|
snow compile --help
|
||||||
@ -368,12 +489,12 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
|||||||
|
|
||||||
## 示例代码片段
|
## 示例代码片段
|
||||||
|
|
||||||
以下是一个简单的 Snow 代码示例,演示模块定义,导入和函数声明的基本语法:
|
以下是一个简单的 Snow 代码示例,演示模块定义,导入和函数声明的基本语法:
|
||||||
|
|
||||||
```snow
|
```snow
|
||||||
module: Math
|
module: Math
|
||||||
function: main
|
function: main
|
||||||
return_type: int
|
returns: int
|
||||||
body:
|
body:
|
||||||
Math.factorial(6)
|
Math.factorial(6)
|
||||||
return 0
|
return 0
|
||||||
@ -381,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
|
||||||
@ -403,10 +524,10 @@ module: Math
|
|||||||
end module
|
end module
|
||||||
```
|
```
|
||||||
|
|
||||||
上述代码定义了一个名为 `Math` 的模块,其中包含两个函数:
|
上述代码定义了一个名为 `Math` 的模块,其中包含两个函数:
|
||||||
|
|
||||||
* `main`:不接收任何参数,返回类型为 `int`。在函数体内调用了 `Math.factorial(6)`,然后返回 `0`。
|
* `main`: 不接收任何参数,返回类型为 `int`。在函数体内调用了 `Math.factorial(6)`,然后返回 `0`。
|
||||||
* `factorial`:接收一个 `int` 类型的参数 `n`,返回类型为 `int`。函数体内先声明并初始化局部变量 `num1` 为 `1`,然后通过一个
|
* `factorial`: 接收一个 `int` 类型的参数 `n`,返回类型为 `int`。函数体内先声明并初始化局部变量 `num1` 为 `1`,然后通过一个
|
||||||
`loop` 循环(从 `counter = 1` 到 `counter <= n`)依次将 `num1` 乘以 `counter`,循环结束后返回 `num1`,即 `n` 的阶乘值。
|
`loop` 循环(从 `counter = 1` 到 `counter <= n`)依次将 `num1` 乘以 `counter`,循环结束后返回 `num1`,即 `n` 的阶乘值。
|
||||||
|
|
||||||
|
|
||||||
@ -414,53 +535,59 @@ end module
|
|||||||
|
|
||||||
## 项目结构说明
|
## 项目结构说明
|
||||||
|
|
||||||
* `compiler/`:Snow 编译器源代码目录
|
* `compiler/`: Snow 编译器源代码目录
|
||||||
|
|
||||||
* `lexer/`:词法分析模块,负责将源码切分为 Token
|
* `lexer/`: 词法分析模块,负责将源码切分为 Token
|
||||||
* `parser/`:语法分析模块,将 Token 流解析为 AST(含模块/函数/语句解析)
|
* `parser/`: 语法分析模块,将 Token 流解析为 AST(含模块/函数/语句解析)
|
||||||
* `semantic/`:语义分析模块,负责符号表管理、类型检查等
|
* `semantic/`: 语义分析模块,负责符号表管理、类型检查等
|
||||||
* `ir/`:中间表示(IR)模块,生成并管理三地址码形式的中间代码
|
* `ir/`: 中间表示(IR)模块,生成并管理三地址码形式的中间代码
|
||||||
* `backend/`:编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器
|
* `backend/`: 编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器
|
||||||
|
|
||||||
* `vm/`:虚拟机相关源代码目录
|
* `vm/`: 虚拟机相关源代码目录
|
||||||
|
|
||||||
* `commands/`:定义 SnowVM 指令集的具体实现
|
* `commands/`: 定义 SnowVM 指令集的具体实现
|
||||||
* `engine/`:核心执行引擎,提供指令执行和寄存器/栈管理
|
* `engine/`: 核心执行引擎,提供指令执行和寄存器/栈管理
|
||||||
* `execution/`:执行流程控制(按指令顺序执行、分支跳转等)
|
* `execution/`: 执行流程控制(按指令顺序执行、分支跳转等)
|
||||||
* `io/`:输入输出辅助类(加载指令、文件解析等)
|
* `io/`: 输入输出辅助类(加载指令、文件解析等)
|
||||||
* `gui/`:Swing 可视化调试面板,实时展示局部变量表
|
* `gui/`: Swing 可视化调试面板,实时展示局部变量表
|
||||||
* `factories/`、`utils/`:指令创建、日志调试等公共工具
|
* `factories/`、`utils/`: 指令创建、日志调试等公共工具
|
||||||
|
|
||||||
* `pkg/`:内置构建与包管理器 **snow pkg**
|
* `pkg/`: 内置构建与包管理器 **snow pkg**
|
||||||
|
|
||||||
* `dsl/`:`.cloud` 描述文件解析器
|
* `dsl/`: `.cloud` 描述文件解析器
|
||||||
* `tasks/`:预设任务实现(`clean · compile · run · package · publish` 等)
|
* `tasks/`: 预设任务实现(`clean · compile · run · package · publish` 等)
|
||||||
* `resolver/`:本地/远程仓库解析与缓存
|
* `resolver/`: 本地/远程仓库解析与缓存
|
||||||
* `lifecycle/`:任务生命周期钩子(pre/post 脚本等)
|
* `lifecycle/`: 任务生命周期钩子(pre/post 脚本等)
|
||||||
* `model/`:项目、依赖、版本等模型
|
* `model/`: 项目、依赖、版本等模型
|
||||||
* `utils/`:文件、日志、校验和等通用工具
|
* `utils/`: 文件、日志、校验和等通用工具
|
||||||
* `doc/`:开发者文档与示例 `.cloud` 配置
|
* `doc/`: 开发者文档与示例 `.cloud` 配置
|
||||||
|
|
||||||
* `cli/`:独立的命令行前端
|
* `cli/`: 独立的命令行前端
|
||||||
|
|
||||||
* `commands/`:`compile` / `run` / `pkg` 等子命令实现
|
* `commands/`: `compile` / `run` / `pkg` 等子命令实现
|
||||||
* `api/`:公共选项解析、终端交互抽象
|
* `api/`: 公共选项解析、终端交互抽象
|
||||||
* `utils/`:终端颜色、进度条、异常格式化等
|
* `utils/`: 终端颜色、进度条、异常格式化等
|
||||||
* `SnowCLI.java`:CLI 主入口
|
* `SnowCLI.java`: CLI 主入口
|
||||||
|
|
||||||
|
|
||||||
## 版权声明
|
## 版权声明
|
||||||
|
|
||||||
版权所有 © 2025 许轲(Luke),代表 SnowLang 项目。
|
版权所有 © 2025 许轲(Luke),代表 SnowLang 项目。
|
||||||
仓库地址:<https://gitee.com/jcnc-org/snow>
|
仓库地址: <https://gitee.com/jcnc-org/snow>
|
||||||
本项目依据 [Apache 2.0 许可证](LICENSE) 进行许可和发布。
|
本项目依据 [Apache 2.0 许可证](LICENSE) 进行许可和发布。
|
||||||
|
|
||||||
“SnowLang 项目”为由许轲(Luke)发起的独立开源项目。
|
“SnowLang 项目”为由许轲(Luke)发起的独立开源项目。
|
||||||
未来,项目可能会成立正式的组织或实体,以进一步负责本项目的开发和管理。
|
未来,项目可能会成立正式的组织或实体,以进一步负责本项目的开发和管理。
|
||||||
|
|
||||||
|
## 支持我们
|
||||||
|
|
||||||
|
如果你喜欢我们的项目,欢迎给我们一个 Star!
|
||||||
|
你们的关注和支持,是我们团队持续进步的动力源泉!谢谢大家!
|
||||||
|
|
||||||
|
|
||||||
## 加入我们
|
## 加入我们
|
||||||
|
|
||||||
- 微信:`xuxiaolankaka`
|
- 微信: `xuxiaolankaka`
|
||||||
- QQ:`1399528359`
|
- QQ: `1399528359`
|
||||||
- 邮箱:`luke.k.xu [at] hotmail.com`
|
- 邮箱: `luke.k.xu [at] hotmail.com`
|
||||||
|
|
||||||
|
|||||||
@ -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` 脚本。确保您已经切换到包含该脚本的目录,或提供完整的文件路径来执行它。
|
||||||
|
|
||||||
|
|||||||
48
build/build-project2tar.ps1
Normal file
48
build/build-project2tar.ps1
Normal 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
129
build/build-release-all.ps1
Normal 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
|
||||||
@ -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
136
build/release-linux.ps1
Normal 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
117
build/release-windows.ps1
Normal 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
53
build/tools/dotenv.ps1
Normal 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
|
||||||
|
}
|
||||||
23
build/tools/generate-dotenv.ps1
Normal file
23
build/tools/generate-dotenv.ps1
Normal 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
|
||||||
24
docker-compose.yml
Normal file
24
docker-compose.yml
Normal 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
|
||||||
@ -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
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
## 2. 前置条件
|
## 2. 前置条件
|
||||||
|
|
||||||
1. 操作系统:Linux/macOS/Windows
|
1. 操作系统: Linux/macOS/Windows
|
||||||
2. Java 项目(Maven)
|
2. Java 项目(Maven)
|
||||||
3. GraalVM(建议 24+ 版本)
|
3. GraalVM(建议 24+ 版本)
|
||||||
|
|
||||||
@ -14,10 +14,10 @@
|
|||||||
|
|
||||||
### 3.1 安装 GraalVM
|
### 3.1 安装 GraalVM
|
||||||
|
|
||||||
1. 下载对应平台的 GraalVM Community 版本:[https://www.graalvm.org/downloads/](https://www.graalvm.org/downloads/)
|
1. 下载对应平台的 GraalVM Community 版本: [https://www.graalvm.org/downloads/](https://www.graalvm.org/downloads/)
|
||||||
2. 解压并配置环境变量:
|
2. 解压并配置环境变量:
|
||||||
|
|
||||||
3. 验证安装:
|
3. 验证安装:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
java -version
|
java -version
|
||||||
@ -44,12 +44,12 @@ Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 24.0.1+9.1 (build 24.0.1+9-jvmc
|
|||||||
|
|
||||||
## 4. Maven 项目配置文件
|
## 4. Maven 项目配置文件
|
||||||
|
|
||||||
通过将以下配置文件添加到 `pom.xml` 中,为 Native Image 启用 Maven 插件:
|
通过将以下配置文件添加到 `pom.xml` 中,为 Native Image 启用 Maven 插件:
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
<profiles>
|
<profiles>
|
||||||
<!--
|
<!--
|
||||||
原生镜像构建:Linux 平台
|
原生镜像构建: Linux 平台
|
||||||
- 使用 GraalVM 的 native-image 工具,生成静态链接的可执行文件
|
- 使用 GraalVM 的 native-image 工具,生成静态链接的可执行文件
|
||||||
- 依赖 musl libc,需提前安装并配置 musl-gcc 工具链
|
- 依赖 musl libc,需提前安装并配置 musl-gcc 工具链
|
||||||
-->
|
-->
|
||||||
@ -111,7 +111,7 @@ Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 24.0.1+9.1 (build 24.0.1+9-jvmc
|
|||||||
</profile>
|
</profile>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
原生镜像构建:Windows 平台
|
原生镜像构建: Windows 平台
|
||||||
- 使用 GraalVM 的 native-image 工具,生成 Windows 可执行文件
|
- 使用 GraalVM 的 native-image 工具,生成 Windows 可执行文件
|
||||||
- Windows 上不使用 musl,因此不配置静态链接
|
- Windows 上不使用 musl,因此不配置静态链接
|
||||||
-->
|
-->
|
||||||
@ -169,6 +169,6 @@ Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 24.0.1+9.1 (build 24.0.1+9-jvmc
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
3. 等待 Native Image 构建完成:这个过程可能较慢(数分钟)。
|
3. 等待 Native Image 构建完成: 这个过程可能较慢(数分钟)。
|
||||||
4. 可执行文件即可直接运行,无需 JVM。
|
4. 可执行文件即可直接运行,无需 JVM。
|
||||||
> 生成的可执行文件位于 target/ 目录。
|
> 生成的可执行文件位于 target/ 目录。
|
||||||
|
|||||||
@ -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 友好和人类易用的创新编程语言。也许,下一个改变编程世界的创举,就在我们手中诞生。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -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**: 异常系统、稳定包管理、文档完善 |
|
||||||
|
|||||||
581
docs/Snow-Lang-Syntax/Snow-Lang-Grammar-Specification.md
Normal file
581
docs/Snow-Lang-Syntax/Snow-Lang-Grammar-Specification.md
Normal file
@ -0,0 +1,581 @@
|
|||||||
|
# Snow‑Lang 语法规范
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0 · 符号约定
|
||||||
|
|
||||||
|
* ⟦ … ⟧: 可选项(0 或 1 次)
|
||||||
|
* { … }\*: 可重复项(0 次或多次)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1 · 词汇结构
|
||||||
|
|
||||||
|
### 1.1 编码与字符集
|
||||||
|
|
||||||
|
源文件采用 UTF‑8 编码。除注释外,标识符只允许英文大小写字母 (A‑Z a‑z)、数字 (0‑9) 与下划线 _;首字符不能为数字。
|
||||||
|
|
||||||
|
```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) // 匹配第二个构造函数
|
||||||
|
````
|
||||||
258
docs/Snow-Lang-Syntax/Snow-Lang-Syntax.md
Normal file
258
docs/Snow-Lang-Syntax/Snow-Lang-Syntax.md
Normal 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
|
||||||
|
```
|
||||||
@ -1,7 +1,8 @@
|
|||||||
# SnowVM-OpCode
|
# SnowVM-OpCode
|
||||||
|
|
||||||
## 1. Byte8 区域(0x0000-0x001F)
|
## Type Control (0x0000-0x00BF)
|
||||||
|
|
||||||
|
### Byte8 (0x0000-0x001F)
|
||||||
| 指令名 | 十六进制 | 说明 |
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|----------|--------|----------------|
|
|----------|--------|----------------|
|
||||||
| B\_ADD | 0x0000 | byte8 加法 |
|
| B\_ADD | 0x0000 | byte8 加法 |
|
||||||
@ -26,7 +27,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. Short16 区域(0x0020-0x003F)
|
### Short16 (0x0020-0x003F)
|
||||||
|
|
||||||
| 指令名 | 十六进制 | 说明 |
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|----------|--------|------------------|
|
|----------|--------|------------------|
|
||||||
@ -52,7 +53,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. Int32 区域(0x0040-0x005F)
|
### Int32 (0x0040-0x005F)
|
||||||
|
|
||||||
| 指令名 | 十六进制 | 说明 |
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|----------|--------|----------------|
|
|----------|--------|----------------|
|
||||||
@ -78,7 +79,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. Long64 区域(0x0060-0x007F)
|
### Long64 区域(0x0060-0x007F)
|
||||||
|
|
||||||
| 指令名 | 十六进制 | 说明 |
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|----------|--------|-----------------|
|
|----------|--------|-----------------|
|
||||||
@ -104,7 +105,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. Float32 区域(0x0080-0x009F)
|
### Float32 区域(0x0080-0x009F)
|
||||||
|
|
||||||
| 指令名 | 十六进制 | 说明 |
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|----------|--------|------------------|
|
|----------|--------|------------------|
|
||||||
@ -127,7 +128,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 6. Double64 区域(0x00A0-0x00BF)
|
### Double64 区域(0x00A0-0x00BF)
|
||||||
|
|
||||||
| 指令名 | 十六进制 | 说明 |
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|----------|--------|-------------------|
|
|----------|--------|-------------------|
|
||||||
@ -150,7 +151,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 7. 类型转换(0x00C0-0x00DF)
|
## Type Conversion (0x00C0-0x00DF)
|
||||||
|
|
||||||
| 指令名 | 十六进制 | 说明 |
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|-----|--------|--------------------|
|
|-----|--------|--------------------|
|
||||||
@ -185,11 +186,17 @@
|
|||||||
| D2L | 0x00DC | double64 转 long64 |
|
| D2L | 0x00DC | double64 转 long64 |
|
||||||
| D2F | 0x00DD | double64 转 float32 |
|
| D2F | 0x00DD | double64 转 float32 |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
## Reference Control (0x00E0-0x00EF)
|
||||||
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|
|----------|--------|---------------------------|
|
||||||
|
| R\_PUSH | 0x00E0 | 将对象引用压入操作数栈 |
|
||||||
|
| R\_LOAD | 0x00E1 | 从本地变量表加载对象引用并压入操作数栈 |
|
||||||
|
| R\_STORE | 0x00E2 | 将操作数栈顶的对象引用弹出并存入本地变量表指定槽位 |
|
||||||
|
|
||||||
## 8. 栈控制(0x0100-0x01FF)
|
|
||||||
|
|
||||||
|
## Stack Control (0x0100-0x01FF)
|
||||||
|
|
||||||
| 指令名 | 十六进制 | 说明 |
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|------|--------|----------|
|
|------|--------|----------|
|
||||||
@ -199,7 +206,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 9. 流程控制(0x0200-0x02FF)
|
## Flow Control (0x0200-0x02FF)
|
||||||
|
|
||||||
| 指令名 | 十六进制/十进制 | 说明 |
|
| 指令名 | 十六进制/十进制 | 说明 |
|
||||||
|------|----------|-------|
|
|------|----------|-------|
|
||||||
@ -209,7 +216,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 10. 寄存器控制(0x0300-0x03FF)
|
## Register Control (0x0300-0x03FF)
|
||||||
|
|
||||||
| 指令名 | 十六进制 | 说明 |
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|-----|--------|---------|
|
|-----|--------|---------|
|
||||||
@ -217,7 +224,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 11. 系统控制(0x0400-0x04FF)
|
## System Control (0x0400-0x04FF)
|
||||||
|
|
||||||
| 指令名 | 十六进制 | 说明 |
|
| 指令名 | 十六进制 | 说明 |
|
||||||
|-------------|--------|------|
|
|-------------|--------|------|
|
||||||
|
|||||||
@ -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
11
lib/os/OS.snow
Normal 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
|
||||||
@ -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:
|
||||||
|
|
||||||
|
|||||||
@ -1,17 +1,8 @@
|
|||||||
module: Main
|
module: Main
|
||||||
function: main
|
function: main
|
||||||
parameter:
|
returns: void
|
||||||
return_type: int
|
|
||||||
body:
|
body:
|
||||||
declare n1: int =1
|
declare abc:int =1
|
||||||
declare n2: int =2
|
|
||||||
declare n3: int =1
|
|
||||||
if n1 ==1 then
|
|
||||||
if n2 ==2 then
|
|
||||||
n3 =3
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
return n3
|
|
||||||
end body
|
end body
|
||||||
end function
|
end function
|
||||||
end module
|
end module
|
||||||
@ -1,12 +0,0 @@
|
|||||||
## 编译器输出
|
|
||||||
### Snow 源代码
|
|
||||||
#### Main.snow
|
|
||||||
```snow
|
|
||||||
function: main
|
|
||||||
return_type: int
|
|
||||||
body:
|
|
||||||
3 L
|
|
||||||
return 65537
|
|
||||||
end body
|
|
||||||
end function
|
|
||||||
```
|
|
||||||
33
playground/BugFarm/Bug2/Main.snow
Normal file
33
playground/BugFarm/Bug2/Main.snow
Normal 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
|
||||||
11
playground/BugFarm/Bug2/OS.snow
Normal file
11
playground/BugFarm/Bug2/OS.snow
Normal 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
|
||||||
14
playground/BugFarm/Bug3/Main.snow
Normal file
14
playground/BugFarm/Bug3/Main.snow
Normal 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
|
||||||
11
playground/BugFarm/Bug3/OS.snow
Normal file
11
playground/BugFarm/Bug3/OS.snow
Normal 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
|
||||||
9
playground/BugFarm/Bug4/Main.snow
Normal file
9
playground/BugFarm/Bug4/Main.snow
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
module: Main
|
||||||
|
import: ModuleB
|
||||||
|
function: main
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
return ModuleB.fun()
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
8
playground/BugFarm/Bug4/a.snow
Normal file
8
playground/BugFarm/Bug4/a.snow
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
module: ModuleA
|
||||||
|
function: fun
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
return 123
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
9
playground/BugFarm/Bug4/b.snow
Normal file
9
playground/BugFarm/Bug4/b.snow
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
module: ModuleB
|
||||||
|
import: ModuleA
|
||||||
|
function: fun
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
return ModuleA.fun() + ModuleA.fun()
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
16
playground/BugFarm/Bug5/Main.snow
Normal file
16
playground/BugFarm/Bug5/Main.snow
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
module: Main
|
||||||
|
import: os
|
||||||
|
globals:
|
||||||
|
declare sum: int = 0
|
||||||
|
function: main
|
||||||
|
params:
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
sum = 20
|
||||||
|
|
||||||
|
os.print(sum)
|
||||||
|
|
||||||
|
return 0
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
11
playground/BugFarm/Bug5/OS.snow
Normal file
11
playground/BugFarm/Bug5/OS.snow
Normal 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
|
||||||
13
playground/BugFarm/Bug6/Main.snow
Normal file
13
playground/BugFarm/Bug6/Main.snow
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
module: Main
|
||||||
|
import: os
|
||||||
|
globals:
|
||||||
|
declare sum: int = 123
|
||||||
|
function: main
|
||||||
|
params:
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
os.print(sum)
|
||||||
|
return 0
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
11
playground/BugFarm/Bug6/OS.snow
Normal file
11
playground/BugFarm/Bug6/OS.snow
Normal 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
|
||||||
@ -1,7 +1,7 @@
|
|||||||
module: Main
|
module: Main
|
||||||
import:Math
|
import:Math
|
||||||
function: main
|
function: main
|
||||||
return_type: int
|
returns: int
|
||||||
body:
|
body:
|
||||||
Math.add(6,1)
|
Math.add(6,1)
|
||||||
return 0
|
return 0
|
||||||
@ -1,9 +1,9 @@
|
|||||||
module: Math
|
module: Math
|
||||||
function: add
|
function: add
|
||||||
parameter:
|
params:
|
||||||
declare n1: int
|
declare n1: int
|
||||||
declare n2: int
|
declare n2: int
|
||||||
return_type: int
|
returns: int
|
||||||
body:
|
body:
|
||||||
return n1 + n2
|
return n1 + n2
|
||||||
end body
|
end body
|
||||||
@ -1,5 +1,5 @@
|
|||||||
function: main
|
function: main
|
||||||
return_type: int
|
returns: int
|
||||||
body:
|
body:
|
||||||
declare res: boolean = 8L > 7L
|
declare res: boolean = 8L > 7L
|
||||||
if res then
|
if res then
|
||||||
@ -1,5 +1,5 @@
|
|||||||
function: main
|
function: main
|
||||||
return_type: int
|
returns: int
|
||||||
body:
|
body:
|
||||||
return 65537
|
return 65537
|
||||||
end body
|
end body
|
||||||
21
playground/Demo/Demo12/Main.snow
Normal file
21
playground/Demo/Demo12/Main.snow
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
module: Main
|
||||||
|
function: main
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
foo()
|
||||||
|
|
||||||
|
return 0
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
|
||||||
|
function: foo
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
if false then
|
||||||
|
return 1
|
||||||
|
end if
|
||||||
|
|
||||||
|
return 0
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
69
playground/Demo/Demo13/Main.snow
Normal file
69
playground/Demo/Demo13/Main.snow
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
module: Main
|
||||||
|
function: main
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
5 == 7
|
||||||
|
5 == 7s
|
||||||
|
5 == 7b
|
||||||
|
5 == 7l
|
||||||
|
5 == 7f
|
||||||
|
5 == 7.0
|
||||||
|
|
||||||
|
5b == 5b
|
||||||
|
5b == 5s
|
||||||
|
5b == 5l
|
||||||
|
5b == 5f
|
||||||
|
5b == 5.0
|
||||||
|
|
||||||
|
5s == 5s
|
||||||
|
5s == 5l
|
||||||
|
5s == 5f
|
||||||
|
5s == 5.0
|
||||||
|
|
||||||
|
5l == 5l
|
||||||
|
5l == 5f
|
||||||
|
5l == 5.0
|
||||||
|
|
||||||
|
5f == 5f
|
||||||
|
5f == 5.0
|
||||||
|
|
||||||
|
5.0 == 5.0
|
||||||
|
|
||||||
|
declare b: byte = 8b
|
||||||
|
declare s: short = 8s
|
||||||
|
declare i: int = 8
|
||||||
|
declare l: long = 8l
|
||||||
|
declare f: float = 8f
|
||||||
|
declare d: double = 8
|
||||||
|
|
||||||
|
b == b
|
||||||
|
b == s
|
||||||
|
b == i
|
||||||
|
b == l
|
||||||
|
b == f
|
||||||
|
b == d
|
||||||
|
|
||||||
|
s == s
|
||||||
|
s == i
|
||||||
|
s == l
|
||||||
|
s == f
|
||||||
|
s == d
|
||||||
|
|
||||||
|
i == i
|
||||||
|
i == l
|
||||||
|
i == f
|
||||||
|
i == d
|
||||||
|
|
||||||
|
l == l
|
||||||
|
l == f
|
||||||
|
l == d
|
||||||
|
|
||||||
|
f == f
|
||||||
|
f == d
|
||||||
|
|
||||||
|
d == d
|
||||||
|
|
||||||
|
return 65537
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
9
playground/Demo/Demo14/Main.snow
Normal file
9
playground/Demo/Demo14/Main.snow
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
module: Main
|
||||||
|
import: os
|
||||||
|
function: main
|
||||||
|
returns: void
|
||||||
|
body:
|
||||||
|
os.print(222)
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
11
playground/Demo/Demo14/OS.snow
Normal file
11
playground/Demo/Demo14/OS.snow
Normal 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
|
||||||
20
playground/Demo/Demo15/Main.snow
Normal file
20
playground/Demo/Demo15/Main.snow
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
module: Main
|
||||||
|
import: os
|
||||||
|
globals:
|
||||||
|
declare num2:int=10
|
||||||
|
function: main
|
||||||
|
returns: void
|
||||||
|
body:
|
||||||
|
declare num1:int=11
|
||||||
|
os.print(num1+num2+abc())
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
|
||||||
|
function: abc
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
return 1
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
|
||||||
|
end module
|
||||||
11
playground/Demo/Demo15/OS.snow
Normal file
11
playground/Demo/Demo15/OS.snow
Normal 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
|
||||||
22
playground/Demo/Demo16/Main.snow
Normal file
22
playground/Demo/Demo16/Main.snow
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
module: Main
|
||||||
|
import: os
|
||||||
|
function: main
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
loop:
|
||||||
|
init:
|
||||||
|
declare i:int = 1
|
||||||
|
cond:
|
||||||
|
i <= 10
|
||||||
|
step:
|
||||||
|
i = i + 1
|
||||||
|
body:
|
||||||
|
if i % 2 == 0 then
|
||||||
|
os.print(i)
|
||||||
|
end if
|
||||||
|
end body
|
||||||
|
end loop
|
||||||
|
return 0
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
11
playground/Demo/Demo16/OS.snow
Normal file
11
playground/Demo/Demo16/OS.snow
Normal 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
|
||||||
23
playground/Demo/Demo17/Main.snow
Normal file
23
playground/Demo/Demo17/Main.snow
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
module: Main
|
||||||
|
import: os
|
||||||
|
function: main
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
loop:
|
||||||
|
init:
|
||||||
|
declare i:int = 1
|
||||||
|
cond:
|
||||||
|
i <= 10
|
||||||
|
step:
|
||||||
|
i = i + 1
|
||||||
|
body:
|
||||||
|
if i % 2 == 0 then
|
||||||
|
os.print(i)
|
||||||
|
break
|
||||||
|
end if
|
||||||
|
end body
|
||||||
|
end loop
|
||||||
|
return 0
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
11
playground/Demo/Demo17/OS.snow
Normal file
11
playground/Demo/Demo17/OS.snow
Normal 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
|
||||||
43
playground/Demo/Demo18/Main.snow
Normal file
43
playground/Demo/Demo18/Main.snow
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
module: Main
|
||||||
|
import: os
|
||||||
|
function: main
|
||||||
|
returns: int
|
||||||
|
body:
|
||||||
|
loop:
|
||||||
|
init:
|
||||||
|
declare i:int = 1
|
||||||
|
cond:
|
||||||
|
i <= 5
|
||||||
|
step:
|
||||||
|
i = i + 1
|
||||||
|
body:
|
||||||
|
if i % 2 == 0 then
|
||||||
|
continue
|
||||||
|
end if
|
||||||
|
if i > 3 then
|
||||||
|
break
|
||||||
|
end if
|
||||||
|
loop:
|
||||||
|
init:
|
||||||
|
declare j:int = 1
|
||||||
|
cond:
|
||||||
|
j <= 5
|
||||||
|
step:
|
||||||
|
j = j + 1
|
||||||
|
body:
|
||||||
|
if j == 4 then
|
||||||
|
break
|
||||||
|
end if
|
||||||
|
if j % 2 == 0 then
|
||||||
|
continue
|
||||||
|
end if
|
||||||
|
os.print(i)
|
||||||
|
os.print(j)
|
||||||
|
end body
|
||||||
|
end loop
|
||||||
|
end body
|
||||||
|
end loop
|
||||||
|
return 0
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
11
playground/Demo/Demo18/OS.snow
Normal file
11
playground/Demo/Demo18/OS.snow
Normal 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
|
||||||
26
playground/Demo/Demo19/Main.snow
Normal file
26
playground/Demo/Demo19/Main.snow
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
module: Main
|
||||||
|
import: os
|
||||||
|
function: main
|
||||||
|
returns: void
|
||||||
|
body:
|
||||||
|
declare n: int[][][][] = [
|
||||||
|
[
|
||||||
|
[ [17, 18], [19, 20] ],
|
||||||
|
[ [21, 22], [23, 24] ]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[ [25, 26], [27, 28] ],
|
||||||
|
[ [29, 30], [31, 32] ]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
declare i: int = 0
|
||||||
|
declare j: int = 1
|
||||||
|
declare k: int = 0
|
||||||
|
declare l: int = 0
|
||||||
|
|
||||||
|
declare x: int = n[i][j][k][l]
|
||||||
|
os.print(x)
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user