Compare commits

..

No commits in common. "main" and "v0.4.0" have entirely different histories.
main ... v0.4.0

360 changed files with 3198 additions and 11695 deletions

2
.env
View File

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

View File

@ -69,7 +69,7 @@ body:
attributes:
label: 软件版本/分支
options:
- v0.8.0
- v0.4.0
- main
- dev
- 其他

View File

@ -11,7 +11,7 @@ body:
attributes:
label: 任务标题
description: 简要描述维护内容
placeholder: "如: 升级 JDK 版本"
placeholder: "如升级 JDK 版本"
validations:
required: true
@ -20,6 +20,6 @@ body:
attributes:
label: 任务详情
description: 描述执行步骤或相关脚本命令
placeholder: "如: 修改 pom.xml…"
placeholder: "如修改 pom.xml…"
validations:
required: false

View File

@ -20,7 +20,7 @@ body:
attributes:
label: 优化方案
description: 详细描述改进思路与实现方式
placeholder: "如: 缓存机制、算法优化…"
placeholder: "如缓存机制、算法优化…"
validations:
required: true
@ -29,6 +29,6 @@ body:
attributes:
label: 预期收益
description: 描述优化后带来的效益或体验提升
placeholder: "如: 响应时间缩短 30%…"
placeholder: "如响应时间缩短 30%…"
validations:
required: false

View File

@ -32,6 +32,6 @@ body:
attributes:
label: 修复截止日期
description: 填写计划完成的日期 (YYYY-MM-DD)
placeholder: "例如: 2025-06-20"
placeholder: "例如2025-06-20"
validations:
required: false

View File

@ -20,7 +20,7 @@ body:
attributes:
label: 已尝试方法
description: 列出已尝试过的解决方案或思路
placeholder: "如: 查阅文档、尝试示例代码…"
placeholder: "如查阅文档、尝试示例代码…"
validations:
required: false
@ -29,6 +29,6 @@ body:
attributes:
label: 期望答案
description: 描述希望获得的解答或帮助方向
placeholder: "如: 最佳实践、配置示例…"
placeholder: "如最佳实践、配置示例…"
validations:
required: false

View File

@ -20,7 +20,7 @@ body:
attributes:
label: 重构原因
description: 说明当前存在的痛点或待改进之处
placeholder: "如: 变量命名不规范、函数职责过多…"
placeholder: "如变量命名不规范、函数职责过多…"
validations:
required: true
@ -29,6 +29,6 @@ body:
attributes:
label: 预期效果
description: 说明重构后带来的好处或验证方式
placeholder: "如: 提高性能、增强可读性…"
placeholder: "如提高性能、增强可读性…"
validations:
required: false

View File

@ -3,14 +3,14 @@
https://gitee.com/jcnc-org/snow/blob/main/doc/Git-Management/Git-Management.md
提交 PR 后,请根据实际情况删除不适用的项。
1. 请在右侧面板中:
1. 请在右侧面板中
- 关联 Issue
- 选择 PR 类型bug 修复 / 新功能 / 文档 / 优化 等)
- 添加必要的标签和审查人
- 请添加里程碑
- 如必要请设置优先级
2. 在下面的“检查清单”里,用 `- [x]` 标记已完成,用 `- [ ]` 标记未完成。例如:
2. 在下面的“检查清单”里,用 `- [x]` 标记已完成,用 `- [ ]` 标记未完成。例如
- [x] 已阅读并遵守项目规范
- [ ] 本地通过所有测试
- [ ] 文档已更新(如有必要)

1
.gitignore vendored
View File

@ -40,4 +40,3 @@ target/
### Snow 虚拟机指令 ###
*.water
/.lingma/

View File

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

View File

@ -1,11 +0,0 @@
<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>

View File

@ -1,11 +0,0 @@
<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>

View File

@ -1,11 +0,0 @@
<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>

View File

@ -1,11 +0,0 @@
<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>

View File

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

View File

@ -1,9 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo1" type="Application" factoryName="Application" folderName="Demo">
<configuration default="false" name="Demo1" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false">
<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/Demo1 -o target/Demo1 --debug" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo1 -o target/Demo1" />
<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">
<option name="Make" enabled="true" />
</method>

View File

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

View File

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

View File

@ -1,11 +0,0 @@
<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>

View File

@ -1,10 +0,0 @@
<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>

View File

@ -1,18 +0,0 @@
<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>

View File

