diff --git a/src/main/java/org/jcnc/snow/compiler/Main.java b/src/main/java/org/jcnc/snow/compiler/Main.java index 4f89567..72acc4f 100644 --- a/src/main/java/org/jcnc/snow/compiler/Main.java +++ b/src/main/java/org/jcnc/snow/compiler/Main.java @@ -7,7 +7,7 @@ import org.jcnc.snow.compiler.parser.ast.ModuleNode; import org.jcnc.snow.compiler.parser.context.ParserContext; import org.jcnc.snow.compiler.parser.ast.base.Node; import org.jcnc.snow.compiler.semantic.SemanticAnalyzer; -import org.jcnc.snow.compiler.semantic.SemanticError; +import org.jcnc.snow.compiler.semantic.expression.SemanticError; import java.io.IOException; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/Context.java b/src/main/java/org/jcnc/snow/compiler/semantic/Context.java index af5fb4e..d95a65d 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/Context.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/Context.java @@ -1,5 +1,8 @@ package org.jcnc.snow.compiler.semantic; +import org.jcnc.snow.compiler.semantic.analyzers.AnalyzerRegistry; +import org.jcnc.snow.compiler.semantic.expression.SemanticError; + import java.util.*; /** diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/SemanticAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/SemanticAnalyzer.java index 0883156..7fc2931 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/SemanticAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/SemanticAnalyzer.java @@ -1,6 +1,9 @@ package org.jcnc.snow.compiler.semantic; import org.jcnc.snow.compiler.parser.ast.*; +import org.jcnc.snow.compiler.semantic.analyzers.AnalyzerRegistry; +import org.jcnc.snow.compiler.semantic.expression.*; +import org.jcnc.snow.compiler.semantic.statement.*; import java.util.*; @@ -8,12 +11,10 @@ import java.util.*; * 重构后的语义分析器,采用注册表 + 分析器组合的分而治之设计。 */ public class SemanticAnalyzer { - /** 内置类型映射表 */ - public static final Map BUILTIN_TYPES = Map.of( - "int", BuiltinType.INT, - "string", BuiltinType.STRING, - "void", BuiltinType.VOID - ); + /** + * 内置类型映射表 + */ + public static final Map BUILTIN_TYPES = Map.of("int", BuiltinType.INT, "string", BuiltinType.STRING, "void", BuiltinType.VOID); // --------------------------------------------------------------------- private final Map modules = new HashMap<>(); @@ -41,11 +42,10 @@ public class SemanticAnalyzer { registry.registerStatementAnalyzer(IfNode.class, new IfAnalyzer()); registry.registerStatementAnalyzer(LoopNode.class, new LoopAnalyzer()); registry.registerStatementAnalyzer(ReturnNode.class, new ReturnAnalyzer()); - registry.registerStatementAnalyzer(ExpressionStatementNode.class, - (c, mi, fn, locals, stmt) -> { - var a = c.getRegistry().getExpressionAnalyzer(stmt.expression()); - a.analyze(c, mi, fn, locals, stmt.expression()); - }); + registry.registerStatementAnalyzer(ExpressionStatementNode.class, (c, mi, fn, locals, stmt) -> { + var a = c.getRegistry().getExpressionAnalyzer(stmt.expression()); + a.analyze(c, mi, fn, locals, stmt.expression()); + }); // 表达式 registry.registerExpressionAnalyzer(NumberLiteralNode.class, new NumberLiteralAnalyzer()); @@ -55,8 +55,7 @@ public class SemanticAnalyzer { registry.registerExpressionAnalyzer(BinaryExpressionNode.class, new BinaryExpressionAnalyzer()); // 兜底处理 // 兜底:所有暂未实现的表达式都用 UnsupportedExpressionAnalyzer 处理 - registry.registerExpressionAnalyzer(MemberExpressionNode.class, - new UnsupportedExpressionAnalyzer<>()); + registry.registerExpressionAnalyzer(MemberExpressionNode.class, new UnsupportedExpressionAnalyzer<>()); } // --------------------------------------------------------------------- diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/AnalyzerRegistry.java b/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/AnalyzerRegistry.java similarity index 89% rename from src/main/java/org/jcnc/snow/compiler/semantic/AnalyzerRegistry.java rename to src/main/java/org/jcnc/snow/compiler/semantic/analyzers/AnalyzerRegistry.java index 59f146d..5462dba 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/AnalyzerRegistry.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/AnalyzerRegistry.java @@ -1,7 +1,9 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.analyzers; import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; import org.jcnc.snow.compiler.parser.ast.base.StatementNode; +import org.jcnc.snow.compiler.semantic.ExpressionAnalyzer; +import org.jcnc.snow.compiler.semantic.StatementAnalyzer; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/BinaryExpressionAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/expression/BinaryExpressionAnalyzer.java similarity index 96% rename from src/main/java/org/jcnc/snow/compiler/semantic/BinaryExpressionAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/expression/BinaryExpressionAnalyzer.java index df020b6..0af3cdf 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/BinaryExpressionAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/expression/BinaryExpressionAnalyzer.java @@ -1,7 +1,8 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.expression; import org.jcnc.snow.compiler.parser.ast.BinaryExpressionNode; import org.jcnc.snow.compiler.parser.ast.FunctionNode; +import org.jcnc.snow.compiler.semantic.*; public class BinaryExpressionAnalyzer implements ExpressionAnalyzer { @Override diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/CallExpressionAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/expression/CallExpressionAnalyzer.java similarity index 97% rename from src/main/java/org/jcnc/snow/compiler/semantic/CallExpressionAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/expression/CallExpressionAnalyzer.java index efcdb59..22ef857 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/CallExpressionAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/expression/CallExpressionAnalyzer.java @@ -1,10 +1,11 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.expression; import org.jcnc.snow.compiler.parser.ast.CallExpressionNode; import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.IdentifierNode; import org.jcnc.snow.compiler.parser.ast.MemberExpressionNode; import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; +import org.jcnc.snow.compiler.semantic.*; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/IdentifierAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/expression/IdentifierAnalyzer.java similarity index 87% rename from src/main/java/org/jcnc/snow/compiler/semantic/IdentifierAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/expression/IdentifierAnalyzer.java index bd172da..36a9322 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/IdentifierAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/expression/IdentifierAnalyzer.java @@ -1,7 +1,8 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.expression; import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.IdentifierNode; +import org.jcnc.snow.compiler.semantic.*; public class IdentifierAnalyzer implements ExpressionAnalyzer { @Override diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/NumberLiteralAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/expression/NumberLiteralAnalyzer.java similarity index 79% rename from src/main/java/org/jcnc/snow/compiler/semantic/NumberLiteralAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/expression/NumberLiteralAnalyzer.java index 1fb9d92..141e1d7 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/NumberLiteralAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/expression/NumberLiteralAnalyzer.java @@ -1,7 +1,8 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.expression; import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.NumberLiteralNode; +import org.jcnc.snow.compiler.semantic.*; public class NumberLiteralAnalyzer implements ExpressionAnalyzer { @Override diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/SemanticError.java b/src/main/java/org/jcnc/snow/compiler/semantic/expression/SemanticError.java similarity index 94% rename from src/main/java/org/jcnc/snow/compiler/semantic/SemanticError.java rename to src/main/java/org/jcnc/snow/compiler/semantic/expression/SemanticError.java index b2e8f27..181fa39 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/SemanticError.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/expression/SemanticError.java @@ -1,4 +1,4 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.expression; import org.jcnc.snow.compiler.parser.ast.base.Node; diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/StringLiteralAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/expression/StringLiteralAnalyzer.java similarity index 79% rename from src/main/java/org/jcnc/snow/compiler/semantic/StringLiteralAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/expression/StringLiteralAnalyzer.java index cde626f..60b307d 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/StringLiteralAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/expression/StringLiteralAnalyzer.java @@ -1,7 +1,8 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.expression; import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.StringLiteralNode; +import org.jcnc.snow.compiler.semantic.*; public class StringLiteralAnalyzer implements ExpressionAnalyzer { @Override diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/UnsupportedExpressionAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/expression/UnsupportedExpressionAnalyzer.java similarity index 88% rename from src/main/java/org/jcnc/snow/compiler/semantic/UnsupportedExpressionAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/expression/UnsupportedExpressionAnalyzer.java index f3139d3..e58e74b 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/UnsupportedExpressionAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/expression/UnsupportedExpressionAnalyzer.java @@ -1,7 +1,8 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.expression; import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; +import org.jcnc.snow.compiler.semantic.*; // 之前:implements ExpressionAnalyzer public class UnsupportedExpressionAnalyzer diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/AssignmentAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/statement/AssignmentAnalyzer.java similarity index 87% rename from src/main/java/org/jcnc/snow/compiler/semantic/AssignmentAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/statement/AssignmentAnalyzer.java index a5698b7..2084205 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/AssignmentAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/statement/AssignmentAnalyzer.java @@ -1,7 +1,9 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.statement; import org.jcnc.snow.compiler.parser.ast.AssignmentNode; import org.jcnc.snow.compiler.parser.ast.FunctionNode; +import org.jcnc.snow.compiler.semantic.*; +import org.jcnc.snow.compiler.semantic.expression.SemanticError; public class AssignmentAnalyzer implements StatementAnalyzer { @Override diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/DeclarationAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/statement/DeclarationAnalyzer.java similarity index 90% rename from src/main/java/org/jcnc/snow/compiler/semantic/DeclarationAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/statement/DeclarationAnalyzer.java index 4d04516..ebc266a 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/DeclarationAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/statement/DeclarationAnalyzer.java @@ -1,7 +1,9 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.statement; import org.jcnc.snow.compiler.parser.ast.DeclarationNode; import org.jcnc.snow.compiler.parser.ast.FunctionNode; +import org.jcnc.snow.compiler.semantic.*; +import org.jcnc.snow.compiler.semantic.expression.SemanticError; public class DeclarationAnalyzer implements StatementAnalyzer { @Override diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/IfAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/statement/IfAnalyzer.java similarity index 87% rename from src/main/java/org/jcnc/snow/compiler/semantic/IfAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/statement/IfAnalyzer.java index 0d92d88..77af7ef 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/IfAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/statement/IfAnalyzer.java @@ -1,7 +1,9 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.statement; import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.IfNode; +import org.jcnc.snow.compiler.semantic.*; +import org.jcnc.snow.compiler.semantic.expression.SemanticError; public class IfAnalyzer implements StatementAnalyzer { @Override diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/LoopAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/statement/LoopAnalyzer.java similarity index 89% rename from src/main/java/org/jcnc/snow/compiler/semantic/LoopAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/statement/LoopAnalyzer.java index 2fdd280..5c4f328 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/LoopAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/statement/LoopAnalyzer.java @@ -1,7 +1,9 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.statement; import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.LoopNode; +import org.jcnc.snow.compiler.semantic.*; +import org.jcnc.snow.compiler.semantic.expression.SemanticError; public class LoopAnalyzer implements StatementAnalyzer { @Override diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/ReturnAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/statement/ReturnAnalyzer.java similarity index 88% rename from src/main/java/org/jcnc/snow/compiler/semantic/ReturnAnalyzer.java rename to src/main/java/org/jcnc/snow/compiler/semantic/statement/ReturnAnalyzer.java index 4b5e106..8d0bed2 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/ReturnAnalyzer.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/statement/ReturnAnalyzer.java @@ -1,7 +1,9 @@ -package org.jcnc.snow.compiler.semantic; +package org.jcnc.snow.compiler.semantic.statement; import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.ReturnNode; +import org.jcnc.snow.compiler.semantic.*; +import org.jcnc.snow.compiler.semantic.expression.SemanticError; public class ReturnAnalyzer implements StatementAnalyzer { @Override