Skip to content

Latest commit

 

History

History
528 lines (463 loc) · 8.27 KB

README_zh.md

File metadata and controls

528 lines (463 loc) · 8.27 KB

BUAA-SysY-Compiler-2022

注:BUAA课程组严查代码,本仓库代码仅供参考,请勿抄袭!

介绍

本项目为BUAA编译课程大作业——基于 MIPS 体系结构的 SysY 语言(C 语言的子集)的编译器。该编译器能将输入的 SysY 语言代码转化为能在 MARS 上运行的 MIPS 语言汇编代码。

使用

Windows 系统用户可在 GitHub Release 中下载 compiler.zip 压缩包文件,里面含有可执行文件 compiler.exe 和样例 SysY 语言源代码 testfile.txt ,在 cmd 中直接运行 compiler.exe

compiler.exe

该程序将 testfile.txt 中的 SysY 语言代码编译,将 MIPS 语言汇编代码输出到 mips.txt 中。

例子

testfile.txt 中的 SysY 语言代码如下:

int a,b,c,d,e,i=0;

int func0(int a,int b) {
    int i = 0;
    int c = 128;
    return (a+b)%c;
}

int func1(int a) {
    i = i + 1;
    return i;
}

int func2(int a,int b) {
    if (a % b == 0) {
        return 1;
    }
    return 0;
}

int func3() {
    printf("glo_i = %d\n",i);
    int tt0,tt1,t2,tt3,tt4,v=1906;
    while (i < 10000) {
        int v = a * 4 * 32 * a / a / 32;
        b = func0(b,v);
        tt0 = a*4 + b + c ;
        tt1 = a*4 + b + c + d;
        t2 = a*4 + b + c + d + e;
        tt3 = a*4 + b + c + d + e;
        tt4 = a*4 + b + c + d + e;
        if (func2(i,1000)) {
            printf("sum = %d\n", tt0 + tt1 + t2 + tt3 + tt4);
        }
        func1(i);
    }
    return tt0 + tt1 + t2 + tt3 + tt4;
}

int main() {
    int i = 0;
    a = getint();
    b = getint();
    c = getint();
    d = getint();
    e = getint();
    i = getint();
    printf("main_i = %d\n",i);
    printf("%d\n",func3());
    return 0;
}

运行 compiler.exe 后输出的 MIPS 代码如下:

.data 0x10010000
temp:  .space  160000


#a
global_var1: .word  0

#b
global_var2: .word  0

#c
global_var3: .word  0

#d
global_var4: .word  0

#e
global_var5: .word  0

#i
global_var6: .word  0

# string tokens: 
str_1:  .asciiz   "glo_i = "
str_3:  .asciiz   "\n"
str_4:  .asciiz   "sum = "
str_6:  .asciiz   "\n"
str_7:  .asciiz   "main_i = "
str_9:  .asciiz   "\n"
str_11:  .asciiz   "\n"


.text 0x00400000

# main function
# local var defition:
li $t0, 0
sw $t0, 268500992($zero)

li $v0, 5
syscall
la $t9, global_var1
sw $v0, 0($t9)

li $v0, 5
syscall
la $t9, global_var2
sw $v0, 0($t9)

li $v0, 5
syscall
la $t9, global_var3
sw $v0, 0($t9)

li $v0, 5
syscall
la $t9, global_var4
sw $v0, 0($t9)

li $v0, 5
syscall
la $t9, global_var5
sw $v0, 0($t9)

li $v0, 5
syscall
sw $v0, 268500992($zero)
la $a0, str_7
li $v0, 4
syscall
lw $a0, 268500992($zero)
li $v0, 1
syscall
la $a0, str_9
li $v0, 4
syscall


# Pushing Function Real Params:
addiu $sp, $sp, -30000
sw $ra, 0($sp)
# Call function!
jal Label_5
lw $ra, 0($sp)
# Pop params
addiu $sp, $sp, 30000

sw $v0, 268500996($zero)
lw $a0, 268500996($zero)
li $v0, 1
syscall
la $a0, str_11
li $v0, 4
syscall