@ -1,10 +0,0 @@
<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>

View File

@ -1,10 +0,0 @@
<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>

View File

@ -1,10 +0,0 @@
<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>

View File

@ -1,10 +0,0 @@
<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>

View File

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

View File

@ -1,9 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo2" type="Application" factoryName="Application" folderName="Demo">
<configuration default="false" name="Demo2" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false">
<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/Demo2 -o target/Demo2 --debug" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo2 -o target/Demo2" />
<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">
<option name="Make" enabled="true" />
</method>

View File

@ -1,10 +0,0 @@
<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>

View File

@ -1,10 +0,0 @@
<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>

View File

@ -1,10 +0,0 @@
<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>

View File

@ -1,10 +0,0 @@
<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>

View File

@ -1,10 +0,0 @@
<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>

View File

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

View File

@ -1,9 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo3" type="Application" factoryName="Application" folderName="Demo">
<configuration default="false" name="Demo3" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false">
<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/Demo3 -o target/Demo3 --debug" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo3 -o target/Demo3" />
<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">
<option name="Make" enabled="true" />
</method>

View File

@ -1,9 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo4" type="Application" factoryName="Application" folderName="Demo">
<configuration default="false" name="Demo4" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false">
<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/Demo4 -o target/Demo4 --debug" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo4 -o target/Demo4" />
<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">
<option name="Make" enabled="true" />
</method>

View File

@ -1,9 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo5" type="Application" factoryName="Application" folderName="Demo">
<configuration default="false" name="Demo5" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false">
<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/Demo5 -o target/Demo5 --debug" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo5 -o target/Demo5" />
<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">
<option name="Make" enabled="true" />
</method>

View File

@ -1,9 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo6" type="Application" factoryName="Application" folderName="Demo">
<configuration default="false" name="Demo6" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false">
<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/Demo6 -o target/Demo6 --debug" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo6 -o target/Demo6" />
<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">
<option name="Make" enabled="true" />
</method>

View File

@ -1,9 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Demo7" type="Application" factoryName="Application" folderName="Demo">
<configuration default="false" name="Demo7" type="Application" factoryName="Application" folderName="Demo" activateToolWindowBeforeRun="false">
<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/Demo7 -o target/Demo7 --debug" />
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo7 -o target/Demo7" />
<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">
<option name="Make" enabled="true" />
</method>

View File

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

View File

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

View File

@ -3,6 +3,12 @@
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<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">
<option name="Make" enabled="true" />
</method>

7
.run/Run.run.xml Normal file
View File

@ -0,0 +1,7 @@
<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>

View File

@ -1,15 +0,0 @@
<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>

View File

@ -3,6 +3,12 @@
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
<module name="Snow" />
<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">
<option name="Make" enabled="true" />
</method>

View File

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

View File

@ -1,9 +1,9 @@
<component name="ProjectRunConfigurationManager">
<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">
<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>
<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">
<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>

View File

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

View File

@ -1,6 +0,0 @@
<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>

View File

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

View File

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

View File

@ -187,7 +187,6 @@
identification within third-party archives.
Copyright © 2025 Ke Xu (Luke), on behalf of the SnowLang Project
Repository: https://gitee.com/jcnc-org/snow
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

15
NOTICE
View File

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

412
README.md
View File

