增加注释

This commit is contained in:
Luke 2025-04-28 14:24:32 +08:00
parent a7739cd116
commit f970392389

View File

@ -55,37 +55,123 @@ public class SemanticAnalyzer {
this.ctx = new Context(modules, errors, verbose, registry);
registerAnalyzers();
}
/**
* 注册所有语句与表达式分析器到 {@link AnalyzerRegistry}
* 注册所有的语句分析器 (StatementAnalyzer) 和表达式分析器 (ExpressionAnalyzer)
* {@link AnalyzerRegistry} 以便框架在遍历 AST 时能够根据节点类型分发到对应的分析器
* <p>
* 包括声明赋值分支循环返回表达式语句以及
* 数字字符串标识符调用二元兜底表达式分析器
* <strong>语句分析器</strong>StatementAnalyzer
* <ul>
* <li>{@link DeclarationNode} {@link DeclarationAnalyzer}处理变量声明</li>
* <li>{@link AssignmentNode} {@link AssignmentAnalyzer}处理赋值语句</li>
* <li>{@link IfNode} {@link IfAnalyzer}处理条件分支</li>
* <li>{@link LoopNode} {@link LoopAnalyzer}处理循环语句</li>
* <li>{@link ReturnNode} {@link ReturnAnalyzer}处理返回语句</li>
* <li>{@link ExpressionStatementNode} 直接委托给相应的表达式分析器</li>
* </ul>
* <p>
* <strong>表达式分析器</strong>ExpressionAnalyzer
* <ul>
* <li>{@link NumberLiteralNode} {@link NumberLiteralAnalyzer}数字字面量</li>
* <li>{@link StringLiteralNode} {@link StringLiteralAnalyzer}字符串字面量</li>
* <li>{@link IdentifierNode} {@link IdentifierAnalyzer}标识符</li>
* <li>{@link CallExpressionNode} {@link CallExpressionAnalyzer}函数调用</li>
* <li>{@link BinaryExpressionNode} {@link BinaryExpressionAnalyzer}二元运算</li>
* </ul>
* <p>
* <strong>默认兜底</strong>
* <ul>
* <li>未注册的表达式节点会由 {@link UnsupportedExpressionAnalyzer} 处理记录错误并降级类型</li>
* </ul>
*/
private void registerAnalyzers() {
// 语句分析器
registry.registerStatementAnalyzer(DeclarationNode.class, new DeclarationAnalyzer());
registry.registerStatementAnalyzer(AssignmentNode.class, new AssignmentAnalyzer());
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 exprAn = c.getRegistry().getExpressionAnalyzer(stmt.expression());
exprAn.analyze(c, mi, fn, locals, stmt.expression());
// -----------------------------------------------------------------
// 语句分析器注册StatementAnalyzer
// -----------------------------------------------------------------
// 变量声明语句DeclarationNode
registry.registerStatementAnalyzer(
DeclarationNode.class,
new DeclarationAnalyzer()
);
// 赋值语句AssignmentNode
registry.registerStatementAnalyzer(
AssignmentNode.class,
new AssignmentAnalyzer()
);
// if 分支语句IfNode
registry.registerStatementAnalyzer(
IfNode.class,
new IfAnalyzer()
);
// loop 循环语句LoopNode
registry.registerStatementAnalyzer(
LoopNode.class,
new LoopAnalyzer()
);
// return 语句ReturnNode
registry.registerStatementAnalyzer(
ReturnNode.class,
new ReturnAnalyzer()
);
// 表达式语句仅执行表达式不产生新的值ExpressionStatementNode
registry.registerStatementAnalyzer(
ExpressionStatementNode.class,
(ctx, mi, fn, locals, stmt) -> {
// 将表达式语句委托给对应的表达式分析器
var exprAnalyzer = ctx.getRegistry().getExpressionAnalyzer(stmt.expression());
exprAnalyzer.analyze(ctx, mi, fn, locals, stmt.expression());
}
);
// 表达式分析器
registry.registerExpressionAnalyzer(NumberLiteralNode.class, new NumberLiteralAnalyzer());
registry.registerExpressionAnalyzer(StringLiteralNode.class, new StringLiteralAnalyzer());
registry.registerExpressionAnalyzer(IdentifierNode.class, new IdentifierAnalyzer());
registry.registerExpressionAnalyzer(CallExpressionNode.class,new CallExpressionAnalyzer());
registry.registerExpressionAnalyzer(BinaryExpressionNode.class, new BinaryExpressionAnalyzer());
// 默认兜底
registry.registerExpressionAnalyzer(MemberExpressionNode.class, new UnsupportedExpressionAnalyzer<>());
// -----------------------------------------------------------------
// 表达式分析器注册ExpressionAnalyzer
// -----------------------------------------------------------------
// 数字字面量NumberLiteralNode INT
registry.registerExpressionAnalyzer(
NumberLiteralNode.class,
new NumberLiteralAnalyzer()
);
// 字符串字面量StringLiteralNode STRING
registry.registerExpressionAnalyzer(
StringLiteralNode.class,
new StringLiteralAnalyzer()
);
// 标识符IdentifierNode 查符号表
registry.registerExpressionAnalyzer(
IdentifierNode.class,
new IdentifierAnalyzer()
);
// 函数调用CallExpressionNode 查函数签名并校验参数
registry.registerExpressionAnalyzer(
CallExpressionNode.class,
new CallExpressionAnalyzer()
);
// 二元运算BinaryExpressionNode 根据运算符和操作数推导类型
registry.registerExpressionAnalyzer(
BinaryExpressionNode.class,
new BinaryExpressionAnalyzer()
);
// -----------------------------------------------------------------
// 默认兜底所有未显式注册的 MemberExpressionNode 及其它表达式
// -----------------------------------------------------------------
// 如果遇到不支持的表达式节点类型将由此分析器记录错误并降级为 INT
registry.registerExpressionAnalyzer(
MemberExpressionNode.class,
new UnsupportedExpressionAnalyzer<>()
);
}
/**
* 对给定的模块 AST 列表执行完整的语义分析
*