li $v0, 10
syscall




# self defined functions

# ---------------- FUCNTION: func0 ------------------
Label_1:

# local var defition:
li $t0, 0
sw $t0, 12($sp)
# local var defition:
li $t0, 128
sw $t0, 16($sp)
lw $t0, 4($sp)
lw $t1, 8($sp)
addu $t2, $t0, $t1
sw $t2, 20($sp)
lw $t0, 20($sp)
lw $t1, 16($sp)
div $t0, $t1
mfhi $t2
sw $t2, 24($sp)
lw $v0, 24($sp)
jr $ra
jr $ra



# ---------------- FUCNTION: func1 ------------------
Label_2:

la $t0, global_var6
lw $t0, 0($t0)
li $t1, 1
addu $t2, $t0, $t1
sw $t2, 8($sp)
lw $t0, 8($sp)
la $t9, global_var6
sw $t0, 0($t9)
la $v0, global_var6
lw $v0, 0($v0)
jr $ra
jr $ra



# ---------------- FUCNTION: func3 ------------------
Label_5:

la $a0, str_1
li $v0, 4
syscall
la $a0, global_var6
lw $a0, 0($a0)
li $v0, 1
syscall
la $a0, str_3
li $v0, 4
syscall
# local var defition:
# local var defition:
# local var defition:
# local var defition:
# local var defition:
# local var defition:
li $t0, 1906
sw $t0, 24($sp)
Label_6:
la $t0, global_var6
lw $t0, 0($t0)
li $t1, 10000
slt $t2, $t0, $t1
sw $t2, 28($sp)
lw $t0, 28($sp)
beqz $t0, Label_7
la $t0, global_var1
lw $t0, 0($t0)
li $t1, 4
mul $t2, $t0, $t1
sw $t2, 32($sp)
lw $t0, 32($sp)
li $t1, 32
mul $t2, $t0, $t1
sw $t2, 36($sp)
lw $t0, 36($sp)
la $t1, global_var1
lw $t1, 0($t1)
mul $t2, $t0, $t1
sw $t2, 40($sp)
lw $t0, 40($sp)
la $t1, global_var1
lw $t1, 0($t1)
div $t0, $t1
mflo $t2
sw $t2, 44($sp)
lw $t0, 44($sp)
li $t1, 32
div $t0, $t1
mflo $t2
sw $t2, 48($sp)
# local var defition:
lw $t0, 48($sp)
sw $t0, 52($sp)


# Pushing Function Real Params:
addiu $sp, $sp, -30000
sw $ra, 0($sp)
la $t0, global_var2
lw $t0, 0($t0)
sw $t0, 4($sp)
lw $t0, 30052($sp)
sw $t0, 8($sp)
# Finished Pushing Params!
# Call function!
jal Label_1
lw $ra, 0($sp)
# Pop params
addiu $sp, $sp, 30000