@ -11,8 +11,8 @@
<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="">
</a>
<a href="https://gitee.com/jcnc-org/snow/tree/v0.8.0/">
<img src="https://img.shields.io/badge/version-v0.8.0-blue" alt="">
<a href="https://gitee.com/jcnc-org/snow/tree/v0.4.0/">
<img src="https://img.shields.io/badge/version-v0.4.0-blue" alt="">
</a>
</p>
@ -44,7 +44,7 @@ SnowVM) 的完整编译-执行链路。
Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助 LLM 更好地理解程序。
语言使用显式的 `module` 声明来组织代码,用 `function`,`params`,`returns`,`body` 等关键字分隔不同代码块,语法结构固定且易读。此外,Snow
语言使用显式的 `module` 声明来组织代码,用 `function`,`parameter`,`return_type`,`body` 等关键字分隔不同代码块,语法结构固定且易读。此外,Snow
实现了语义分析来检查变量作用域和类型一致性,在编译阶段捕获错误并确保生成的中间代码正确无误。这种自上而下的编译流程,使得代码设计和生成更加模块化,可解释,也有利于调试和优化。
相关背景: [心路历程](docs/Snow-Lang-Journey/Snow-Lang-Journey.md)
@ -53,12 +53,12 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
| 类别 | 关键特性 |
|----------|---------------------------------------------------------------------------------------------------|
| 语言层 | module / import / function / loop / ifelse / Pratt 表达式解析<br>静态类型检查 & 作用域分析 |
| 编译器前端 | Lexer / Parser / Semantic Analyzer 全栈自研,生成 JSON-AST |
| 语言层 | `module` / `import` / `function` / `loop` / `ifelse` / Pratt 表达式解析<br>静态类型检查 & 作用域分析 |
| 编译器前端 | **Lexer / Parser / Semantic Analyzer** 全栈自研,生成 JSON-AST |
| IR & 后端 | 三地址式 IR ➜ 线性扫描寄存器分配 ➜ SnowVM 指令 |
| 虚拟机 | 栈 + 寄存器混合架构、GUI 局部变量监视 |
| snow pkg | - `.cloud` DSL 描述项目、依赖与构建<br>- 预设 `clean / compile / run / package / publish` 任务<br>- 离线缓存与远程仓库解析 |
| CLI | init, compile, run, clean, build, generate,debug |
| CLI | `snow init`, `snow compile`, `snow run`, `snow clean`, `snow build`, `snow generate` |
## Snow-Lang 官网
@ -69,10 +69,6 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
[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)
@ -86,11 +82,11 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
## 开发环境安装
1. **开发环境准备**:
1. **开发环境准备**
1. 安装集成开发环境 [IntelliJ IDEA](https://www.jetbrains.com/idea/download)
2. 安装 Java 开发工具 [Graalvm-jdk-24](https://www.graalvm.org/downloads/)
2. **获取源码**:
2. **获取源码**
将项目源码下载或克隆到本地目录。
```bash
git clone https://gitee.com/jcnc-org/snow.git
@ -104,254 +100,143 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
4. **运行成功**
`````snow
`````snow
## 编译器输出
### Snow 源代码
#### Main.snow
module: Main
import:Math
function: main
returns: int
return_type: int
body:
Math.add(6,1)
return 0
end body
end function
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
module: Math
function: add
params:
parameter:
declare n1: int
declare n2: int
returns: int
return_type: int
body:
return n1 + n2
return n1 + n2
end body
end function
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
[
{
{
"type": "Module",
"name": "Main",
"imports": [
{
"type": "Import",
"module": "Math"
}
{
"module": "Math",
"type": "Import"
}
],
"functions": [
{
{
"type": "Function",
"name": "main",
"parameters": [
],
"returnType": "int",
"body": [
{
{
"type": "ExpressionStatement",
"expression": {
"type": "CallExpression",
"callee": {
"type": "CallExpression",
"callee": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "Math"
"type": "Identifier",
"name": "Math"
},
"member": "add"
},
"arguments": [
},
"arguments": [
{
"type": "NumberLiteral",
"value": "6"
"type": "NumberLiteral",
"value": "6"
},
{
"type": "NumberLiteral",
"value": "1"
"type": "NumberLiteral",
"value": "1"
}
]
]
}
},
{
},
{
"type": "Return",
"value": {
"type": "NumberLiteral",
"value": "0"
"type": "NumberLiteral",
"value": "0"
}
}
}
]
}
}
]
},
{
},
{
"type": "Module",
"name": "Math",
"imports": [
],
"functions": [
{
{
"type": "Function",
"name": "add",
"parameters": [
{
{
"name": "n1",
"type": "int"
},
{
},
{
"name": "n2",
"type": "int"
}
}
],
"returnType": "int",
"body": [
{
{
"type": "Return",
"value": {
"type": "BinaryExpression",
"left": {
"type": "BinaryExpression",
"left": {
"type": "Identifier",
"name": "n1"
},
"operator": "+",
"right": {
},
"operator": "+",
"right": {
"type": "Identifier",
"name": "n2"
}
}
}
}
}
]
}
}
]
}
}
]
### IR
func main() {
%0 = CONST 6
%1 = CONST 1
%2 = CALL Math.add, %0, %1
%3 = CONST 0
RET %3
%0 = CONST 6
%1 = CONST 1
%2 = CALL Math.add, %0, %1
%3 = CONST 0
RET %3
}
func add(%0, %1) {
%2 = ADD_I32 %0, %1
RET %2
%2 = ADD_I32 %0, %1
RET %2
}
### VM code
0000: I_PUSH 6
0001: I_STORE 0
@ -359,41 +244,35 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
0003: I_STORE 1
0004: I_LOAD 0
0005: I_LOAD 1
0006: CALL 13 2
0006: CALL 12 2
0007: I_STORE 2
0008: I_PUSH 0
0009: I_STORE 3
0010: I_LOAD 3
0011: HALT
0012: HALT
0013: I_LOAD 0
0014: I_LOAD 1
0015: I_ADD
0016: I_STORE 2
0017: I_LOAD 2
0018: RET
0019: RET
0012: I_LOAD 0
0013: I_LOAD 1
0014: I_ADD
0015: I_STORE 2
0016: I_LOAD 2
0017: RET
Written to D:\Devs\IdeaProjects\Snow\target\Demo1.water
=== Launching VM ===
Calling function at address: 13
Calling function at address: 12
Return 7
Process has ended
Operand Stack state:[0]
--- Call Stack State ---
### VM Local Variable Table:
0: 6
1: 1
2: 7
3: 0
=== VM exited ===
`````
## 编译 Snow 源代码
@ -402,38 +281,38 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
独立编译不依赖 `.cloud` 文件,而是直接使用 `Snow` 编译器进行 `.snow` 文件的编译和执行。
#### 独立编译步骤:
#### 独立编译步骤
1. **运行编译器:**
1. **运行编译器**
你可以通过以下命令来编译单个或多个 `.snow` 文件,或者递归编译一个目录中的所有 `.snow` 源文件为`.water`虚拟机指令。
* **单个文件编译:**
* **单个文件编译**
```bash
Snow complete [SnowCode].snow
```
* **多个文件编译:**
* **多个文件编译**
```bash
Snow complete [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow -o [Name]
```
* **目录递归编译:**
* **目录递归编译**
```bash
Snow -d path/to/source_dir
```
2. **查看编译输出:**
编译过程会输出源代码、抽象语法树AST、中间表示IR以及虚拟机指令等内容。你可以看到如下几个分段输出:
2. **查看编译输出**
编译过程会输出源代码、抽象语法树AST、中间表示IR以及虚拟机指令等内容。你可以看到如下几个分段输出
* **AST**(抽象语法树)部分以 JSON 格式输出。
* **IR**(中间表示)部分会列出逐行的中间代码。
* **VM code**(虚拟机指令)会展示虚拟机的字节码指令。
3. **默认执行模式:**
编译器会在 **RUN 模式** 下运行,**DEBUG 模式**显示详细的执行过程和状态,并且在虚拟机中执行编译后的代码,最后会打印出所有局部变量的值。
3. **默认执行模式**
编译器会在 **DEBUG 模式** 下运行,显示详细的执行过程和状态,并且在虚拟机中执行编译后的代码,最后会打印出所有局部变量的值。
---
@ -441,30 +320,30 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
集成编译需要使用 `.cloud` 文件来指定项目的配置和结构,适用于项目标准化、依赖管理、构建管理和项目分发等场景。
#### 集成编译命令:
#### 集成编译命令
1. **基本用法:**
1. **基本用法**
```bash
snow [OPTIONS] <command>
```
2. **命令选项:**
2. **命令选项**
* `-h, --help`: 显示帮助信息并退出。
* `-v, --version`: 打印 Snow 编程语言的版本并退出。
* `-h, --help`显示帮助信息并退出。
* `-v, --version`打印 Snow 编程语言的版本并退出。
3. **可用命令:**
3. **可用命令**
* `compile`: `.snow` 源文件编译成虚拟机字节码文件(`.water`)。此命令会使用 `.cloud` 文件来指导编译过程。
* `clean`: 清理构建输出和本地缓存,移除中间产物,释放磁盘空间。
* `version`: 打印 Snow 的版本。
* `run`: 运行已编译的虚拟机字节码文件(`.water`)。
* `init`: 初始化一个新项目,生成 `project.cloud` 文件。
* `generate`: 根据 `project.cloud` 生成项目目录结构。
* `build`: 构建当前项目,按顺序解析依赖、编译和打包。
* `compile``.snow` 源文件编译成虚拟机字节码文件(`.water`)。此命令会使用 `.cloud` 文件来指导编译过程。
* `clean`清理构建输出和本地缓存,移除中间产物,释放磁盘空间。
* `version`打印 Snow 的版本。
* `run`运行已编译的虚拟机字节码文件(`.water`)。
* `init`初始化一个新项目,生成 `project.cloud` 文件。
* `generate`根据 `project.cloud` 生成项目目录结构。
* `build`构建当前项目,按顺序解析依赖、编译和打包。
4. **例如,执行集成编译命令:**
4. **例如,执行集成编译命令**
```bash
snow compile [SnowCode].snow
@ -472,14 +351,14 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
* 此命令会使用 `.cloud` 文件中的配置信息来指导编译过程,并生成 `.water`
5. **使用帮助:**
如果你需要了解某个命令的详细选项,可以使用:
5. **使用帮助**
如果你需要了解某个命令的详细选项,可以使用
```bash
snow <command> --help
```
例如,查看 `compile` 命令的具体选项:
例如,查看 `compile` 命令的具体选项
```bash
snow compile --help
@ -489,12 +368,12 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
## 示例代码片段
以下是一个简单的 Snow 代码示例,演示模块定义,导入和函数声明的基本语法:
以下是一个简单的 Snow 代码示例,演示模块定义,导入和函数声明的基本语法
```snow
module: Math
function: main
returns: int
return_type: int
body:
Math.factorial(6)
return 0
@ -502,17 +381,17 @@ module: Math
end function
function: factorial
params:
parameter:
declare n:int
returns: int
return_type: int
body:
declare num1:int = 1
loop:
init:
initializer:
declare counter:int = 1
cond:
condition:
counter <= n
step:
update:
counter = counter + 1
body:
num1 = num1 * counter
@ -524,10 +403,10 @@ module: Math
end module
```
上述代码定义了一个名为 `Math` 的模块,其中包含两个函数:
上述代码定义了一个名为 `Math` 的模块,其中包含两个函数
* `main`: 不接收任何参数,返回类型为 `int`。在函数体内调用了 `Math.factorial(6)`,然后返回 `0`
* `factorial`: 接收一个 `int` 类型的参数 `n`,返回类型为 `int`。函数体内先声明并初始化局部变量 `num1``1`,然后通过一个
* `main`不接收任何参数,返回类型为 `int`。在函数体内调用了 `Math.factorial(6)`,然后返回 `0`
* `factorial`接收一个 `int` 类型的参数 `n`,返回类型为 `int`。函数体内先声明并初始化局部变量 `num1``1`,然后通过一个
`loop` 循环(从 `counter = 1``counter <= n`)依次将 `num1` 乘以 `counter`,循环结束后返回 `num1`,即 `n` 的阶乘值。
@ -535,59 +414,52 @@ end module
## 项目结构说明
* `compiler/`: Snow 编译器源代码目录
* `compiler/`Snow 编译器源代码目录
* `lexer/`: 词法分析模块,负责将源码切分为 Token
* `parser/`: 语法分析模块,将 Token 流解析为 AST含模块/函数/语句解析)
* `semantic/`: 语义分析模块,负责符号表管理、类型检查等
* `ir/`: 中间表示IR模块生成并管理三地址码形式的中间代码
* `backend/`: 编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器
* `lexer/`词法分析模块,负责将源码切分为 Token
* `parser/`语法分析模块,将 Token 流解析为 AST含模块/函数/语句解析)
* `semantic/`语义分析模块,负责符号表管理、类型检查等
* `ir/`中间表示IR模块生成并管理三地址码形式的中间代码
* `backend/`编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器
* `vm/`: 虚拟机相关源代码目录
* `vm/`虚拟机相关源代码目录
* `commands/`: 定义 SnowVM 指令集的具体实现
* `engine/`: 核心执行引擎,提供指令执行和寄存器/栈管理
* `execution/`: 执行流程控制(按指令顺序执行、分支跳转等)
* `io/`: 输入输出辅助类(加载指令、文件解析等)
* `gui/`: Swing 可视化调试面板,实时展示局部变量表
* `factories/``utils/`: 指令创建、日志调试等公共工具
* `commands/`定义 SnowVM 指令集的具体实现
* `engine/`核心执行引擎,提供指令执行和寄存器/栈管理
* `execution/`执行流程控制(按指令顺序执行、分支跳转等)
* `io/`输入输出辅助类(加载指令、文件解析等)
* `gui/`Swing 可视化调试面板,实时展示局部变量表
* `factories/``utils/`指令创建、日志调试等公共工具
* `pkg/`: 内置构建与包管理器 **snow pkg**
* `pkg/`内置构建与包管理器 **snow pkg**
* `dsl/`: `.cloud` 描述文件解析器
* `tasks/`: 预设任务实现(`clean · compile · run · package · publish` 等)
* `resolver/`: 本地/远程仓库解析与缓存
* `lifecycle/`: 任务生命周期钩子pre/post 脚本等)
* `model/`: 项目、依赖、版本等模型
* `utils/`: 文件、日志、校验和等通用工具
* `doc/`: 开发者文档与示例 `.cloud` 配置
* `dsl/``.cloud` 描述文件解析器
* `tasks/`预设任务实现(`clean · compile · run · package · publish` 等)
* `resolver/`本地/远程仓库解析与缓存
* `lifecycle/`任务生命周期钩子pre/post 脚本等)
* `model/`项目、依赖、版本等模型
* `utils/`文件、日志、校验和等通用工具
* `doc/`开发者文档与示例 `.cloud` 配置
* `cli/`: 独立的命令行前端
* `cli/`独立的命令行前端
* `commands/`: `compile` / `run` / `pkg` 等子命令实现
* `api/`: 公共选项解析、终端交互抽象
* `utils/`: 终端颜色、进度条、异常格式化等
* `SnowCLI.java`: CLI 主入口
* `commands/``compile` / `run` / `pkg` 等子命令实现
* `api/`公共选项解析、终端交互抽象
* `utils/`终端颜色、进度条、异常格式化等
* `SnowCLI.java`CLI 主入口
## 版权声明
版权所有 © 2025 许轲Luke代表 SnowLang 项目。
仓库地址: <https://gitee.com/jcnc-org/snow>
本项目依据 [Apache 2.0 许可证](LICENSE) 进行许可和发布。
“SnowLang 项目”为由许轲Luke发起的独立开源项目。
未来,项目可能会成立正式的组织或实体,以进一步负责本项目的开发和管理。
## 支持我们
如果你喜欢我们的项目,欢迎给我们一个 Star
你们的关注和支持,是我们团队持续进步的动力源泉!谢谢大家!
## 加入我们
- 微信: `xuxiaolankaka`
- QQ: `1399528359`
- 邮箱: `luke.k.xu [at] hotmail.com`
- 微信:`xuxiaolankaka`
- QQ`1399528359`
- 邮箱:`luke.k.xu [at] hotmail.com`

