优化项目结构

This commit is contained in:
Luke 2025-04-28 10:48:32 +08:00
parent 15c85c5a48
commit 530fb168c8
16 changed files with 47 additions and 27 deletions

View File

@ -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.context.ParserContext;
import org.jcnc.snow.compiler.parser.ast.base.Node; import org.jcnc.snow.compiler.parser.ast.base.Node;
import org.jcnc.snow.compiler.semantic.SemanticAnalyzer; 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.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;

View File

@ -1,5 +1,8 @@
package org.jcnc.snow.compiler.semantic; 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.*; import java.util.*;
/** /**

View File

@ -1,6 +1,9 @@
package org.jcnc.snow.compiler.semantic; package org.jcnc.snow.compiler.semantic;
import org.jcnc.snow.compiler.parser.ast.*; 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.*; import java.util.*;
@ -8,12 +11,10 @@ import java.util.*;
* 重构后的语义分析器采用注册表 + 分析器组合的分而治之设计 * 重构后的语义分析器采用注册表 + 分析器组合的分而治之设计
*/ */
public class SemanticAnalyzer { public class SemanticAnalyzer {
/** 内置类型映射表 */ /**
public static final Map<String, Type> BUILTIN_TYPES = Map.of( * 内置类型映射表
"int", BuiltinType.INT, */
"string", BuiltinType.STRING, public static final Map<String, Type> BUILTIN_TYPES = Map.of("int", BuiltinType.INT, "string", BuiltinType.STRING, "void", BuiltinType.VOID);
"void", BuiltinType.VOID
);
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
private final Map<String, ModuleInfo> modules = new HashMap<>(); private final Map<String, ModuleInfo> modules = new HashMap<>();
@ -41,11 +42,10 @@ public class SemanticAnalyzer {
registry.registerStatementAnalyzer(IfNode.class, new IfAnalyzer()); registry.registerStatementAnalyzer(IfNode.class, new IfAnalyzer());
registry.registerStatementAnalyzer(LoopNode.class, new LoopAnalyzer()); registry.registerStatementAnalyzer(LoopNode.class, new LoopAnalyzer());
registry.registerStatementAnalyzer(ReturnNode.class, new ReturnAnalyzer()); registry.registerStatementAnalyzer(ReturnNode.class, new ReturnAnalyzer());
registry.registerStatementAnalyzer(ExpressionStatementNode.class, registry.registerStatementAnalyzer(ExpressionStatementNode.class, (c, mi, fn, locals, stmt) -> {
(c, mi, fn, locals, stmt) -> { var a = c.getRegistry().getExpressionAnalyzer(stmt.expression());
var a = c.getRegistry().getExpressionAnalyzer(stmt.expression()); a.analyze(c, mi, fn, locals, stmt.expression());
a.analyze(c, mi, fn, locals, stmt.expression()); });
});
// 表达式 // 表达式
registry.registerExpressionAnalyzer(NumberLiteralNode.class, new NumberLiteralAnalyzer()); registry.registerExpressionAnalyzer(NumberLiteralNode.class, new NumberLiteralAnalyzer());
@ -55,8 +55,7 @@ public class SemanticAnalyzer {
registry.registerExpressionAnalyzer(BinaryExpressionNode.class, new BinaryExpressionAnalyzer()); registry.registerExpressionAnalyzer(BinaryExpressionNode.class, new BinaryExpressionAnalyzer());
// 兜底处理 // 兜底处理
// 兜底所有暂未实现的表达式都用 UnsupportedExpressionAnalyzer 处理 // 兜底所有暂未实现的表达式都用 UnsupportedExpressionAnalyzer 处理
registry.registerExpressionAnalyzer(MemberExpressionNode.class, registry.registerExpressionAnalyzer(MemberExpressionNode.class, new UnsupportedExpressionAnalyzer<>());
new UnsupportedExpressionAnalyzer<>());
} }
// --------------------------------------------------------------------- // ---------------------------------------------------------------------

View File

@ -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.ExpressionNode;
import org.jcnc.snow.compiler.parser.ast.base.StatementNode; 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.HashMap;
import java.util.Map; import java.util.Map;

View File

@ -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.BinaryExpressionNode;
import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.FunctionNode;
import org.jcnc.snow.compiler.semantic.*;
public class BinaryExpressionAnalyzer implements ExpressionAnalyzer<BinaryExpressionNode> { public class BinaryExpressionAnalyzer implements ExpressionAnalyzer<BinaryExpressionNode> {
@Override @Override

View File

@ -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.CallExpressionNode;
import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.FunctionNode;
import org.jcnc.snow.compiler.parser.ast.IdentifierNode; import org.jcnc.snow.compiler.parser.ast.IdentifierNode;
import org.jcnc.snow.compiler.parser.ast.MemberExpressionNode; import org.jcnc.snow.compiler.parser.ast.MemberExpressionNode;
import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
import org.jcnc.snow.compiler.semantic.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@ -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.FunctionNode;
import org.jcnc.snow.compiler.parser.ast.IdentifierNode; import org.jcnc.snow.compiler.parser.ast.IdentifierNode;
import org.jcnc.snow.compiler.semantic.*;
public class IdentifierAnalyzer implements ExpressionAnalyzer<IdentifierNode> { public class IdentifierAnalyzer implements ExpressionAnalyzer<IdentifierNode> {
@Override @Override

View File

@ -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.FunctionNode;
import org.jcnc.snow.compiler.parser.ast.NumberLiteralNode; import org.jcnc.snow.compiler.parser.ast.NumberLiteralNode;
import org.jcnc.snow.compiler.semantic.*;
public class NumberLiteralAnalyzer implements ExpressionAnalyzer<NumberLiteralNode> { public class NumberLiteralAnalyzer implements ExpressionAnalyzer<NumberLiteralNode> {
@Override @Override

View File

@ -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; import org.jcnc.snow.compiler.parser.ast.base.Node;

View File

@ -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.FunctionNode;
import org.jcnc.snow.compiler.parser.ast.StringLiteralNode; import org.jcnc.snow.compiler.parser.ast.StringLiteralNode;
import org.jcnc.snow.compiler.semantic.*;
public class StringLiteralAnalyzer implements ExpressionAnalyzer<StringLiteralNode> { public class StringLiteralAnalyzer implements ExpressionAnalyzer<StringLiteralNode> {
@Override @Override

View File

@ -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.FunctionNode;
import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
import org.jcnc.snow.compiler.semantic.*;
// 之前implements ExpressionAnalyzer<ExpressionNode> // 之前implements ExpressionAnalyzer<ExpressionNode>
public class UnsupportedExpressionAnalyzer<E extends ExpressionNode> public class UnsupportedExpressionAnalyzer<E extends ExpressionNode>

View File

@ -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.AssignmentNode;
import org.jcnc.snow.compiler.parser.ast.FunctionNode; 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<AssignmentNode> { public class AssignmentAnalyzer implements StatementAnalyzer<AssignmentNode> {
@Override @Override

View File

@ -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.DeclarationNode;
import org.jcnc.snow.compiler.parser.ast.FunctionNode; 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<DeclarationNode> { public class DeclarationAnalyzer implements StatementAnalyzer<DeclarationNode> {
@Override @Override

View File

@ -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.FunctionNode;
import org.jcnc.snow.compiler.parser.ast.IfNode; 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<IfNode> { public class IfAnalyzer implements StatementAnalyzer<IfNode> {
@Override @Override

View File

@ -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.FunctionNode;
import org.jcnc.snow.compiler.parser.ast.LoopNode; 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<LoopNode> { public class LoopAnalyzer implements StatementAnalyzer<LoopNode> {
@Override @Override

View File

@ -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.FunctionNode;
import org.jcnc.snow.compiler.parser.ast.ReturnNode; 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<ReturnNode> { public class ReturnAnalyzer implements StatementAnalyzer<ReturnNode> {
@Override @Override