feat: 丰富 ModuleInfo 类以支持结构体和更广泛的语义分析
- 新增 structs 字段,用于存储模块中定义的结构体类型 - 扩展类注释,明确 ModuleInfo 的功能和用途 - 优化字段和方法注释,增强代码可读性和易维护性 - 调整部分方法实现,提高模块信息管理的灵活性和安全性
This commit is contained in:
parent
258d1909e6
commit
8902748cde
@ -2,6 +2,7 @@ package org.jcnc.snow.compiler.semantic.core;
|
|||||||
|
|
||||||
import org.jcnc.snow.compiler.semantic.symbol.SymbolTable;
|
import org.jcnc.snow.compiler.semantic.symbol.SymbolTable;
|
||||||
import org.jcnc.snow.compiler.semantic.type.FunctionType;
|
import org.jcnc.snow.compiler.semantic.type.FunctionType;
|
||||||
|
import org.jcnc.snow.compiler.semantic.type.StructType;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -9,106 +10,155 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@code ModuleInfo} 表示单个模块在语义分析阶段的元信息封装。
|
* {@code ModuleInfo} 表示单个模块在语义分析阶段的所有元信息封装。
|
||||||
* <p>
|
|
||||||
* 用于在分析期间管理模块间依赖、函数签名查找、全局符号表等关键任务。
|
|
||||||
* 每个模块对应一个唯一的 {@code ModuleInfo} 实例,贯穿整个语义分析流程。
|
|
||||||
*
|
*
|
||||||
* <p><b>包含信息:</b>
|
* <p>
|
||||||
|
* 每个模块对应一个唯一的 ModuleInfo 实例,在语义分析期间用于管理和查询:
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>模块名称(全局唯一标识);</li>
|
* <li>模块名称(全局唯一标识);</li>
|
||||||
* <li>该模块导入的其他模块名集合(跨模块引用支持);</li>
|
* <li>本模块导入的其他模块名集合(跨模块依赖支持);</li>
|
||||||
* <li>该模块中定义的所有函数签名 {@code Map<String, FunctionType>};</li>
|
* <li>该模块中所有函数签名(用于查找/重名检测/类型推断);</li>
|
||||||
* <li>模块级全局符号表 {@link SymbolTable}(常量 / 全局变量,支持跨模块类型推断)。</li>
|
* <li>模块级全局符号表(常量、全局变量,支持类型推断和常量折叠);</li>
|
||||||
|
* <li>本模块定义的结构体类型(struct)。</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
|
* </p>
|
||||||
*
|
*
|
||||||
* <p><b>典型用途:</b>
|
* <p><b>主要用途:</b>
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>用于函数签名类型查找、重名检测、跨模块引用校验等;</li>
|
* <li>跨模块语义分析、符号查找、类型推断、常量查找、函数/类型重名校验等。</li>
|
||||||
* <li>全局符号表为类型检查与后端 IR 常量折叠等模块级分析提供支撑。</li>
|
* <li>所有对该模块的引用、类型检查、全局变量访问等均依赖本类提供的索引信息。</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
|
* </p>
|
||||||
*/
|
*/
|
||||||
public class ModuleInfo {
|
public class ModuleInfo {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模块名称,作为全局唯一标识
|
* 模块名称,作为全局唯一标识符。
|
||||||
|
* 不可为空。通常为文件名或逻辑模块名。
|
||||||
*/
|
*/
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 该模块显式导入的模块名集合(用于跨模块访问符号)
|
* 该模块显式导入的模块名集合。
|
||||||
|
* <p>
|
||||||
|
* 仅存储本模块 import 的模块名(如 import foo;),
|
||||||
|
* 用于限制跨模块访问符号时的合法性校验。
|
||||||
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* 注意:集合为内部引用,允许外部直接添加或删除导入关系。
|
||||||
|
* </p>
|
||||||
*/
|
*/
|
||||||
private final Set<String> imports = new HashSet<>();
|
private final Set<String> imports = new HashSet<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 该模块中定义的函数名 → 函数类型映射
|
* 该模块中声明的所有函数签名映射。
|
||||||
|
* <p>
|
||||||
|
* 键为函数名,值为函数类型。
|
||||||
|
* 支持跨模块函数引用、重名检测和类型推断。
|
||||||
|
* </p>
|
||||||
*/
|
*/
|
||||||
private final Map<String, FunctionType> functions = new HashMap<>();
|
private final Map<String, FunctionType> functions = new HashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模块级全局符号表(常量 / 全局变量)
|
* 该模块中声明的所有结构体类型(struct)。
|
||||||
|
* <p>
|
||||||
|
* 键为结构体名称,值为结构体类型。
|
||||||
|
* 用于跨模块/跨作用域结构体查找与类型检查。
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
private final Map<String, StructType> structs = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模块级全局符号表。
|
||||||
|
* <p>
|
||||||
|
* 记录本模块声明的所有常量和全局变量。
|
||||||
|
* 支持类型推断、跨模块常量折叠、全局符号查找。
|
||||||
|
* 由 FunctionChecker 阶段注入。
|
||||||
|
* </p>
|
||||||
*/
|
*/
|
||||||
private SymbolTable globals;
|
private SymbolTable globals;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造模块信息对象。
|
* 构造函数:根据模块名初始化模块元信息。
|
||||||
*
|
*
|
||||||
* @param name 模块名称,必须唯一且不可为空
|
* @param name 模块名称,要求全局唯一,且不可为空。
|
||||||
*/
|
*/
|
||||||
public ModuleInfo(String name) {
|
public ModuleInfo(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取模块名称。
|
* 获取当前模块的全局唯一名称。
|
||||||
*
|
*
|
||||||
* @return 当前模块的唯一名称
|
* @return 模块名字符串
|
||||||
*/
|
*/
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取该模块导入的模块名称集合。
|
* 获取本模块导入的所有模块名称集合。
|
||||||
* <p>
|
|
||||||
* 返回集合为内部数据的直接引用,调用方可通过 {@code add}/{@code remove} 方法动态维护导入信息。
|
|
||||||
*
|
*
|
||||||
* @return 可变集合,包含所有导入模块名
|
* <p>
|
||||||
|
* 注意:返回为内部集合引用,调用方可直接对集合进行 add/remove 操作维护导入依赖关系。
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @return 可变集合,包含所有导入模块名(如 "foo", "bar")
|
||||||
*/
|
*/
|
||||||
public Set<String> getImports() {
|
public Set<String> getImports() {
|
||||||
return imports;
|
return imports;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取模块中已声明的函数签名表。
|
* 获取模块内所有函数签名表。
|
||||||
* <p>
|
|
||||||
* 映射键为函数名,值为对应的 {@link FunctionType}。
|
|
||||||
* 返回对象为内部引用,可用于添加、修改或删除函数定义。
|
|
||||||
*
|
*
|
||||||
* @return 模块内函数定义映射表
|
* <p>
|
||||||
|
* 键为函数名,值为函数类型。
|
||||||
|
* 返回对象为内部映射,可用于动态添加/修改/删除函数定义。
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @return 函数名 → 函数类型映射表
|
||||||
*/
|
*/
|
||||||
public Map<String, FunctionType> getFunctions() {
|
public Map<String, FunctionType> getFunctions() {
|
||||||
return functions;
|
return functions;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取模块的全局符号表(包含常量与全局变量)。
|
* 获取模块定义的所有结构体类型。
|
||||||
* <p>
|
|
||||||
* 该符号表由语义分析的 FunctionChecker 阶段构建完成并注入。
|
|
||||||
* 提供跨模块类型检查、常量折叠等能力。
|
|
||||||
*
|
*
|
||||||
* @return 当前模块的全局符号表
|
* <p>
|
||||||
|
* 键为结构体名,值为结构体类型描述。
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @return 结构体名 → 结构体类型映射
|
||||||
|
*/
|
||||||
|
public Map<String, StructType> getStructs() {
|
||||||
|
return structs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前模块的全局符号表(包含常量与全局变量)。
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* 该符号表通常由 FunctionChecker 阶段在全局扫描时构建并注入。
|
||||||
|
* 提供后续类型检查、常量折叠、跨模块全局符号访问等能力。
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @return 本模块全局符号表
|
||||||
*/
|
*/
|
||||||
public SymbolTable getGlobals() {
|
public SymbolTable getGlobals() {
|
||||||
return globals;
|
return globals;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置模块的全局符号表。
|
* 设置模块的全局符号表(仅限 FunctionChecker 构建时注入)。
|
||||||
* <p>
|
|
||||||
* 仅应由 FunctionChecker 在语义分析全局扫描阶段调用。
|
|
||||||
*
|
*
|
||||||
* @param globals 全局符号表实例
|
* <p>
|
||||||
|
* 通常仅语义分析的全局阶段由框架内部调用,
|
||||||
|
* 不建议外部用户主动修改此符号表。
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param globals 新的全局符号表实例
|
||||||
*/
|
*/
|
||||||
public void setGlobals(SymbolTable globals) {
|
public void setGlobals(SymbolTable globals) {
|
||||||
this.globals = globals;
|
this.globals = globals;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user