From 16a5d8d6ac5267e43f80360ced4e99484479dde3 Mon Sep 17 00:00:00 2001
From: Luke
- * 主要功能与特性: + * 主要功能与特性: *
- * 模块定义可包含多个导入(import)语句和函数定义(function), + * 模块定义可包含多个导入(import)语句、globals 全局声明和函数定义(function), * 导入语句可在模块中任意位置出现,且允许模块体中穿插任意数量的空行(空行会被自动忽略,不影响语法结构)。 *
* @@ -26,6 +28,8 @@ import java.util.List; *
* module: mymod
* import ...
+ * globals:
+ * declare ...
* function ...
* ...
* end module
@@ -40,7 +44,7 @@ public class ModuleParser implements TopLevelParser {
* 解析过程包括:
*
* - 匹配模块声明起始 {@code module: IDENTIFIER}。
- * - 收集模块体内所有 import 和 function 语句,允许穿插空行。
+ * - 收集模块体内所有 import、globals 和 function 语句,允许穿插空行。
* - 匹配模块结束 {@code end module}。
*
* 若遇到未识别的语句,将抛出 {@link UnexpectedToken} 异常,定位错误位置和原因。
@@ -64,12 +68,15 @@ public class ModuleParser implements TopLevelParser {
ts.expectType(TokenType.NEWLINE);
List imports = new ArrayList<>();
+ List globals = new ArrayList<>();
List functions = new ArrayList<>();
ImportParser importParser = new ImportParser();
FunctionParser funcParser = new FunctionParser();
+ DeclarationStatementParser globalsParser = new DeclarationStatementParser();
while (true) {
+ // 跳过空行
if (ts.peek().getType() == TokenType.NEWLINE) {
ts.next();
continue;
@@ -78,12 +85,33 @@ public class ModuleParser implements TopLevelParser {
break;
}
String lex = ts.peek().getLexeme();
- if ("import".equals(lex)) {
- imports.addAll(importParser.parse(ctx));
- } else if ("function".equals(lex)) {
- functions.add(funcParser.parse(ctx));
- } else {
- throw new UnexpectedToken(
+ switch (lex) {
+ case "import" -> imports.addAll(importParser.parse(ctx));
+ case "function" -> functions.add(funcParser.parse(ctx));
+ case "globals" -> {
+ ts.expect("globals");
+ 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,
ts.peek().getLine(),
ts.peek().getCol()
@@ -94,6 +122,6 @@ public class ModuleParser implements TopLevelParser {
ts.expect("end");
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));
}
}
diff --git a/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java b/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java
index 9091af8..b3094c1 100644
--- a/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java
+++ b/src/main/java/org/jcnc/snow/compiler/parser/utils/ASTJsonSerializer.java
@@ -14,7 +14,7 @@ import java.util.*;
* 并可借助 {@code JSONParser.toJson(Object)} 方法将其序列化为 JSON 字符串,用于调试、
* 可视化或跨语言数据传输。
*
- * 支持的节点类型包括(新增对 {@code BoolLiteralNode}、{@code UnaryExpressionNode} 的完整支持):
+ * 支持的节点类型包括:
*
* - {@link ModuleNode}
* - {@link FunctionNode}
@@ -83,7 +83,7 @@ public class ASTJsonSerializer {
return switch (n) {
// 模块节点
case ModuleNode(
- String name, List imports, List functions, NodeContext _
+ String name, List imports, List globals, List functions, NodeContext _
) -> {
Map map = newNodeMap("Module");
map.put("name", name);
@@ -92,6 +92,15 @@ public class ASTJsonSerializer {
imps.add(Map.of("type", "Import", "module", imp.moduleName()));
}
map.put("imports", imps);
+ List