From f39aece9cf87482bdc3aaed0ac6db2550ce89426 Mon Sep 17 00:00:00 2001
From: Luke
Date: Tue, 26 Aug 2025 14:32:58 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=A8=A1=E5=9D=97?=
=?UTF-8?q?=E6=88=90=E5=91=98=E8=AE=BF=E9=97=AE=E7=9A=84=E8=AF=AD=E4=B9=89?=
=?UTF-8?q?=E5=88=86=E6=9E=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 实现了跨模块常量和全局变量访问的语义分析- 能根据目标模块的全局符号表返回准确的类型信息- 完全支持跨模块类型推断
- 对非模块成员访问的情况增加了错误处理
---
.../expression/MemberExpressionAnalyzer.java | 59 ++++++++++++-------
1 file changed, 39 insertions(+), 20 deletions(-)
diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/expression/MemberExpressionAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/expression/MemberExpressionAnalyzer.java
index a115e61..5080545 100644
--- a/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/expression/MemberExpressionAnalyzer.java
+++ b/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/expression/MemberExpressionAnalyzer.java
@@ -8,35 +8,42 @@ import org.jcnc.snow.compiler.semantic.analyzers.base.ExpressionAnalyzer;
import org.jcnc.snow.compiler.semantic.core.Context;
import org.jcnc.snow.compiler.semantic.core.ModuleInfo;
import org.jcnc.snow.compiler.semantic.error.SemanticError;
+import org.jcnc.snow.compiler.semantic.symbol.Symbol;
import org.jcnc.snow.compiler.semantic.symbol.SymbolTable;
import org.jcnc.snow.compiler.semantic.type.BuiltinType;
import org.jcnc.snow.compiler.semantic.type.Type;
/**
- * {@code MemberExpressionAnalyzer} – 成员访问表达式的语义分析器。
+ * {@code MemberExpressionAnalyzer} 用于分析模块成员访问表达式的类型和语义。
*
*
- * 当前实现仅支持 ModuleName.constOrVar 形式的跨模块常量 /
- * 全局变量访问,不支持对象成员(如 a.b.c)。
+ * 当前实现支持 ModuleName.constOrVar 形式的跨模块常量/全局变量访问,
+ * 能根据目标模块的全局符号表,返回准确的类型信息,完全支持跨模块类型推断。
+ *
+ * 对于非模块成员的访问(如对象.属性、多级 a.b.c),暂不支持,遇到时将报告语义错误。
*
*
+ *
+ * 核心特性:
*
- * - 示例:ModuleA.a 或 ModuleB.CONST_X
- * - 仅检查模块是否存在且已导入,类型降级为 int,后续由 IR 阶段常量折叠
- * - 暂不支持复杂的对象/类型成员访问
+ * - 校验模块是否存在、是否已导入(或自身);
+ * - 跨模块访问目标模块的全局符号表,查找指定成员符号及其类型;
+ * - 若成员不存在,报告“模块成员未定义”语义错误;
+ * - 暂不支持更复杂的对象成员访问,遇到将报“不支持的成员访问对象类型”错误。
*
+ *
*/
public class MemberExpressionAnalyzer implements ExpressionAnalyzer {
/**
- * 对成员访问表达式执行语义分析。
+ * 语义分析模块成员访问表达式。
*
- * @param ctx 全局语义上下文,包含模块表、错误收集等
- * @param mi 当前模块信息(含本模块名、已导入模块)
- * @param fn 当前所在函数节点
- * @param locals 当前作用域符号表
- * @param expr 当前要分析的成员表达式(如 ModuleA.a)
- * @return 分析推断得到的类型(目前恒定降级为 int),如有错误也会记录
+ * @param ctx 全局语义分析上下文,持有所有模块及错误记录
+ * @param mi 当前模块信息(用于判断导入关系)
+ * @param fn 当前函数节点
+ * @param locals 当前局部符号表
+ * @param expr 当前要分析的成员表达式(如 ModuleA.a)
+ * @return 成员表达式的类型;出错时类型降级为 int,并记录语义错误
*/
@Override
public Type analyze(Context ctx,
@@ -47,29 +54,41 @@ public class MemberExpressionAnalyzer implements ExpressionAnalyzer