sw $v0, 56($sp)
lw $t0, 56($sp)
la $t9, global_var2
sw $t0, 0($t9)
la $t0, global_var1
lw $t0, 0($t0)
li $t1, 4
mul $t2, $t0, $t1
sw $t2, 60($sp)
lw $t0, 60($sp)
la $t1, global_var2
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 64($sp)
lw $t0, 64($sp)
la $t1, global_var3
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 68($sp)
lw $t0, 68($sp)
sw $t0, 4($sp)
la $t0, global_var1
lw $t0, 0($t0)
li $t1, 4
mul $t2, $t0, $t1
sw $t2, 72($sp)
lw $t0, 72($sp)
la $t1, global_var2
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 76($sp)
lw $t0, 76($sp)
la $t1, global_var3
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 80($sp)
lw $t0, 80($sp)
la $t1, global_var4
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 84($sp)
lw $t0, 84($sp)
sw $t0, 8($sp)
la $t0, global_var1
lw $t0, 0($t0)
li $t1, 4
mul $t2, $t0, $t1
sw $t2, 88($sp)
lw $t0, 88($sp)
la $t1, global_var2
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 92($sp)
lw $t0, 92($sp)
la $t1, global_var3
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 96($sp)
lw $t0, 96($sp)
la $t1, global_var4
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 100($sp)
lw $t0, 100($sp)
la $t1, global_var5
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 104($sp)
lw $t0, 104($sp)
sw $t0, 12($sp)
la $t0, global_var1
lw $t0, 0($t0)
li $t1, 4
mul $t2, $t0, $t1
sw $t2, 108($sp)
lw $t0, 108($sp)
la $t1, global_var2
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 112($sp)
lw $t0, 112($sp)
la $t1, global_var3
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 116($sp)
lw $t0, 116($sp)
la $t1, global_var4
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 120($sp)
lw $t0, 120($sp)
la $t1, global_var5
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 124($sp)
lw $t0, 124($sp)
sw $t0, 16($sp)
la $t0, global_var1
lw $t0, 0($t0)
li $t1, 4
mul $t2, $t0, $t1
sw $t2, 128($sp)
lw $t0, 128($sp)
la $t1, global_var2
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 132($sp)
lw $t0, 132($sp)
la $t1, global_var3
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 136($sp)
lw $t0, 136($sp)
la $t1, global_var4
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 140($sp)
lw $t0, 140($sp)
la $t1, global_var5
lw $t1, 0($t1)
addu $t2, $t0, $t1
sw $t2, 144($sp)
lw $t0, 144($sp)
sw $t0, 20($sp)


# Pushing Function Real Params:
addiu $sp, $sp, -30000
sw $ra, 0($sp)
la $t0, global_var6
lw $t0, 0($t0)
sw $t0, 4($sp)
li $t0, 1000
sw $t0, 8($sp)
# Finished Pushing Params!
# Call function!
jal Label_3
lw $ra, 0($sp)
# Pop params
addiu $sp, $sp, 30000

sw $v0, 148($sp)
lw $t0, 148($sp)
beqz $t0, Label_8
lw $t0, 4($sp)
lw $t1, 8($sp)
addu $t2, $t0, $t1
sw $t2, 152($sp)
lw $t0, 152($sp)
lw $t1, 12($sp)
addu $t2, $t0, $t1
sw $t2, 156($sp)
lw $t0, 156($sp)
lw $t1, 16($sp)
addu $t2, $t0, $t1
sw $t2, 160($sp)
lw $t0, 160($sp)
lw $t1, 20($sp)
addu $t2, $t0, $t1
sw $t2, 164($sp)
la $a0, str_4
li $v0, 4
syscall
lw $a0, 164($sp)
li $v0, 1
syscall
la $a0, str_6
li $v0, 4
syscall
Label_8:


# Pushing Function Real Params:
addiu $sp, $sp, -30000
sw $ra, 0($sp)
la $t0, global_var6
lw $t0, 0($t0)
sw $t0, 4($sp)
# Finished Pushing Params!
# Call function!
jal Label_2
lw $ra, 0($sp)
# Pop params
addiu $sp, $sp, 30000

j Label_6
Label_7:
lw $t0, 4($sp)
lw $t1, 8($sp)
addu $t2, $t0, $t1
sw $t2, 168($sp)
lw $t0, 168($sp)
lw $t1, 12($sp)
addu $t2, $t0, $t1
sw $t2, 172($sp)
lw $t0, 172($sp)
lw $t1, 16($sp)
addu $t2, $t0, $t1
sw $t2, 176($sp)
lw $t0, 176($sp)
lw $t1, 20($sp)
addu $t2, $t0, $t1
sw $t2, 180($sp)
lw $v0, 180($sp)
jr $ra
jr $ra



# ---------------- FUCNTION: func2 ------------------
Label_3:

lw $t0, 4($sp)
lw $t1, 8($sp)
div $t0, $t1
mfhi $t2
sw $t2, 12($sp)
lw $t0, 12($sp)
li $t1, 0
seq $t2, $t0, $t1
sw $t2, 16($sp)
lw $t0, 16($sp)
beqz $t0, Label_4
li $v0, 1
jr $ra
Label_4:
li $v0, 0
jr $ra
jr $ra