docs: 优化 ComparisonUtils 的代码注释

This commit is contained in:
Luke 2025-07-11 10:00:11 +08:00
parent 82069629dd
commit 81ca858cc1

View File

@ -10,36 +10,46 @@ import org.jcnc.snow.compiler.parser.ast.base.NodeContext;
import java.util.Map; import java.util.Map;
/** /**
* 比较运算辅助工具 * 工具类用于比较运算相关的类型推断和指令选择
* 根据左右操作数类型目前通过字面量后缀 <code>L/l</code> 判定选择 * <p>
* 正确的 IR 比较指令保证 int/long 均能正常运行 * 该类主要用于根据左右操作数的静态类型自动选择正确的 IR 层比较操作码
* 支持自动类型提升保证 intlongfloatdouble 等类型的比较均能得到正确的 IR 指令
* </p>
*
* 类型判定支持
* <ul>
* <li>字面量后缀支持 B/S/I/L/F/D大小写均可</li>
* <li>浮点数支持如无后缀但有小数点视为 double</li>
* <li>变量类型根据传入变量表推断类型未识别则默认 int</li>
* </ul>
*/ */
public final class ComparisonUtils { public final class ComparisonUtils {
private ComparisonUtils() { private ComparisonUtils() {}
}
/** /**
* 判断给定操作符是否为比较运算符 * 判断给定字符串是否为受支持的比较运算符==, !=, <, >, <=, >=
* 仅检查 int 类型指令表因所有类型的比较符号集合相同
*
* @param op 比较运算符字符串
* @return 若为比较运算符返回 true否则返回 false
*/ */
public static boolean isComparisonOperator(String op) { public static boolean isComparisonOperator(String op) {
// 两张表 key 完全一致只需检查一张 // 只需查 int 类型表即可
return IROpCodeMappings.CMP_I32.containsKey(op); return IROpCodeMappings.CMP_I32.containsKey(op);
} }
/** /**
* <b>类型宽度优先级</b>D > F > L > I > S > B * 返回类型宽度优先级越大代表类型越宽类型对应的优先级
* <ul> * - D (double): 6
* <li>Ddouble6</li> * - F (float): 5
* <li>Ffloat5</li> * - L (long): 4
* <li>Llong4</li> * - I (int): 3
* <li>Iint3</li> * - S (short): 2
* <li>Sshort2</li> * - B (byte): 1
* <li>Bbyte1</li> * - 未知类型: 0
* <li>未识别类型0</li>
* </ul>
* *
* @param p 类型标记字符 * @param p 类型标记字符
* @return 优先级数值越大类型越宽 * @return 类型优先级数值
*/ */
private static int rank(char p) { private static int rank(char p) {
return switch (p) { return switch (p) {
@ -54,23 +64,28 @@ public final class ComparisonUtils {
} }
/** /**
* 返回更的公共类型即优先级高的类型 * 返回两个类型中较的类型即优先级较高的类型
* 若优先级相等返回第一个参数的类型
* *
* @param a 类型标记字符 1 * @param a 类型标记字符1
* @param b 类型标记字符 2 * @param b 类型标记字符2
* @return 宽度更高的类型标记字符 * @return 宽度更高的类型字符
*/ */
public static char promote(char a, char b) { public static char promote(char a, char b) {
return rank(a) >= rank(b) ? a : b; return rank(a) >= rank(b) ? a : b;
} }
/** /**
* 返回符合操作数位宽的比较 IROpCode * 根据变量类型映射和操作数表达式推断操作数类型
* 并自动类型提升后选择正确的比较操作码IROpCode
* 若未能推断类型或操作符不受支持会抛出异常
* *
* @param variables 变量->类型的映射 * @param variables 变量名到类型的映射 "a" -> "int"
* @param op 比较符号==, !=, <, >, <=, >= * @param op 比较符号==, !=, <, >, <=, >=
* @param left 左操作数 AST * @param left 左操作数表达式
* @param right 右操作数 AST * @param right 右操作数表达式
* @return 适用的比较 IROpCode
* @throws IllegalStateException 如果无法推断合适的类型
*/ */
public static IROpCode cmpOp(Map<String, String> variables, String op, ExpressionNode left, ExpressionNode right) { public static IROpCode cmpOp(Map<String, String> variables, String op, ExpressionNode left, ExpressionNode right) {
char typeLeft = analysisType(variables, left); char typeLeft = analysisType(variables, left);
@ -84,14 +99,21 @@ public final class ComparisonUtils {
case 'L' -> IROpCodeMappings.CMP_L64; case 'L' -> IROpCodeMappings.CMP_L64;
case 'F' -> IROpCodeMappings.CMP_F32; case 'F' -> IROpCodeMappings.CMP_F32;
case 'D' -> IROpCodeMappings.CMP_D64; case 'D' -> IROpCodeMappings.CMP_D64;
default -> throw new IllegalStateException("意外的值: " + type); default -> throw new IllegalStateException("Unexpected value: " + type);
}; };
return table.get(op); return table.get(op);
} }
/* ------------ 内部工具 ------------ */ /**
* 内部工具方法根据表达式节点和变量表推断类型标记字符
* 字面量支持 B/S/I/L/F/D大小写均可浮点数默认 double
* 标识符类型按变量表映射未知则默认 int
*
* @param variables 变量名到类型的映射
* @param node 表达式节点
* @return 类型标记字符B/S/I/L/F/D未知时返回 I
*/
private static char analysisType(Map<String, String> variables, ExpressionNode node) { private static char analysisType(Map<String, String> variables, ExpressionNode node) {
if (node instanceof NumberLiteralNode(String value, NodeContext _)) { if (node instanceof NumberLiteralNode(String value, NodeContext _)) {
char suffix = Character.toUpperCase(value.charAt(value.length() - 1)); char suffix = Character.toUpperCase(value.charAt(value.length() - 1));
@ -101,33 +123,21 @@ public final class ComparisonUtils {
if (value.indexOf('.') != -1) { if (value.indexOf('.') != -1) {
return 'D'; return 'D';
} }
return 'I'; // 默认 int
return 'I'; // 默认为 'I'
} }
if (node instanceof IdentifierNode(String name, NodeContext _)) { if (node instanceof IdentifierNode(String name, NodeContext _)) {
final String type = variables.get(name); final String type = variables.get(name);
switch (type) { if (type != null) {
case "byte" -> { switch (type) {
return 'B'; case "byte": return 'B';
} case "short": return 'S';
case "short" -> { case "int": return 'I';
return 'S'; case "long": return 'L';
} case "float": return 'F';
case "int" -> { case "double": return 'D';
return 'I';
}
case "long" -> {
return 'L';
}
case "float" -> {
return 'F';
}
case "double" -> {
return 'D';
} }
} }
} }
return 'I'; // 默认 int
return 'I'; // 默认为 'I'
} }
} }