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 2e4cda8..37c24b3 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
@@ -59,25 +59,7 @@ public class FunctionParser implements TopLevelParser {
List body = new ArrayList<>();
// 定义可变区块的解析规则
- Map sectionDefinitions = new HashMap<>();
-
- // 参数解析
- sectionDefinitions.put("parameter", new SectionDefinition(
- ts -> ts.peek().getLexeme().equals("parameter"),
- (ctx1, ts1) -> parameters.addAll(parseParameters(ts1))
- ));
-
- // 返回类型解析
- sectionDefinitions.put("return_type", new SectionDefinition(
- ts -> ts.peek().getLexeme().equals("return_type"),
- (ctx1, ts1) -> returnType[0] = parseReturnType(ts1)
- ));
-
- // 函数体解析
- sectionDefinitions.put("body", new SectionDefinition(
- ts -> ts.peek().getLexeme().equals("body"),
- (ctx1, ts1) -> body.addAll(parseFunctionBody(ctx1, ts1))
- ));
+ Map sectionDefinitions = getStringSectionDefinitionMap(parameters, returnType, body);
// 使用 FlexibleSectionParser 解析函数的可变部分,顺序无关
FlexibleSectionParser.parse(ctx, tokens, sectionDefinitions);
@@ -89,6 +71,29 @@ public class FunctionParser implements TopLevelParser {
return new FunctionNode(functionName, parameters, returnType[0], body);
}
+ private Map getStringSectionDefinitionMap(List parameters, String[] returnType, List body) {
+ Map sectionDefinitions = new HashMap<>();
+
+ // 参数解析
+ sectionDefinitions.put("parameter", new SectionDefinition(
+ ts -> ts.peek().getLexeme().equals("parameter"),
+ (_, ts1) -> parameters.addAll(parseParameters(ts1))
+ ));
+
+ // 返回类型解析
+ sectionDefinitions.put("return_type", new SectionDefinition(
+ ts -> ts.peek().getLexeme().equals("return_type"),
+ (_, ts1) -> returnType[0] = parseReturnType(ts1)
+ ));
+
+ // 函数体解析
+ sectionDefinitions.put("body", new SectionDefinition(
+ ts -> ts.peek().getLexeme().equals("body"),
+ (ctx1, ts1) -> body.addAll(parseFunctionBody(ctx1, ts1))
+ ));
+ return sectionDefinitions;
+ }
+
/**
* 匹配并解析函数头部标记(例如:function:)。
*
diff --git a/src/main/java/org/jcnc/snow/compiler/parser/util/FlexibleSectionParser.java b/src/main/java/org/jcnc/snow/compiler/parser/util/FlexibleSectionParser.java
index cdcc394..a53511b 100644
--- a/src/main/java/org/jcnc/snow/compiler/parser/util/FlexibleSectionParser.java
+++ b/src/main/java/org/jcnc/snow/compiler/parser/util/FlexibleSectionParser.java
@@ -3,7 +3,7 @@ package org.jcnc.snow.compiler.parser.util;
import org.jcnc.snow.compiler.lexer.token.TokenType;
import org.jcnc.snow.compiler.parser.context.ParserContext;
import org.jcnc.snow.compiler.parser.context.TokenStream;
-import java.util.List;
+
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Predicate;
@@ -16,7 +16,7 @@ import java.util.function.Predicate;
*
*
*
- * 例如,您可以使用此类解析函数定义中的多个部分(如参数、返回类型、函数体等),而不需要在解析器中显式地硬编码每个部分。
+ * 使用此类解析函数定义中的多个部分(如参数、返回类型、函数体等),而不需要在解析器中显式地硬编码每个部分。
*
*/
public class FlexibleSectionParser {
@@ -28,9 +28,9 @@ public class FlexibleSectionParser {
* 条件用于判断是否应该解析该区块,解析器则负责实际的解析过程。
*
*
- * @param ctx 解析上下文,包含词法流等信息
- * @param tokens 当前的 Token 流
- * @param sectionDefinitions 各种区块定义,键值为区块的名称,值为对应的解析器和条件
+ * @param ctx 解析上下文,包含词法流等信息
+ * @param tokens 当前的 Token 流
+ * @param sectionDefinitions 各种区块定义,键值为区块的名称,值为对应的解析器和条件
*/
public static void parse(ParserContext ctx,
TokenStream tokens,
@@ -48,9 +48,9 @@ public class FlexibleSectionParser {
// 查找是否有与当前关键字匹配的区块
SectionDefinition definition = sectionDefinitions.get(keyword);
- if (definition != null && definition.getCondition().test(tokens)) {
+ if (definition != null && definition.condition().test(tokens)) {
// 执行解析动作
- definition.getParser().accept(ctx, tokens);
+ definition.parser().accept(ctx, tokens);
} else if ("end".equals(keyword)) {
// 如果遇到 "end",则退出解析
break;
@@ -72,21 +72,19 @@ public class FlexibleSectionParser {
* 它包含一个条件(`Predicate`),用于判断当前 Token 是否符合该区块的开始标识,
* 以及一个解析器(`BiConsumer`),用于执行具体的解析操作。
*
+ *
+ * @param condition 条件,判断是否需要解析该区块
+ * @param parser 区块的解析器
*/
- public static class SectionDefinition {
-
- private final Predicate condition; // 条件,判断是否需要解析该区块
- private final BiConsumer parser; // 区块的解析器
+ public record SectionDefinition(Predicate condition, BiConsumer parser) {
/**
* 构造一个新的区块定义。
*
* @param condition 判断该区块是否应该解析的条件
- * @param parser 区块的解析器
+ * @param parser 区块的解析器
*/
- public SectionDefinition(Predicate condition, BiConsumer parser) {
- this.condition = condition;
- this.parser = parser;
+ public SectionDefinition {
}
/**
@@ -94,7 +92,8 @@ public class FlexibleSectionParser {
*
* @return 区块的条件
*/
- public Predicate getCondition() {
+ @Override
+ public Predicate condition() {
return condition;
}
@@ -103,7 +102,8 @@ public class FlexibleSectionParser {
*
* @return 区块的解析器
*/
- public BiConsumer getParser() {
+ @Override
+ public BiConsumer parser() {
return parser;
}
}