完善注释

This commit is contained in:
Luke 2025-04-27 18:36:31 +08:00
parent 54c4914400
commit bfd14c4de7
4 changed files with 84 additions and 6 deletions

View File

@ -3,10 +3,26 @@ package org.jcnc.snow.compiler.semantic;
import org.jcnc.snow.compiler.parser.ast.base.Node; import org.jcnc.snow.compiler.parser.ast.base.Node;
/** /**
* 语义错误类保存 AST 节点和对应的错误信息 * 表示语义分析过程中发现的错误
* <p>
* 每个语义错误包含两个部分
* 1. 发生错误的 AST抽象语法树节点 {@link Node}
* 2. 错误的详细描述 {@link String}
* </p>
*
* 该类以 record 形式定义自动生成构造方法访问器方法gettersequalshashCode 以及 toString 方法
*/ */
public record SemanticError(Node node, String message) { public record SemanticError(Node node, String message) {
/**
* 返回语义错误的字符串表示
* <p>
* 格式为"Semantic error at [节点信息]: [错误信息]"
* 方便在日志输出或调试过程中快速定位问题
* </p>
*
* @return 格式化后的错误信息字符串
*/
@Override @Override
public String toString() { public String toString() {
return "Semantic error at " + node + ": " + message; return "Semantic error at " + node + ": " + message;

View File

@ -1,7 +1,21 @@
package org.jcnc.snow.compiler.semantic; package org.jcnc.snow.compiler.semantic;
/** /**
* 符号表中的一条记录包含名称类型和种类信息 * 表示符号表Symbol Table中的一条符号记录
* <p>
* 每条符号记录包含以下三个部分信息
* <ul>
* <li><b>name</b>符号的名称如变量名函数名等</li>
* <li><b>type</b>符号的类型信息通常对应变量类型函数返回值类型等</li>
* <li><b>kind</b>符号的种类指明符号是变量函数类等 {@link SymbolKind}</li>
* </ul>
* </p>
*
* 本类使用 Java 记录类型record定义自动生成构造方法访问器方法gettersequalshashCode 以及 toString 方法
*
* @param name 符号的名称
* @param type 符号的类型
* @param kind 符号的种类
*/ */
public record Symbol(String name, Type type, SymbolKind kind) { public record Symbol(String name, Type type, SymbolKind kind) {
} }

View File

@ -1,10 +1,25 @@
package org.jcnc.snow.compiler.semantic; package org.jcnc.snow.compiler.semantic;
/** /**
* 符号的种类枚举用于区分变量函数和模块等不同符号类型 * 表示符号的种类Symbol Kind
* <p>
* 用于在符号表中区分不同类型的符号例如变量函数模块等
* </p>
*
* 支持的符号种类包括
* <ul>
* <li><b>VARIABLE</b>变量符号例如局部变量全局变量等</li>
* <li><b>FUNCTION</b>函数符号包括普通函数方法等</li>
* <li><b>MODULE</b>模块符号表示一个模块或命名空间</li>
* </ul>
*/ */
public enum SymbolKind { public enum SymbolKind {
/** 变量符号,例如局部变量、全局变量等。 */
VARIABLE, VARIABLE,
/** 函数符号,表示一个可调用的功能单元。 */
FUNCTION, FUNCTION,
/** 模块符号,表示一个模块或命名空间。 */
MODULE MODULE
} }

View File

@ -4,18 +4,40 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
* 符号表支持链式作用域查找通过 parent 引用形成作用域嵌套 * 符号表Symbol Table用于管理符号如变量函数模块等及其作用域信息
* <p>
* 支持链式作用域Nested Scope管理
* <ul>
* <li>每个符号表可以有一个父符号表 {@link #parent}用于实现作用域嵌套</li>
* <li>符号表内部使用 {@link Map} 保存当前作用域内定义的符号</li>
* </ul>
* </p>
*/ */
public class SymbolTable { public class SymbolTable {
/** 父作用域符号表,如果为 null 则表示当前为最外层作用域。 */
private final SymbolTable parent; private final SymbolTable parent;
/** 当前作用域中定义的符号集合,按名称索引。 */
private final Map<String, Symbol> symbols = new HashMap<>(); private final Map<String, Symbol> symbols = new HashMap<>();
/**
* 创建一个新的符号表并指定其父作用域
*
* @param parent 父符号表若无父作用域则传入 null
*/
public SymbolTable(SymbolTable parent) { public SymbolTable(SymbolTable parent) {
this.parent = parent; this.parent = parent;
} }
/** /**
* 在当前作用域中定义一个符号如已存在同名符号则返回 false * 在当前作用域中定义一个新的符号
* <p>
* 如果当前作用域中已存在同名符号则定义失败并返回 {@code false}
* 否则将符号添加到符号表中并返回 {@code true}
* </p>
*
* @param symbol 要定义的符号
* @return 是否定义成功若名称冲突则返回 {@code false}
*/ */
public boolean define(Symbol symbol) { public boolean define(Symbol symbol) {
if (symbols.containsKey(symbol.name())) { if (symbols.containsKey(symbol.name())) {
@ -26,7 +48,18 @@ public class SymbolTable {
} }
/** /**
* 查找一个符号先从当前作用域开始若未找到则向上查找父作用域 * 根据名称查找符号
* <p>
* 查找顺序为
* <ol>
* <li>先在当前作用域中查找</li>
* <li>如果当前作用域未找到递归向父作用域查找</li>
* <li>若最终未找到返回 {@code null}</li>
* </ol>
* </p>
*
* @param name 要查找的符号名称
* @return 找到的符号对象如果不存在则返回 {@code null}
*/ */
public Symbol resolve(String name) { public Symbol resolve(String name) {
Symbol sym = symbols.get(name); Symbol sym = symbols.get(name);