diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/expression/BinaryExpressionAnalyzer.java b/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/expression/BinaryExpressionAnalyzer.java
index 6513427..138dcfe 100644
--- a/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/expression/BinaryExpressionAnalyzer.java
+++ b/src/main/java/org/jcnc/snow/compiler/semantic/analyzers/expression/BinaryExpressionAnalyzer.java
@@ -11,34 +11,9 @@ import org.jcnc.snow.compiler.semantic.type.BuiltinType;
import org.jcnc.snow.compiler.semantic.type.Type;
/**
- * 二元表达式分析器:负责对形如 left op right 的表达式进行类型推导和类型检查。
- *
- * 支持以下运算符: - *
+:如果任一操作数为 {@link BuiltinType#STRING},则结果为字符串拼接,否则如果都是整数则结果为整数-, *, /, %:要求两个操作数都是整数,结果为整数<, <=, >, >=, ==, !=:
- * 要求两个操作数都是整数,结果为整数(表示真假)callee(arg1, arg2, ...) 形式的调用进行
- * 语义检查和类型推导。
- * - * 支持两种调用方式: + * 语义检查和类型推导,并支持: *
ModuleName.func(...),要求模块已注册且已导入,或与当前模块同名func(...)- * 分析内容包括: - *
- * 分析步骤: - *
- * 分析流程: - *
* 枚举值: *
- * 本枚举实现了 {@link Type} 接口,提供了基本的类型兼容性判断和 - * 友好的字符串表示方法。 + * 本枚举实现了 {@link Type} 接口,提供了数值宽化和兼容性判断。 */ public enum BuiltinType implements Type { - /** 整数类型(32 位) */ - INT, - /** 长整数类型(64 位) */ - LONG, - /** 短整数类型(16 位) */ - SHORT, - /** 字节类型(8 位) */ BYTE, - /** 单精度浮点数 */ + SHORT, + INT, + LONG, FLOAT, - /** 双精度浮点数 */ DOUBLE, - /** 字符串类型 */ STRING, - /** 空类型,通常用于无返回值的函数 */ VOID; /** * 判断当前类型是否与另一个类型兼容。 *
- * 兼容条件:两个类型实例必须相同(同一枚举常量)。 + * 兼容条件: + *
- * 例如:{@link #INT} 返回 {@code "int"};{@link #VOID} 返回 {@code "void"}。 + * 判断是否为数值类型(byte、short、int、long、float、double)。 * - * @return 当前类型的小写字符串表示 + * @return 如果是数值类型返回 true,否则 false + */ + @Override + public boolean isNumeric() { + switch (this) { + case BYTE, SHORT, INT, LONG, FLOAT, DOUBLE: + return true; + default: + return false; + } + } + + /** + * 小写形式的类型名称,便于日志和错误输出。 + * + * @return 小写的类型名称 */ @Override public String toString() { diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/type/Type.java b/src/main/java/org/jcnc/snow/compiler/semantic/type/Type.java index d33c15d..7b37cad 100644 --- a/src/main/java/org/jcnc/snow/compiler/semantic/type/Type.java +++ b/src/main/java/org/jcnc/snow/compiler/semantic/type/Type.java @@ -1,3 +1,4 @@ +// File: src/main/java/org/jcnc/snow/compiler/semantic/type/Type.java package org.jcnc.snow.compiler.semantic.type; /** @@ -7,16 +8,44 @@ package org.jcnc.snow.compiler.semantic.type; public interface Type { /** * 判断当前类型是否与另一个类型兼容。 - *
- * 例如: - *
+ * 默认实现返回 false,BuiltinType 会覆盖此方法。 + * + * @return 如果是数值类型则返回 true,否则返回 false + */ + default boolean isNumeric() { + return false; + } + + /** + * 对两个数值类型执行宽化转换,返回“更宽”的那个类型。 + *
+ * 若 a 和 b 都是数值类型,则按 byte→short→int→long→float→double 顺序选更宽的类型; + * 否则返回 null。 + * + * @param a 第一个类型 + * @param b 第二个类型 + * @return 两者中更宽的数值类型,或 null + */ + static Type widen(Type a, Type b) { + if (!(a.isNumeric() && b.isNumeric())) return null; + var order = java.util.List.of( + BuiltinType.BYTE, + BuiltinType.SHORT, + BuiltinType.INT, + BuiltinType.LONG, + BuiltinType.FLOAT, + BuiltinType.DOUBLE + ); + int ia = order.indexOf(a), ib = order.indexOf(b); + return order.get(Math.max(ia, ib)); + } } diff --git a/test b/test index d53221d..9026fa6 100644 --- a/test +++ b/test @@ -4,7 +4,7 @@ module: CommonTasks return num1 + num2 end body parameter: - declare num1: double + declare num1: int declare num2: int return_type: int end function @@ -93,7 +93,9 @@ module: MainModule declare sum: int = CommonTasks.add_numbers(i, 10) declare squared: int = MathUtils.square_number(sum) - BuiltinUtils.print(" i+10 squared = " + BuiltinUtils.to_string(squared)) + BuiltinUtils.print("i+10 squared = " + BuiltinUtils.to_string(squared)) + BuiltinUtils.print(1+1.1) + end body end loop