View File

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

View File

@ -1,48 +0,0 @@
# 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
}

View File

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

View File

@ -0,0 +1,47 @@
# 设定 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
}

View File

@ -1,136 +0,0 @@
# 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"

View File

@ -1,117 +0,0 @@
# 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
}

View File

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

View File

@ -1,23 +0,0 @@
# 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

View File

@ -1,24 +0,0 @@
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

View File

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

View File

@ -6,7 +6,7 @@
## 2. 前置条件
1. 操作系统: Linux/macOS/Windows
1. 操作系统Linux/macOS/Windows
2. Java 项目Maven
3. GraalVM建议 24+ 版本)
@ -14,10 +14,10 @@
### 3.1 安装 GraalVM
1. 下载对应平台的 GraalVM Community 版本: [https://www.graalvm.org/downloads/](https://www.graalvm.org/downloads/)
2. 解压并配置环境变量:
1. 下载对应平台的 GraalVM Community 版本[https://www.graalvm.org/downloads/](https://www.graalvm.org/downloads/)
2. 解压并配置环境变量
3. 验证安装:
3. 验证安装
```bash
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 项目配置文件
通过将以下配置文件添加到 `pom.xml` 中,为 Native Image 启用 Maven 插件:
通过将以下配置文件添加到 `pom.xml` 中,为 Native Image 启用 Maven 插件
```xml
<profiles>
<!--
原生镜像构建: Linux 平台
原生镜像构建Linux 平台
- 使用 GraalVM 的 native-image 工具,生成静态链接的可执行文件
- 依赖 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>
<!--
原生镜像构建: Windows 平台
原生镜像构建Windows 平台
- 使用 GraalVM 的 native-image 工具,生成 Windows 可执行文件
- 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
![IMG_Maven_Package_1.png](img/IMG_Maven_Package_1.png)
3. 等待 Native Image 构建完成: 这个过程可能较慢(数分钟)。
3. 等待 Native Image 构建完成这个过程可能较慢(数分钟)。
4. 可执行文件即可直接运行,无需 JVM。
> 生成的可执行文件位于 target/ 目录。

View File

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

View File

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

View File

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

View File

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

View File

@ -1,8 +1,7 @@
# SnowVM-OpCode
## Type Control (0x0000-0x00BF)
## 1. Byte8 区域0x0000-0x001F
### Byte8 (0x0000-0x001F)
| 指令名 | 十六进制 | 说明 |
|----------|--------|----------------|
| B\_ADD | 0x0000 | byte8 加法 |
@ -27,7 +26,7 @@
---
### Short16 (0x0020-0x003F)
## 2. Short16 区域0x0020-0x003F
| 指令名 | 十六进制 | 说明 |
|----------|--------|------------------|
@ -53,7 +52,7 @@
---
### Int32 (0x0040-0x005F)
## 3. Int32 区域0x0040-0x005F
| 指令名 | 十六进制 | 说明 |
|----------|--------|----------------|
@ -79,7 +78,7 @@
---
### Long64 区域0x0060-0x007F
## 4. Long64 区域0x0060-0x007F
| 指令名 | 十六进制 | 说明 |
|----------|--------|-----------------|
@ -105,7 +104,7 @@
---
### Float32 区域0x0080-0x009F
## 5. Float32 区域0x0080-0x009F
| 指令名 | 十六进制 | 说明 |
|----------|--------|------------------|
@ -128,7 +127,7 @@
---
### Double64 区域0x00A0-0x00BF
## 6. Double64 区域0x00A0-0x00BF
| 指令名 | 十六进制 | 说明 |
|----------|--------|-------------------|
@ -151,7 +150,7 @@
---
## Type Conversion (0x00C0-0x00DF)
## 7. 类型转换0x00C0-0x00DF
| 指令名 | 十六进制 | 说明 |
|-----|--------|--------------------|
@ -186,17 +185,11 @@
| D2L | 0x00DC | double64 转 long64 |
| D2F | 0x00DD | double64 转 float32 |
---
## Reference Control (0x00E0-0x00EF)
| 指令名 | 十六进制 | 说明 |
|----------|--------|---------------------------|
| R\_PUSH | 0x00E0 | 将对象引用压入操作数栈 |
| R\_LOAD | 0x00E1 | 从本地变量表加载对象引用并压入操作数栈 |
| R\_STORE | 0x00E2 | 将操作数栈顶的对象引用弹出并存入本地变量表指定槽位 |
## Stack Control (0x0100-0x01FF)
## 8. 栈控制0x0100-0x01FF
| 指令名 | 十六进制 | 说明 |
|------|--------|----------|
@ -206,7 +199,7 @@
---
## Flow Control (0x0200-0x02FF)
## 9. 流程控制0x0200-0x02FF
| 指令名 | 十六进制/十进制 | 说明 |
|------|----------|-------|
@ -216,7 +209,7 @@
---
## Register Control (0x0300-0x03FF)
## 10. 寄存器控制0x0300-0x03FF
| 指令名 | 十六进制 | 说明 |
|-----|--------|---------|
@ -224,7 +217,7 @@
---
## System Control (0x0400-0x04FF)
## 11. 系统控制0x0400-0x04FF
| 指令名 | 十六进制 | 说明 |
|-------------|--------|------|

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,8 +0,0 @@
module: ModuleA
function: fun
returns: int
body:
return 123
end body
end function
end module

View File

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

View File

@ -1,16 +0,0 @@
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

View File

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

View File

@ -1,13 +0,0 @@
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

View File

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

View File

@ -1,6 +0,0 @@
function: main
returns: int
body:
return 65537
end body
end function

View File

@ -1,21 +0,0 @@
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

View File

@ -1,69 +0,0 @@
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

View File

@ -1,9 +0,0 @@
module: Main
import: os
function: main
returns: void
body:
os.print(222)
end body
end function
end module

View File

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

View File

@ -1,20 +0,0 @@
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

View File

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

View File

@ -1,22 +0,0 @@
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

View File

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

View File

@ -1,23 +0,0 @@
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

View File

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

View File

@ -1,43 +0,0 @@
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

View File

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

View File

@ -1,26 +0,0 @@
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

View File

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

View File

@ -1,12 +0,0 @@
module: Main
import:os
function: main
returns: void
body:
declare arr: int[] = [1, 2, 3]
arr[0] = 5
os.print(arr[0])
end body
end function
end module

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