From 258d1909e6b09ec07647f8e9ed4b21f9aa4e5e0d Mon Sep 17 00:00:00 2001
From: Luke
Date: Fri, 29 Aug 2025 17:50:58 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AF=AD=E4=B9=89=E5=88=86=E6=9E=90?=
=?UTF-8?q?=E6=94=AF=E6=8C=81=E7=BB=93=E6=9E=84=E4=BD=93=E6=88=90=E5=91=98?=
=?UTF-8?q?=E8=AE=BF=E9=97=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 新增对结构体实例成员和方法访问的支持
- 扩展跨模块成员访问,支持模块内的函数引用
- 优化了对成员访问表达式的处理逻辑,提高了类型推断的准确性和范围
- 修复了一些与成员访问相关的语义错误处理问题
---
.../expression/MemberExpressionAnalyzer.java | 170 +++++++++++++-----
1 file changed, 128 insertions(+), 42 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 5080545..4285893 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
@@ -11,39 +11,49 @@ 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.FunctionType;
+import org.jcnc.snow.compiler.semantic.type.StructType;
import org.jcnc.snow.compiler.semantic.type.Type;
/**
- * {@code MemberExpressionAnalyzer} 用于分析模块成员访问表达式的类型和语义。
+ * {@code MemberExpressionAnalyzer}
*
*
- * 当前实现支持 ModuleName.constOrVar 形式的跨模块常量/全局变量访问,
- * 能根据目标模块的全局符号表,返回准确的类型信息,完全支持跨模块类型推断。
- *
- * 对于非模块成员的访问(如对象.属性、多级 a.b.c),暂不支持,遇到时将报告语义错误。
+ * 负责成员访问表达式的语义分析与类型推断。
+ * 典型形如 a.b、this.x、Module.member。
*
*
*
- * 核心特性:
- *
- * - 校验模块是否存在、是否已导入(或自身);
- * - 跨模块访问目标模块的全局符号表,查找指定成员符号及其类型;
- * - 若成员不存在,报告“模块成员未定义”语义错误;
- * - 暂不支持更复杂的对象成员访问,遇到将报“不支持的成员访问对象类型”错误。
- *
+ * 支持三类成员访问方式:
*
+ *
+ * - 当前实例字段语法糖:如
this.x,等价于访问当前作用域下名为 x 的变量或字段。
+ * - 跨模块成员访问:如
ModuleName.member,常用于引用其他模块的全局变量、常量、函数等。
+ * - 结构体实例成员/方法访问:如
a.b 或 a.method,a 为结构体变量,b 为字段或方法。
+ *
*/
public class MemberExpressionAnalyzer implements ExpressionAnalyzer {
/**
- * 语义分析模块成员访问表达式。
+ * 分析成员表达式,并返回其类型(如字段类型、方法类型等)。
*
- * @param ctx 全局语义分析上下文,持有所有模块及错误记录
- * @param mi 当前模块信息(用于判断导入关系)
+ * @param ctx 全局语义分析上下文
+ * @param mi 当前模块信息
* @param fn 当前函数节点
- * @param locals 当前局部符号表
- * @param expr 当前要分析的成员表达式(如 ModuleA.a)
- * @return 成员表达式的类型;出错时类型降级为 int,并记录语义错误
+ * @param locals 局部符号表(当前作用域的变量、形参等)
+ * @param expr 当前成员访问表达式(形如 obj.member)
+ * @return 该表达式的推断类型,如失败则返回 {@link BuiltinType#INT}
+ *
+ *
+ * 主要处理流程分为四大分支:
+ *
+ * - this.x 语法糖(字段或变量访问)
+ * - ModuleName.member 跨模块成员访问
+ * - 结构体实例的成员/方法访问
+ * - 其它对象成员(不支持)
+ *
+ * 出错时会注册语义错误,返回 int 作为降级类型。
+ *
*/
@Override
public Type analyze(Context ctx,
@@ -54,41 +64,117 @@ public class MemberExpressionAnalyzer implements ExpressionAnalyzer