!44 feat: 实现 globals 关键字
Merge pull request !44 from Luke/feature/add-globals-keyword
This commit is contained in:
commit
12fc14e6e7
@ -4,12 +4,6 @@
|
|||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug1 -o target/Bug1" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug1 -o target/Bug1" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo1 -o target/Demo1" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo1 -o target/Demo1 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo10 -o target/Demo10" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo10 -o target/Demo10 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo11 -o target/Demo11" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo11 -o target/Demo11 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo12 -o target/Demo12" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo12 -o target/Demo12 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
<configuration default="false" name="Demo13" type="Application" factoryName="Application" folderName="Demo">
|
<configuration default="false" name="Demo13" type="Application" factoryName="Application" folderName="Demo">
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo13 -o target/Demo13" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo13 -o target/Demo13 --debug" />
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
<configuration default="false" name="Demo14" type="Application" factoryName="Application" folderName="Demo">
|
<configuration default="false" name="Demo14" type="Application" factoryName="Application" folderName="Demo">
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo14 -o target/Demo14" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo14 -o target/Demo14 --debug" />
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
10
.run/Demo15.run.xml
Normal file
10
.run/Demo15.run.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="Demo15" type="Application" factoryName="Application" folderName="Demo">
|
||||||
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
|
<module name="Snow" />
|
||||||
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo15 -o target/Demo15 --debug" />
|
||||||
|
<method v="2">
|
||||||
|
<option name="Make" enabled="true" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo2 -o target/Demo2" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo2 -o target/Demo2 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo3 -o target/Demo3" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo3 -o target/Demo3 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo4 -o target/Demo4" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo4 -o target/Demo4 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo5 -o target/Demo5" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo5 -o target/Demo5 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo6 -o target/Demo6" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo6 -o target/Demo6 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo7 -o target/Demo7" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo7 -o target/Demo7 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo8 -o target/Demo8" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo8 -o target/Demo8 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,13 +3,7 @@
|
|||||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo9 -o target/Demo9" />
|
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo9 -o target/Demo9 --debug" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,12 +3,6 @@
|
|||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="--help" />
|
<option name="PROGRAM_PARAMETERS" value="--help" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.cli.SnowCLI" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -3,12 +3,6 @@
|
|||||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||||
<module name="Snow" />
|
<module name="Snow" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="--version" />
|
<option name="PROGRAM_PARAMETERS" value="--version" />
|
||||||
<extension name="coverage">
|
|
||||||
<pattern>
|
|
||||||
<option name="PATTERN" value="org.jcnc.snow.cli.SnowCLI" />
|
|
||||||
<option name="ENABLED" value="true" />
|
|
||||||
</pattern>
|
|
||||||
</extension>
|
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@ -5,6 +5,8 @@
|
|||||||
<toRun name="Demo11" type="Application" />
|
<toRun name="Demo11" type="Application" />
|
||||||
<toRun name="Demo12" type="Application" />
|
<toRun name="Demo12" type="Application" />
|
||||||
<toRun name="Demo13" type="Application" />
|
<toRun name="Demo13" type="Application" />
|
||||||
|
<toRun name="Demo14" type="Application" />
|
||||||
|
<toRun name="Demo15" type="Application" />
|
||||||
<toRun name="Demo2" type="Application" />
|
<toRun name="Demo2" type="Application" />
|
||||||
<toRun name="Demo3" type="Application" />
|
<toRun name="Demo3" type="Application" />
|
||||||
<toRun name="Demo4" type="Application" />
|
<toRun name="Demo4" type="Application" />
|
||||||
|
|||||||
13
playground/Demo/Demo15/Main.snow
Normal file
13
playground/Demo/Demo15/Main.snow
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
module: Main
|
||||||
|
import: os
|
||||||
|
globals:
|
||||||
|
declare num1:int=10
|
||||||
|
declare num2:int=10
|
||||||
|
function: main
|
||||||
|
return_type: void
|
||||||
|
body:
|
||||||
|
declare num1:int=11
|
||||||
|
print(num1+num2)
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
11
playground/Demo/Demo15/OS.snow
Normal file
11
playground/Demo/Demo15/OS.snow
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
module: os
|
||||||
|
import: os
|
||||||
|
function: print
|
||||||
|
parameter:
|
||||||
|
declare i1: int
|
||||||
|
return_type: void
|
||||||
|
body:
|
||||||
|
syscall("PRINT",i1)
|
||||||
|
end body
|
||||||
|
end function
|
||||||
|
end module
|
||||||
@ -60,9 +60,9 @@ public final class CompileCommand implements CLICommand {
|
|||||||
|
|
||||||
List<String> argList = new ArrayList<>();
|
List<String> argList = new ArrayList<>();
|
||||||
|
|
||||||
// 保留用户在 cloud 模式下传入的 “run” / “-debug” 标志
|
// 保留用户在 cloud 模式下传入的 “run” / “--debug” 标志
|
||||||
for (String a : args) {
|
for (String a : args) {
|
||||||
if ("run".equals(a) || "-debug".equals(a)) {
|
if ("run".equals(a) || "--debug".equals(a)) {
|
||||||
argList.add(a);
|
argList.add(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import org.jcnc.snow.compiler.parser.ast.base.Node;
|
|||||||
import org.jcnc.snow.compiler.parser.ast.base.NodeContext;
|
import org.jcnc.snow.compiler.parser.ast.base.NodeContext;
|
||||||
import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
|
import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -36,8 +37,8 @@ public final class IRProgramBuilder {
|
|||||||
for (Node node : roots) {
|
for (Node node : roots) {
|
||||||
switch (node) {
|
switch (node) {
|
||||||
case ModuleNode moduleNode ->
|
case ModuleNode moduleNode ->
|
||||||
// 模块节点: 批量构建并添加模块内所有函数
|
// 对每个模块,所有函数均自动注入 globals
|
||||||
moduleNode.functions().forEach(f -> irProgram.add(buildFunction(f)));
|
moduleNode.functions().forEach(f -> irProgram.add(buildFunctionWithGlobals(moduleNode, f)));
|
||||||
case FunctionNode functionNode ->
|
case FunctionNode functionNode ->
|
||||||
// 顶层函数节点: 直接构建并添加
|
// 顶层函数节点: 直接构建并添加
|
||||||
irProgram.add(buildFunction(functionNode));
|
irProgram.add(buildFunction(functionNode));
|
||||||
@ -52,6 +53,30 @@ public final class IRProgramBuilder {
|
|||||||
return irProgram;
|
return irProgram;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建带有模块全局声明“注入”的函数。
|
||||||
|
* 为了在当前 IR 设计下能访问全局变量,将模块的 globals 作为前置声明
|
||||||
|
* 追加到函数体最前面,使其在函数内被注册到 IR 作用域中。
|
||||||
|
*/
|
||||||
|
private IRFunction buildFunctionWithGlobals(ModuleNode moduleNode, FunctionNode functionNode) {
|
||||||
|
if (moduleNode.globals() == null || moduleNode.globals().isEmpty()) {
|
||||||
|
return buildFunction(functionNode);
|
||||||
|
}
|
||||||
|
// 重建函数体:先放 globals 的声明,再放原来的语句
|
||||||
|
List<StatementNode> newBody = new ArrayList<>(moduleNode.globals().size() + functionNode.body().size());
|
||||||
|
newBody.addAll(moduleNode.globals());
|
||||||
|
newBody.addAll(functionNode.body());
|
||||||
|
|
||||||
|
FunctionNode wrapped = new FunctionNode(
|
||||||
|
functionNode.name(),
|
||||||
|
functionNode.parameters(),
|
||||||
|
functionNode.returnType(),
|
||||||
|
newBody,
|
||||||
|
functionNode.context()
|
||||||
|
);
|
||||||
|
return buildFunction(wrapped);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 利用 FunctionBuilder 将 FunctionNode 转换为 IRFunction。
|
* 利用 FunctionBuilder 将 FunctionNode 转换为 IRFunction。
|
||||||
*
|
*
|
||||||
@ -79,8 +104,8 @@ public final class IRProgramBuilder {
|
|||||||
private FunctionNode wrapTopLevel(StatementNode stmt) {
|
private FunctionNode wrapTopLevel(StatementNode stmt) {
|
||||||
return new FunctionNode(
|
return new FunctionNode(
|
||||||
"_start",
|
"_start",
|
||||||
null,
|
List.of(),
|
||||||
String.valueOf(List.of()),
|
"void",
|
||||||
List.of(stmt),
|
List.of(stmt),
|
||||||
new NodeContext(-1, -1, "")
|
new NodeContext(-1, -1, "")
|
||||||
);
|
);
|
||||||
|
|||||||
@ -25,7 +25,7 @@ public class TokenFactory {
|
|||||||
/**
|
/**
|
||||||
* 语言的保留关键字集合。
|
* 语言的保留关键字集合。
|
||||||
*/
|
*/
|
||||||
private static final Set<String> KEYWORDS = Set.of("module", "function", "parameter", "return_type", "body", "end", "if", "then", "else", "loop", "declare", "return", "import", "init", "cond", "step");
|
private static final Set<String> KEYWORDS = Set.of("module", "function", "parameter", "return_type", "body", "end", "if", "then", "else", "loop", "declare", "return", "import", "init", "cond", "step","globals");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 内置类型名称集合,如 int、string 等。
|
* 内置类型名称集合,如 int、string 等。
|
||||||
|
|||||||
@ -18,6 +18,7 @@ import java.util.StringJoiner;
|
|||||||
public record ModuleNode(
|
public record ModuleNode(
|
||||||
String name,
|
String name,
|
||||||
List<ImportNode> imports,
|
List<ImportNode> imports,
|
||||||
|
List<DeclarationNode> globals,
|
||||||
List<FunctionNode> functions,
|
List<FunctionNode> functions,
|
||||||
NodeContext context
|
NodeContext context
|
||||||
) implements Node {
|
) implements Node {
|
||||||
@ -33,12 +34,17 @@ public record ModuleNode(
|
|||||||
for (ImportNode imp : imports) {
|
for (ImportNode imp : imports) {
|
||||||
importJoiner.add(imp.moduleName());
|
importJoiner.add(imp.moduleName());
|
||||||
}
|
}
|
||||||
|
StringJoiner globalJoiner = new StringJoiner(", ");
|
||||||
|
for (DeclarationNode g : globals) {
|
||||||
|
globalJoiner.add(g.getType() + " " + g.getName());
|
||||||
|
}
|
||||||
StringJoiner funcJoiner = new StringJoiner(", ");
|
StringJoiner funcJoiner = new StringJoiner(", ");
|
||||||
for (FunctionNode fn : functions) {
|
for (FunctionNode fn : functions) {
|
||||||
funcJoiner.add(fn.name());
|
funcJoiner.add(fn.name());
|
||||||
}
|
}
|
||||||
return "Module(name=" + name
|
return "Module(name=" + name
|
||||||
+ ", imports=[" + importJoiner + "]"
|
+ ", imports=[" + importJoiner + "]"
|
||||||
|
+ ", globals=[" + globalJoiner + "]"
|
||||||
+ ", functions=[" + funcJoiner + "])";
|
+ ", functions=[" + funcJoiner + "])";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package org.jcnc.snow.compiler.parser.module;
|
package org.jcnc.snow.compiler.parser.module;
|
||||||
|
|
||||||
import org.jcnc.snow.compiler.lexer.token.TokenType;
|
import org.jcnc.snow.compiler.lexer.token.TokenType;
|
||||||
|
import org.jcnc.snow.compiler.parser.ast.DeclarationNode;
|
||||||
import org.jcnc.snow.compiler.parser.ast.FunctionNode;
|
import org.jcnc.snow.compiler.parser.ast.FunctionNode;
|
||||||
import org.jcnc.snow.compiler.parser.ast.ImportNode;
|
import org.jcnc.snow.compiler.parser.ast.ImportNode;
|
||||||
import org.jcnc.snow.compiler.parser.ast.ModuleNode;
|
import org.jcnc.snow.compiler.parser.ast.ModuleNode;
|
||||||
@ -10,6 +11,7 @@ import org.jcnc.snow.compiler.parser.context.ParserContext;
|
|||||||
import org.jcnc.snow.compiler.parser.context.TokenStream;
|
import org.jcnc.snow.compiler.parser.context.TokenStream;
|
||||||
import org.jcnc.snow.compiler.parser.context.UnexpectedToken;
|
import org.jcnc.snow.compiler.parser.context.UnexpectedToken;
|
||||||
import org.jcnc.snow.compiler.parser.function.FunctionParser;
|
import org.jcnc.snow.compiler.parser.function.FunctionParser;
|
||||||
|
import org.jcnc.snow.compiler.parser.statement.DeclarationStatementParser;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -17,7 +19,7 @@ import java.util.List;
|
|||||||
/**
|
/**
|
||||||
* {@code ModuleParser} 负责解析源码中的模块结构,是顶层结构解析器实现之一。
|
* {@code ModuleParser} 负责解析源码中的模块结构,是顶层结构解析器实现之一。
|
||||||
* <p>
|
* <p>
|
||||||
* 模块定义可包含多个导入(import)语句和函数定义(function),
|
* 模块定义可包含多个导入(import)语句、globals 全局声明和函数定义(function),
|
||||||
* 导入语句可在模块中任意位置出现,且允许模块体中穿插任意数量的空行(空行会被自动忽略,不影响语法结构)。
|
* 导入语句可在模块中任意位置出现,且允许模块体中穿插任意数量的空行(空行会被自动忽略,不影响语法结构)。
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
@ -26,6 +28,8 @@ import java.util.List;
|
|||||||
* <pre>
|
* <pre>
|
||||||
* module: mymod
|
* module: mymod
|
||||||
* import ...
|
* import ...
|
||||||
|
* globals:
|
||||||
|
* declare ...
|
||||||
* function ...
|
* function ...
|
||||||
* ...
|
* ...
|
||||||
* end module
|
* end module
|
||||||
@ -40,7 +44,7 @@ public class ModuleParser implements TopLevelParser {
|
|||||||
* 解析过程包括:
|
* 解析过程包括:
|
||||||
* <ol>
|
* <ol>
|
||||||
* <li>匹配模块声明起始 {@code module: IDENTIFIER}。</li>
|
* <li>匹配模块声明起始 {@code module: IDENTIFIER}。</li>
|
||||||
* <li>收集模块体内所有 import 和 function 语句,允许穿插空行。</li>
|
* <li>收集模块体内所有 import、globals 和 function 语句,允许穿插空行。</li>
|
||||||
* <li>匹配模块结束 {@code end module}。</li>
|
* <li>匹配模块结束 {@code end module}。</li>
|
||||||
* </ol>
|
* </ol>
|
||||||
* 若遇到未识别的语句,将抛出 {@link UnexpectedToken} 异常,定位错误位置和原因。
|
* 若遇到未识别的语句,将抛出 {@link UnexpectedToken} 异常,定位错误位置和原因。
|
||||||
@ -64,12 +68,15 @@ public class ModuleParser implements TopLevelParser {
|
|||||||
ts.expectType(TokenType.NEWLINE);
|
ts.expectType(TokenType.NEWLINE);
|
||||||
|
|
||||||
List<ImportNode> imports = new ArrayList<>();
|
List<ImportNode> imports = new ArrayList<>();
|
||||||
|
List<DeclarationNode> globals = new ArrayList<>();
|
||||||
List<FunctionNode> functions = new ArrayList<>();
|
List<FunctionNode> functions = new ArrayList<>();
|
||||||
|
|
||||||
ImportParser importParser = new ImportParser();
|
ImportParser importParser = new ImportParser();
|
||||||
FunctionParser funcParser = new FunctionParser();
|
FunctionParser funcParser = new FunctionParser();
|
||||||
|
DeclarationStatementParser globalsParser = new DeclarationStatementParser();
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
// 跳过空行
|
||||||
if (ts.peek().getType() == TokenType.NEWLINE) {
|
if (ts.peek().getType() == TokenType.NEWLINE) {
|
||||||
ts.next();
|
ts.next();
|
||||||
continue;
|
continue;
|
||||||
@ -78,12 +85,33 @@ public class ModuleParser implements TopLevelParser {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
String lex = ts.peek().getLexeme();
|
String lex = ts.peek().getLexeme();
|
||||||
if ("import".equals(lex)) {
|
switch (lex) {
|
||||||
imports.addAll(importParser.parse(ctx));
|
case "import" -> imports.addAll(importParser.parse(ctx));
|
||||||
} else if ("function".equals(lex)) {
|
case "function" -> functions.add(funcParser.parse(ctx));
|
||||||
functions.add(funcParser.parse(ctx));
|
case "globals" -> {
|
||||||
} else {
|
ts.expect("globals");
|
||||||
throw new UnexpectedToken(
|
ts.expect(":");
|
||||||
|
ts.expectType(TokenType.NEWLINE);
|
||||||
|
while (true) {
|
||||||
|
if (ts.peek().getType() == TokenType.NEWLINE) {
|
||||||
|
ts.next();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String innerLex = ts.peek().getLexeme();
|
||||||
|
if ("declare".equals(innerLex)) {
|
||||||
|
globals.add(globalsParser.parse(ctx));
|
||||||
|
} else if ("function".equals(innerLex) || "import".equals(innerLex) || "end".equals(innerLex)) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
throw new UnexpectedToken(
|
||||||
|
"globals 区块中不支持的内容: " + innerLex,
|
||||||
|
ts.peek().getLine(),
|
||||||
|
ts.peek().getCol()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case null, default -> throw new UnexpectedToken(
|
||||||
"Unexpected token in module: " + lex,
|
"Unexpected token in module: " + lex,
|
||||||
ts.peek().getLine(),
|
ts.peek().getLine(),
|
||||||
ts.peek().getCol()
|
ts.peek().getCol()
|
||||||
@ -94,6 +122,6 @@ public class ModuleParser implements TopLevelParser {
|
|||||||
ts.expect("end");
|
ts.expect("end");
|
||||||
ts.expect("module");
|
ts.expect("module");
|
||||||
|
|
||||||
return new ModuleNode(name, imports, functions, new NodeContext(line, column, file));
|
return new ModuleNode(name, imports, globals, functions, new NodeContext(line, column, file));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import java.util.*;
|
|||||||
* 并可借助 {@code JSONParser.toJson(Object)} 方法将其序列化为 JSON 字符串,用于调试、
|
* 并可借助 {@code JSONParser.toJson(Object)} 方法将其序列化为 JSON 字符串,用于调试、
|
||||||
* 可视化或跨语言数据传输。
|
* 可视化或跨语言数据传输。
|
||||||
* <p>
|
* <p>
|
||||||
* 支持的节点类型包括(新增对 {@code BoolLiteralNode}、{@code UnaryExpressionNode} 的完整支持):
|
* 支持的节点类型包括:
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>{@link ModuleNode}</li>
|
* <li>{@link ModuleNode}</li>
|
||||||
* <li>{@link FunctionNode}</li>
|
* <li>{@link FunctionNode}</li>
|
||||||
@ -83,7 +83,7 @@ public class ASTJsonSerializer {
|
|||||||
return switch (n) {
|
return switch (n) {
|
||||||
// 模块节点
|
// 模块节点
|
||||||
case ModuleNode(
|
case ModuleNode(
|
||||||
String name, List<ImportNode> imports, List<FunctionNode> functions, NodeContext _
|
String name, List<ImportNode> imports, List<DeclarationNode> globals, List<FunctionNode> functions, NodeContext _
|
||||||
) -> {
|
) -> {
|
||||||
Map<String, Object> map = newNodeMap("Module");
|
Map<String, Object> map = newNodeMap("Module");
|
||||||
map.put("name", name);
|
map.put("name", name);
|
||||||
@ -92,6 +92,15 @@ public class ASTJsonSerializer {
|
|||||||
imps.add(Map.of("type", "Import", "module", imp.moduleName()));
|
imps.add(Map.of("type", "Import", "module", imp.moduleName()));
|
||||||
}
|
}
|
||||||
map.put("imports", imps);
|
map.put("imports", imps);
|
||||||
|
List<Object> globs = new ArrayList<>(globals.size());
|
||||||
|
for (DeclarationNode d : globals) {
|
||||||
|
Map<String, Object> decl = newNodeMap("Declaration");
|
||||||
|
decl.put("name", d.getName());
|
||||||
|
decl.put("varType", d.getType());
|
||||||
|
decl.put("init", d.getInitializer().map(ASTJsonSerializer::exprToMap).orElse(null));
|
||||||
|
globs.add(decl);
|
||||||
|
}
|
||||||
|
map.put("globals", globs);
|
||||||
List<Object> funcs = new ArrayList<>(functions.size());
|
List<Object> funcs = new ArrayList<>(functions.size());
|
||||||
for (FunctionNode f : functions) {
|
for (FunctionNode f : functions) {
|
||||||
funcs.add(nodeToMap(f));
|
funcs.add(nodeToMap(f));
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package org.jcnc.snow.compiler.semantic.core;
|
|||||||
|
|
||||||
import org.jcnc.snow.compiler.parser.ast.FunctionNode;
|
import org.jcnc.snow.compiler.parser.ast.FunctionNode;
|
||||||
import org.jcnc.snow.compiler.parser.ast.ModuleNode;
|
import org.jcnc.snow.compiler.parser.ast.ModuleNode;
|
||||||
|
import org.jcnc.snow.compiler.parser.ast.DeclarationNode;
|
||||||
import org.jcnc.snow.compiler.parser.ast.ReturnNode;
|
import org.jcnc.snow.compiler.parser.ast.ReturnNode;
|
||||||
import org.jcnc.snow.compiler.semantic.analyzers.base.StatementAnalyzer;
|
import org.jcnc.snow.compiler.semantic.analyzers.base.StatementAnalyzer;
|
||||||
import org.jcnc.snow.compiler.semantic.error.SemanticError;
|
import org.jcnc.snow.compiler.semantic.error.SemanticError;
|
||||||
@ -54,11 +55,18 @@ public record FunctionChecker(Context ctx) {
|
|||||||
// 获取当前模块对应的语义信息
|
// 获取当前模块对应的语义信息
|
||||||
ModuleInfo mi = ctx.modules().get(mod.name());
|
ModuleInfo mi = ctx.modules().get(mod.name());
|
||||||
|
|
||||||
|
// 先构建全局符号表
|
||||||
|
SymbolTable globalScope = new SymbolTable(null);
|
||||||
|
for (DeclarationNode g : mod.globals()) {
|
||||||
|
var t = ctx.parseType(g.getType());
|
||||||
|
globalScope.define(new Symbol(g.getName(), t, SymbolKind.VARIABLE));
|
||||||
|
}
|
||||||
|
|
||||||
// 遍历模块中所有函数定义
|
// 遍历模块中所有函数定义
|
||||||
for (FunctionNode fn : mod.functions()) {
|
for (FunctionNode fn : mod.functions()) {
|
||||||
|
|
||||||
// 构建函数局部作用域符号表,设置父作用域为 null
|
// 构建函数局部作用域符号表,父作用域为 globalScope
|
||||||
SymbolTable locals = new SymbolTable(null);
|
SymbolTable locals = new SymbolTable(globalScope);
|
||||||
|
|
||||||
// 将函数参数注册为局部变量
|
// 将函数参数注册为局部变量
|
||||||
fn.parameters().forEach(p ->
|
fn.parameters().forEach(p ->
|
||||||
|
|||||||
@ -154,7 +154,7 @@ public final class CompileTask implements Task {
|
|||||||
String arg = args[i];
|
String arg = args[i];
|
||||||
switch (arg) {
|
switch (arg) {
|
||||||
case "run" -> runAfterCompile = true;
|
case "run" -> runAfterCompile = true;
|
||||||
case "-debug" -> SnowConfig.MODE = Mode.DEBUG;
|
case "--debug" -> SnowConfig.MODE = Mode.DEBUG;
|
||||||
case "-o" -> {
|
case "-o" -> {
|
||||||
if (i + 1 < args.length) outputName = args[++i];
|
if (i + 1 < args.length) outputName = args[++i];
|
||||||
else {
|
else {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user