From 0d6c6cef5a450fa99e4929939e07a4f2816980d3 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 26 Aug 2025 11:52:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=88=90=E5=91=98?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=AF=AD=E4=B9=89=E5=88=86=E6=9E=90?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现了 MemberExpressionAnalyzer 类,用于分析成员访问表达式 - 目前仅支持 ModuleName.constOrVar 形式的跨模块常量/全局变量访问 - 不支持对象成员访问,如 a.b.c- 类型降级为 int,后续由 IR 阶段进行常量折叠 --- .../expression/MemberExpressionAnalyzer.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/main/java/org/jcnc/snow/compiler/semantic/analyzers/expression/MemberExpressionAnalyzer.java 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 new file mode 100644 index 0000000..a115e61 --- /dev/null +++ b/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/expression/MemberExpressionAnalyzer.java @@ -0,0 +1,75 @@ +package org.jcnc.snow.compiler.semantic.analyzers.expression; + +import org.jcnc.snow.compiler.parser.ast.FunctionNode; +import org.jcnc.snow.compiler.parser.ast.IdentifierNode; +import org.jcnc.snow.compiler.parser.ast.MemberExpressionNode; +import org.jcnc.snow.compiler.parser.ast.base.NodeContext; +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.SymbolTable; +import org.jcnc.snow.compiler.semantic.type.BuiltinType; +import org.jcnc.snow.compiler.semantic.type.Type; + +/** + * {@code MemberExpressionAnalyzer} – 成员访问表达式的语义分析器。 + * + *

+ * 当前实现仅支持 ModuleName.constOrVar 形式的跨模块常量 / + * 全局变量访问,不支持对象成员(如 a.b.c)。 + *

+ * + * + */ +public class MemberExpressionAnalyzer implements ExpressionAnalyzer { + + /** + * 对成员访问表达式执行语义分析。 + * + * @param ctx 全局语义上下文,包含模块表、错误收集等 + * @param mi 当前模块信息(含本模块名、已导入模块) + * @param fn 当前所在函数节点 + * @param locals 当前作用域符号表 + * @param expr 当前要分析的成员表达式(如 ModuleA.a) + * @return 分析推断得到的类型(目前恒定降级为 int),如有错误也会记录 + */ + @Override + public Type analyze(Context ctx, + ModuleInfo mi, + FunctionNode fn, + SymbolTable locals, + MemberExpressionNode expr) { + + ctx.log("检查成员访问: " + expr); + + /* ---------- 仅支持 ModuleName.member 形式 ---------- */ + if (expr.object() instanceof IdentifierNode(String mod, NodeContext _)) { + + // 1. 检查模块是否存在、且已在当前模块 import 或为本模块 + if (!ctx.getModules().containsKey(mod) + || (!mi.getImports().contains(mod) && !mi.getName().equals(mod))) { + ctx.getErrors().add(new SemanticError(expr, + "未知或未导入模块: " + mod)); + ctx.log("错误: 未导入模块 " + mod); + return BuiltinType.INT; // 语义降级:默认 int + } + + // 2. 目前不做类型精确推断。后续可解析目标模块 globals 获取精确类型。 + // 这里只做语法级校验,类型降级为 INT,由后续阶段折叠。 + return BuiltinType.INT; + } + + /* ---------- 其它对象成员(如 a.b.c)暂不支持 ---------- */ + ctx.getErrors().add(new SemanticError(expr, + "不支持的成员访问对象类型: " + + expr.object().getClass().getSimpleName())); + ctx.log("错误: 不支持的成员访问对象类型 " + + expr.object().getClass().getSimpleName()); + return BuiltinType.INT; // 语义降级 + } +}