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: