diff --git a/.run/Demo16.run.xml b/.run/Demo16.run.xml
new file mode 100644
index 0000000..049eba5
--- /dev/null
+++ b/.run/Demo16.run.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/playground/Demo/Demo16/Main.snow b/playground/Demo/Demo16/Main.snow
new file mode 100644
index 0000000..0211f2d
--- /dev/null
+++ b/playground/Demo/Demo16/Main.snow
@@ -0,0 +1,22 @@
+module: Main
+ import: os
+ function: main
+ return_type: int
+ body:
+ loop:
+ init:
+ declare i:int = 1
+ cond:
+ i <= 10
+ step:
+ i = i + 1
+ body:
+ if i % 2 == 0 then
+ print(i)
+ end if
+ end body
+ end loop
+ return 0
+ end body
+ end function
+end module
diff --git a/playground/Demo/Demo16/OS.snow b/playground/Demo/Demo16/OS.snow
new file mode 100644
index 0000000..6026d43
--- /dev/null
+++ b/playground/Demo/Demo16/OS.snow
@@ -0,0 +1,11 @@
+module: os
+ import: os
+ function: print
+ parameter:
+ declare i1: int
+ return_type: void
+ body:
+ syscall("PRINT",i1)
+ end body
+ end function
+end module
\ No newline at end of file
diff --git a/src/main/java/org/jcnc/snow/compiler/backend/utils/IROpCodeMapper.java b/src/main/java/org/jcnc/snow/compiler/backend/utils/IROpCodeMapper.java
index bb81d07..431484c 100644
--- a/src/main/java/org/jcnc/snow/compiler/backend/utils/IROpCodeMapper.java
+++ b/src/main/java/org/jcnc/snow/compiler/backend/utils/IROpCodeMapper.java
@@ -44,6 +44,7 @@ public final class IROpCodeMapper {
opcodeMap.put(IROpCode.MUL_B8, "B_MUL");
opcodeMap.put(IROpCode.DIV_B8, "B_DIV");
opcodeMap.put(IROpCode.NEG_B8, "B_NEG");
+ opcodeMap.put(IROpCode.MOD_B8, "B_MOD");
// 整形16位算术运算映射
opcodeMap.put(IROpCode.ADD_S16, "S_ADD");
@@ -51,6 +52,7 @@ public final class IROpCodeMapper {
opcodeMap.put(IROpCode.MUL_S16, "S_MUL");
opcodeMap.put(IROpCode.DIV_S16, "S_DIV");
opcodeMap.put(IROpCode.NEG_S16, "S_NEG");
+ opcodeMap.put(IROpCode.MOD_S16, "S_MOD");
// 整形32位算术运算映射
opcodeMap.put(IROpCode.ADD_I32, "I_ADD");
@@ -58,6 +60,7 @@ public final class IROpCodeMapper {
opcodeMap.put(IROpCode.MUL_I32, "I_MUL");
opcodeMap.put(IROpCode.DIV_I32, "I_DIV");
opcodeMap.put(IROpCode.NEG_I32, "I_NEG");
+ opcodeMap.put(IROpCode.MOD_I32, "I_MOD");
// 整形64位算术运算映射
opcodeMap.put(IROpCode.ADD_L64, "L_ADD");
@@ -65,6 +68,7 @@ public final class IROpCodeMapper {
opcodeMap.put(IROpCode.MUL_L64, "L_MUL");
opcodeMap.put(IROpCode.DIV_L64, "L_DIV");
opcodeMap.put(IROpCode.NEG_L64, "L_NEG");
+ opcodeMap.put(IROpCode.MOD_L64, "L_MOD");
// --- 32-bit floating point ---
@@ -73,6 +77,7 @@ public final class IROpCodeMapper {
opcodeMap.put(IROpCode.MUL_F32, "F_MUL");
opcodeMap.put(IROpCode.DIV_F32, "F_DIV");
opcodeMap.put(IROpCode.NEG_F32, "F_NEG");
+ opcodeMap.put(IROpCode.MOD_F32, "F_MOD");
// --- 64-bit floating point ---
opcodeMap.put(IROpCode.ADD_D64, "D_ADD");
@@ -80,6 +85,7 @@ public final class IROpCodeMapper {
opcodeMap.put(IROpCode.MUL_D64, "D_MUL");
opcodeMap.put(IROpCode.DIV_D64, "D_DIV");
opcodeMap.put(IROpCode.NEG_D64, "D_NEG");
+ opcodeMap.put(IROpCode.MOD_D64, "D_MOD");
// 比较运算映射
// 8位整数比较运算映射
diff --git a/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java
index 41342da..6dd7cfc 100644
--- a/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java
+++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java
@@ -25,11 +25,12 @@ public enum IROpCode {
/* ───── 算术运算(8位整数: byte)───── */
- ADD_B8, // 8位整型加法: a = b + c
- SUB_B8, // 8位整型减法: a = b - c
- MUL_B8, // 8位整型乘法: a = b * c
- DIV_B8, // 8位整型除法: a = b / c
- NEG_B8, // 8位整型取负: a = -b
+ ADD_B8, // 8位整型加法:
+ SUB_B8, // 8位整型减法:
+ MUL_B8, // 8位整型乘法:
+ DIV_B8, // 8位整型除法:
+ NEG_B8, // 8位整型取负:
+ MOD_B8, // 8位整型取余
/* ───── 算术运算(16位整数: short)───── */
ADD_S16, // 16位整型加法
@@ -37,6 +38,7 @@ public enum IROpCode {
MUL_S16, // 16位整型乘法
DIV_S16, // 16位整型除法
NEG_S16, // 16位整型取负
+ MOD_S16, // 16位整型取余
/* ───── 算术运算(32位整数: int)───── */
ADD_I32, // 32位整型加法
@@ -44,6 +46,7 @@ public enum IROpCode {
MUL_I32, // 32位整型乘法
DIV_I32, // 32位整型除法
NEG_I32, // 32位整型取负
+ MOD_I32, // 32位整型取余
/* ───── 算术运算(64位整数: long)───── */
ADD_L64, // 64位整型加法
@@ -51,6 +54,7 @@ public enum IROpCode {
MUL_L64, // 64位整型乘法
DIV_L64, // 64位整型除法
NEG_L64, // 64位整型取负
+ MOD_L64, // 64位整型取余
/* ───── 算术运算(32位浮点数: float)───── */
ADD_F32, // 32位浮点加法
@@ -58,6 +62,7 @@ public enum IROpCode {
MUL_F32, // 32位浮点乘法
DIV_F32, // 32位浮点除法
NEG_F32, // 32位浮点取负
+ MOD_F32, // 32位浮点取余
/* ───── 算术运算(64位浮点数: double)───── */
ADD_D64, // 64位浮点加法
@@ -65,6 +70,7 @@ public enum IROpCode {
MUL_D64, // 64位浮点乘法
DIV_D64, // 64位浮点除法
NEG_D64, // 64位浮点取负
+ MOD_D64, // 64位浮点取余
/* ───── 逻辑与比较运算指令(8位整数: byte) ───── */
CMP_BEQ, // 8位整数相等比较: a == b
diff --git a/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCodeMappings.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCodeMappings.java
index 92677a6..1b1695e 100644
--- a/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCodeMappings.java
+++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCodeMappings.java
@@ -6,97 +6,123 @@ import java.util.Map;
* 操作符与IR操作码映射表,统一管理所有类型的算术和比较操作映射。
*/
public final class IROpCodeMappings {
- private IROpCodeMappings() {} // 禁止实例化
-
// 8位整型运算符映射
public static final Map OP_B8 = Map.of(
- "+", IROpCode.ADD_B8, "-", IROpCode.SUB_B8,
- "*", IROpCode.MUL_B8, "/", IROpCode.DIV_B8
+ "+", IROpCode.ADD_B8,
+ "-", IROpCode.SUB_B8,
+ "*", IROpCode.MUL_B8,
+ "/", IROpCode.DIV_B8,
+ "%", IROpCode.MOD_B8
);
// 16位整型
public static final Map OP_S16 = Map.of(
- "+", IROpCode.ADD_S16, "-", IROpCode.SUB_S16,
- "*", IROpCode.MUL_S16, "/", IROpCode.DIV_S16
+ "+", IROpCode.ADD_S16,
+ "-", IROpCode.SUB_S16,
+ "*", IROpCode.MUL_S16,
+ "/", IROpCode.DIV_S16,
+ "%", IROpCode.MOD_S16
);
// 32位整型
public static final Map OP_I32 = Map.of(
- "+", IROpCode.ADD_I32, "-", IROpCode.SUB_I32,
- "*", IROpCode.MUL_I32, "/", IROpCode.DIV_I32
+ "+", IROpCode.ADD_I32,
+ "-", IROpCode.SUB_I32,
+ "*", IROpCode.MUL_I32,
+ "/", IROpCode.DIV_I32,
+ "%", IROpCode.MOD_I32
);
// 64位长整型
public static final Map OP_L64 = Map.of(
- "+", IROpCode.ADD_L64, "-", IROpCode.SUB_L64,
- "*", IROpCode.MUL_L64, "/", IROpCode.DIV_L64
+ "+", IROpCode.ADD_L64,
+ "-", IROpCode.SUB_L64,
+ "*", IROpCode.MUL_L64,
+ "/", IROpCode.DIV_L64,
+ "%", IROpCode.MOD_L64
);
// 32位浮点型
public static final Map OP_F32 = Map.of(
- "+", IROpCode.ADD_F32, "-", IROpCode.SUB_F32,
- "*", IROpCode.MUL_F32, "/", IROpCode.DIV_F32
+ "+", IROpCode.ADD_F32,
+ "-", IROpCode.SUB_F32,
+ "*", IROpCode.MUL_F32,
+ "/", IROpCode.DIV_F32,
+ "%", IROpCode.MOD_F32
);
// 64位双精度浮点型
public static final Map OP_D64 = Map.of(
- "+", IROpCode.ADD_D64, "-", IROpCode.SUB_D64,
- "*", IROpCode.MUL_D64, "/", IROpCode.DIV_D64
+ "+", IROpCode.ADD_D64,
+ "-", IROpCode.SUB_D64,
+ "*", IROpCode.MUL_D64,
+ "/", IROpCode.DIV_D64,
+ "%", IROpCode.MOD_D64
);
-
- /* ────── 比较运算符映射 ────── */
- /** 8-bit(byte)比较 */
+ /**
+ * 8-bit(byte)比较
+ */
public static final Map CMP_B8 = Map.of(
"==", IROpCode.CMP_BEQ,
"!=", IROpCode.CMP_BNE,
- "<", IROpCode.CMP_BLT,
- ">", IROpCode.CMP_BGT,
+ "<", IROpCode.CMP_BLT,
+ ">", IROpCode.CMP_BGT,
"<=", IROpCode.CMP_BLE,
">=", IROpCode.CMP_BGE
);
- /** 16-bit(short)比较 */
+ /* ────── 比较运算符映射 ────── */
+ /**
+ * 16-bit(short)比较
+ */
public static final Map CMP_S16 = Map.of(
"==", IROpCode.CMP_SEQ,
"!=", IROpCode.CMP_SNE,
- "<", IROpCode.CMP_SLT,
- ">", IROpCode.CMP_SGT,
+ "<", IROpCode.CMP_SLT,
+ ">", IROpCode.CMP_SGT,
"<=", IROpCode.CMP_SLE,
">=", IROpCode.CMP_SGE
);
-
- /** 32-bit(int)比较 */
+ /**
+ * 32-bit(int)比较
+ */
public static final Map CMP_I32 = Map.of(
"==", IROpCode.CMP_IEQ,
"!=", IROpCode.CMP_INE,
- "<", IROpCode.CMP_ILT,
- ">", IROpCode.CMP_IGT,
+ "<", IROpCode.CMP_ILT,
+ ">", IROpCode.CMP_IGT,
"<=", IROpCode.CMP_ILE,
">=", IROpCode.CMP_IGE
);
-
- /** 64-bit(long)比较 */
+ /**
+ * 64-bit(long)比较
+ */
public static final Map CMP_L64 = Map.of(
"==", IROpCode.CMP_LEQ,
"!=", IROpCode.CMP_LNE,
- "<", IROpCode.CMP_LLT,
- ">", IROpCode.CMP_LGT,
+ "<", IROpCode.CMP_LLT,
+ ">", IROpCode.CMP_LGT,
"<=", IROpCode.CMP_LLE,
">=", IROpCode.CMP_LGE
);
-
- /** 32-bit(float)比较 */
+ /**
+ * 32-bit(float)比较
+ */
public static final Map CMP_F32 = Map.of(
"==", IROpCode.CMP_FEQ,
"!=", IROpCode.CMP_FNE,
- "<", IROpCode.CMP_FLT,
- ">", IROpCode.CMP_FGT,
+ "<", IROpCode.CMP_FLT,
+ ">", IROpCode.CMP_FGT,
"<=", IROpCode.CMP_FLE,
">=", IROpCode.CMP_FGE
);
-
- /** 64-bit(double)比较 */
+ /**
+ * 64-bit(double)比较
+ */
public static final Map CMP_D64 = Map.of(
"==", IROpCode.CMP_DEQ,
"!=", IROpCode.CMP_DNE,
- "<", IROpCode.CMP_DLT,
- ">", IROpCode.CMP_DGT,
+ "<", IROpCode.CMP_DLT,
+ ">", IROpCode.CMP_DGT,
"<=", IROpCode.CMP_DLE,
">=", IROpCode.CMP_DGE
);
+
+ private IROpCodeMappings() {
+ } // 禁止实例化
}