diff --git a/src/main/java/org/jcnc/snow/compiler/parser/function/FunctionParser.java b/src/main/java/org/jcnc/snow/compiler/parser/function/FunctionParser.java
index 5d74084..b0d322e 100644
--- a/src/main/java/org/jcnc/snow/compiler/parser/function/FunctionParser.java
+++ b/src/main/java/org/jcnc/snow/compiler/parser/function/FunctionParser.java
@@ -146,11 +146,21 @@ public class FunctionParser implements TopLevelParser {
/**
* 解析参数定义区块。
+ *
+ * 语法格式示例:
+ *
+ * parameter:
+ * declare param1: int
+ * declare param2: string
+ *
+ * 每一行参数定义都必须以 declare 开头。
+ * 方法将跳过空行,并在遇到下一个语句区块(如 return_type、body、end)时终止。
*
- * @param ts Token 流
- * @return 参数节点列表
+ * @param ts Token 流,用于逐个读取语法标记
+ * @return 参数节点列表,每个 {@link ParameterNode} 包含参数名和类型
*/
private List parseParameters(TokenStream ts) {
+ // 开始:匹配 "parameter:" 行
ts.expect("parameter");
ts.expect(":");
ts.expectType(TokenType.NEWLINE);
@@ -158,33 +168,42 @@ public class FunctionParser implements TopLevelParser {
List params = new ArrayList<>();
while (true) {
+ // 跳过空行
if (ts.peek().getType() == TokenType.NEWLINE) {
- ts.next(); // 跳过空行
+ ts.next();
continue;
}
String lexeme = ts.peek().getLexeme();
- // 如果是下一个区块的起始关键字,则退出当前 parameter 区块
+ // 遇到新语句区块的开始(结束当前参数解析块)
if ("return_type".equals(lexeme) || "body".equals(lexeme) || "end".equals(lexeme)) {
break;
}
- if ("declare".equals(lexeme)) {
- ts.next(); // 可选 "declare"
- }
+ // 参数定义必须以 "declare" 开头
+ ts.expect("declare");
+ // 获取参数名称
String paramName = ts.expectType(TokenType.IDENTIFIER).getLexeme();
+
+ // 冒号分隔符
ts.expect(":");
+
+ // 参数类型
String paramType = ts.expectType(TokenType.TYPE).getLexeme();
+
+ // 每行结束必须是 NEWLINE
ts.expectType(TokenType.NEWLINE);
+ // 加入参数列表
params.add(new ParameterNode(paramName, paramType));
}
return params;
}
+
/**
* 解析返回类型区块。
*
diff --git a/test b/test
index d7319c6..27855d1 100644
--- a/test
+++ b/test
@@ -51,7 +51,7 @@ module: MainModule
function: main
parameter:
- args: string
+ declare args: string
return_type: void
body:
loop: