优化项目结构

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

View File

@ -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.*;
/**

View File

@ -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<String, Type> BUILTIN_TYPES = Map.of(
"int", BuiltinType.INT,
"string", BuiltinType.STRING,
"void", BuiltinType.VOID
);
/**
* 内置类型映射表
*/
public static final Map<String, Type> BUILTIN_TYPES = Map.of("int", BuiltinType.INT, "string", BuiltinType.STRING, "void", BuiltinType.VOID);
// ---------------------------------------------------------------------
private final Map<String, ModuleInfo> modules = new HashMap<>();
@ -41,8 +42,7 @@ 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) -> {
registry.registerStatementAnalyzer(ExpressionStatementNode.class, (c, mi, fn, locals, stmt) -> {
var a = c.getRegistry().getExpressionAnalyzer(stmt.expression());
a.analyze(c, mi, fn, locals, stmt.expression());
});
@ -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<>());
}
// ---------------------------------------------------------------------

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.StatementNode;
import org.jcnc.snow.compiler.semantic.ExpressionAnalyzer;
import org.jcnc.snow.compiler.semantic.StatementAnalyzer;
import java.util.HashMap;
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.FunctionNode;
import org.jcnc.snow.compiler.semantic.*;
public class BinaryExpressionAnalyzer implements ExpressionAnalyzer<BinaryExpressionNode> {
@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.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;

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

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.StringLiteralNode;
import org.jcnc.snow.compiler.semantic.*;
public class StringLiteralAnalyzer implements ExpressionAnalyzer<StringLiteralNode> {
@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.base.ExpressionNode;
import org.jcnc.snow.compiler.semantic.*;
// 之前implements ExpressionAnalyzer<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.FunctionNode;
import org.jcnc.snow.compiler.semantic.*;
import org.jcnc.snow.compiler.semantic.expression.SemanticError;
public class AssignmentAnalyzer implements StatementAnalyzer<AssignmentNode> {
@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.FunctionNode;
import org.jcnc.snow.compiler.semantic.*;
import org.jcnc.snow.compiler.semantic.expression.SemanticError;
public class DeclarationAnalyzer implements StatementAnalyzer<DeclarationNode> {
@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.IfNode;
import org.jcnc.snow.compiler.semantic.*;
import org.jcnc.snow.compiler.semantic.expression.SemanticError;
public class IfAnalyzer implements StatementAnalyzer<IfNode> {
@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.LoopNode;
import org.jcnc.snow.compiler.semantic.*;
import org.jcnc.snow.compiler.semantic.expression.SemanticError;
public class LoopAnalyzer implements StatementAnalyzer<LoopNode> {
@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.ReturnNode;
import org.jcnc.snow.compiler.semantic.*;
import org.jcnc.snow.compiler.semantic.expression.SemanticError;
public class ReturnAnalyzer implements StatementAnalyzer<ReturnNode> {
@Override