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; } }