feat: 添加成员表达式语义分析器

- 实现了 MemberExpressionAnalyzer 类,用于分析成员访问表达式
- 目前仅支持 ModuleName.constOrVar 形式的跨模块常量/全局变量访问
- 不支持对象成员访问,如 a.b.c- 类型降级为 int,后续由 IR 阶段进行常量折叠
This commit is contained in:
Luke 2025-08-26 11:52:47 +08:00
parent 06bb647c83
commit 0d6c6cef5a

View File

@ -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} 成员访问表达式的语义分析器
*
* <p>
* 当前实现仅支持 <code>ModuleName.constOrVar</code> 形式的跨模块常量 /
* 全局变量访问不支持对象成员 a.b.c
* </p>
*
* <ul>
* <li>示例ModuleA.a ModuleB.CONST_X</li>
* <li>仅检查模块是否存在且已导入类型降级为 int后续由 IR 阶段常量折叠</li>
* <li>暂不支持复杂的对象/类型成员访问</li>
* </ul>
*/
public class MemberExpressionAnalyzer implements ExpressionAnalyzer<MemberExpressionNode> {
/**
* 对成员访问表达式执行语义分析
*
* @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; // 语义降级
}
}