// File: JameyWoo[P]csmile/analyze.cpp
// Function: checkNode(TreeNode*)
static void checkNode(TreeNode *t) {
    // symtabOut << t->nodekind << endl;
    // 添加对函数类型的生成
    // 由于是后序遍历, 函数的类型是最后检查的...
    if (t->nodekind == "FunDecl") {
        // error("func...");
        if (t->child[0]->nodekind == "int")
            t->type = "Integer";
        else if (t->child[0]->nodekind == "void")
            t->type = "Void";
    } else if (t->nodekind == "Id") {
        t->type = "Integer";
    } else if (t->nodekind == "CompareOp") {
        t->type = "Boolean";
    } else if (t->nodekind == "Const") {
        t->type = "Integer";
    } else if (t->nodekind == "MDOp") {
        if (t->child[0]->type == "Integer" && t->child[1]->type == "Integer") {
            t->type = "Integer";
        } else {
            typeError++;
            error("乘除类型错误");
        }
    } else if (t->nodekind == "PMOp") {
        if (t->child[0]->type == "Integer" && t->child[1]->type == "Integer") {
            t->type = "Integer";
        } else {
            typeError++;
            error("加减类型错误");
        }
    } else if (t->nodekind == "Input") {
        t->type = "Integer";
    }

    // 语句的类型判断
    if (t->nodekind == "Selection") {
        // if 选择
        if (t->child[0]->type != "Boolean") {
            typeError++;
            error("if 类型错误");
        } else {
            // symtabOut << "match" << endl;
        }
    } else if (t->nodekind == "Iteration") {
        // while 迭代
        if (t->child[0]->type != "Boolean") {
            typeError++;
            error("while 类型错误");
        }
    } else if (t->nodekind == "Assign") {
        if (t->child[1]->type != "Integer") {
            error("t->child[1]->nodekind" + t->child[1]->nodekind);
            if (t->child[1]->nodekind != "FunDecl") {
                typeError++;
                error("line " + to_string(t->line) + ": 赋值类型错误");
            }
        } else {
            t->type = "Integer";
        }
    }
    // symtabOut << "t->type = " << t->type << endl;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x170, %rsp            # imm = 0x170
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
leaq 0x12ae7(%rip), %rsi     # 0x21235
callq 0x5e70
testb $0x1, %al
jne 0xe759
jmp 0xe7c4
movq -0x8(%rbp), %rax
movq (%rax), %rdi
addq $0x30, %rdi
leaq 0x1298d(%rip), %rsi     # 0x210f8
callq 0x5e70
testb $0x1, %al
jne 0xe776
jmp 0xe78c
movq -0x8(%rbp), %rdi
addq $0x78, %rdi
leaq 0x12ca4(%rip), %rsi     # 0x21429
callq 0x33a0
jmp 0xe7bf
movq -0x8(%rbp), %rax
movq (%rax), %rdi
addq $0x30, %rdi
leaq 0x1295e(%rip), %rsi     # 0x210fc
callq 0x5e70
testb $0x1, %al
jne 0xe7a9
jmp 0xe7bd
movq -0x8(%rbp), %rdi
addq $0x78, %rdi
leaq 0x12c79(%rip), %rsi     # 0x21431
callq 0x33a0
jmp 0xe7bf
jmp 0xea8e
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
leaq 0x129d9(%rip), %rsi     # 0x211ac
callq 0x5e70
testb $0x1, %al
jne 0xe7de
jmp 0xe7f7
movq -0x8(%rbp), %rdi
addq $0x78, %rdi
leaq 0x12c3c(%rip), %rsi     # 0x21429
callq 0x33a0
jmp 0xea8c
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
leaq 0x1288b(%rip), %rsi     # 0x21091
callq 0x5e70
testb $0x1, %al
jne 0xe811
jmp 0xe82a
movq -0x8(%rbp), %rdi
addq $0x78, %rdi
leaq 0x12c5a(%rip), %rsi     # 0x2147a
callq 0x33a0
jmp 0xea8a
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
leaq 0x129b0(%rip), %rsi     # 0x211e9
callq 0x5e70
testb $0x1, %al
jne 0xe844
jmp 0xe85d
movq -0x8(%rbp), %rdi
addq $0x78, %rdi
leaq 0x12bd6(%rip), %rsi     # 0x21429
callq 0x33a0
jmp 0xea88
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
leaq 0x12983(%rip), %rsi     # 0x211ef
callq 0x5e70
testb $0x1, %al
jne 0xe87a
jmp 0xe95a
movq -0x8(%rbp), %rax
movq (%rax), %rdi
addq $0x78, %rdi
leaq 0x12b9d(%rip), %rsi     # 0x21429
callq 0x5e70
testb $0x1, %al
jne 0xe897
jmp 0xe8ce
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x78, %rdi
leaq 0x12b7f(%rip), %rsi     # 0x21429
callq 0x5e70
testb $0x1, %al
jne 0xe8b5
jmp 0xe8ce
movq -0x8(%rbp), %rdi
addq $0x78, %rdi
leaq 0x12b65(%rip), %rsi     # 0x21429
callq 0x33a0
jmp 0xe955
movl 0x20110(%rip), %eax     # 0x2e9e4
incl %eax
movl %eax, 0x20108(%rip)     # 0x2e9e4
leaq -0x29(%rbp), %rdi
movq %rdi, -0x140(%rbp)
callq 0x3480
movq -0x140(%rbp), %rdx
leaq 0x12b88(%rip), %rsi     # 0x21482
leaq -0x28(%rbp), %rdi
callq 0x4ef0
jmp 0xe905
leaq -0x28(%rbp), %rdi
callq 0x11010
jmp 0xe910
leaq -0x28(%rbp), %rdi
callq 0x34e8
leaq -0x29(%rbp), %rdi
callq 0x32d0
jmp 0xe955
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0xe947
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x34e8
leaq -0x29(%rbp), %rdi
callq 0x32d0
jmp 0xee0c
jmp 0xea86
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
leaq 0x1288b(%rip), %rsi     # 0x211f4
callq 0x5e70
testb $0x1, %al
jne 0xe977
jmp 0xea54
movq -0x8(%rbp), %rax
movq (%rax), %rdi
addq $0x78, %rdi
leaq 0x12aa0(%rip), %rsi     # 0x21429
callq 0x5e70
testb $0x1, %al
jne 0xe994
jmp 0xe9cb
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x78, %rdi
leaq 0x12a82(%rip), %rsi     # 0x21429
callq 0x5e70
testb $0x1, %al
jne 0xe9b2
jmp 0xe9cb
movq -0x8(%rbp), %rdi
addq $0x78, %rdi
leaq 0x12a68(%rip), %rsi     # 0x21429
callq 0x33a0
jmp 0xea52
movl 0x20013(%rip), %eax     # 0x2e9e4
incl %eax
movl %eax, 0x2000b(%rip)     # 0x2e9e4
leaq -0x61(%rbp), %rdi
movq %rdi, -0x148(%rbp)
callq 0x3480
movq -0x148(%rbp), %rdx
leaq 0x12a9e(%rip), %rsi     # 0x21495
leaq -0x60(%rbp), %rdi
callq 0x4ef0
jmp 0xea02
leaq -0x60(%rbp), %rdi
callq 0x11010
jmp 0xea0d
leaq -0x60(%rbp), %rdi
callq 0x34e8
leaq -0x61(%rbp), %rdi
callq 0x32d0
jmp 0xea52
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0xea44
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x60(%rbp), %rdi
callq 0x34e8
leaq -0x61(%rbp), %rdi
callq 0x32d0
jmp 0xee0c
jmp 0xea84
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
leaq 0x12796(%rip), %rsi     # 0x211f9
callq 0x5e70
testb $0x1, %al
jne 0xea6e
jmp 0xea82
movq -0x8(%rbp), %rdi
addq $0x78, %rdi
leaq 0x129ac(%rip), %rsi     # 0x21429
callq 0x33a0
jmp 0xea84
jmp 0xea86
jmp 0xea88
jmp 0xea8a
jmp 0xea8c
jmp 0xea8e
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
leaq 0x12724(%rip), %rsi     # 0x211c1
callq 0x5e70
testb $0x1, %al
jne 0xeaab
jmp 0xeb6e
movq -0x8(%rbp), %rax
movq (%rax), %rdi
addq $0x78, %rdi
leaq 0x129bd(%rip), %rsi     # 0x2147a
callq 0xdad0
testb $0x1, %al
jne 0xeacb
jmp 0xeb67
movl 0x1ff13(%rip), %eax     # 0x2e9e4
incl %eax
movl %eax, 0x1ff0b(%rip)     # 0x2e9e4
leaq -0x89(%rbp), %rdi
movq %rdi, -0x150(%rbp)
callq 0x3480
movq -0x150(%rbp), %rdx
leaq 0x129ae(%rip), %rsi     # 0x214a8
leaq -0x88(%rbp), %rdi
callq 0x4ef0
jmp 0xeb08
leaq -0x88(%rbp), %rdi
callq 0x11010
jmp 0xeb16
leaq -0x88(%rbp), %rdi
callq 0x34e8
leaq -0x89(%rbp), %rdi
callq 0x32d0
jmp 0xeb69
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0xeb56
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x34e8
leaq -0x89(%rbp), %rdi
callq 0x32d0
jmp 0xee0c
jmp 0xeb69
jmp 0xee03
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
leaq 0x1264e(%rip), %rsi     # 0x211cb
callq 0x5e70
testb $0x1, %al
jne 0xeb8b
jmp 0xec4c
movq -0x8(%rbp), %rax
movq (%rax), %rdi
addq $0x78, %rdi
leaq 0x128dd(%rip), %rsi     # 0x2147a
callq 0xdad0
testb $0x1, %al
jne 0xebab
jmp 0xec47
movl 0x1fe33(%rip), %eax     # 0x2e9e4
incl %eax
movl %eax, 0x1fe2b(%rip)     # 0x2e9e4
leaq -0xb1(%rbp), %rdi
movq %rdi, -0x158(%rbp)
callq 0x3480
movq -0x158(%rbp), %rdx
leaq 0x128de(%rip), %rsi     # 0x214b8
leaq -0xb0(%rbp), %rdi
callq 0x4ef0
jmp 0xebe8
leaq -0xb0(%rbp), %rdi
callq 0x11010
jmp 0xebf6
leaq -0xb0(%rbp), %rdi
callq 0x34e8
leaq -0xb1(%rbp), %rdi
callq 0x32d0
jmp 0xec47
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0xec36
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0xb0(%rbp), %rdi
callq 0x34e8
leaq -0xb1(%rbp), %rdi
callq 0x32d0
jmp 0xee0c
jmp 0xee01
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
leaq 0x125d3(%rip), %rsi     # 0x2122e
callq 0x5e70
testb $0x1, %al
jne 0xec69
jmp 0xedff
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x78, %rdi
leaq 0x127ad(%rip), %rsi     # 0x21429
callq 0xdad0
testb $0x1, %al
jne 0xec8a
jmp 0xede9
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdx
addq $0x30, %rdx
leaq 0x1282e(%rip), %rsi     # 0x214cb
leaq -0xd8(%rbp), %rdi
movq %rdi, -0x160(%rbp)
callq 0x10740
movq -0x160(%rbp), %rdi
callq 0x11010
jmp 0xecbe
leaq -0xd8(%rbp), %rdi
callq 0x34e8
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x30, %rdi
leaq 0x12558(%rip), %rsi     # 0x21235
callq 0xdad0
testb $0x1, %al
jne 0xeceb
jmp 0xede7
movl 0x1fcf3(%rip), %eax     # 0x2e9e4
incl %eax
movl %eax, 0x1fceb(%rip)     # 0x2e9e4
movq -0x8(%rbp), %rax
movl 0x50(%rax), %esi
leaq -0x138(%rbp), %rdi
movq %rdi, -0x168(%rbp)
callq 0xf460
movq -0x168(%rbp), %rdx
leaq 0x12715(%rip), %rsi     # 0x21436
leaq -0x118(%rbp), %rdi
callq 0xf410
jmp 0xed2f
leaq 0x127ab(%rip), %rdx     # 0x214e1
leaq -0xf8(%rbp), %rdi
leaq -0x118(%rbp), %rsi
callq 0xf3c0
jmp 0xed4b
leaq -0xf8(%rbp), %rdi
callq 0x11010
jmp 0xed59
leaq -0xf8(%rbp), %rdi
callq 0x34e8
leaq -0x118(%rbp), %rdi
callq 0x34e8
leaq -0x138(%rbp), %rdi
callq 0x34e8
jmp 0xede7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0xd8(%rbp), %rdi
callq 0x34e8
jmp 0xee0c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0xedd9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0xedcd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0xf8(%rbp), %rdi
callq 0x34e8
leaq -0x118(%rbp), %rdi
callq 0x34e8
leaq -0x138(%rbp), %rdi
callq 0x34e8
jmp 0xee0c
jmp 0xedfd
movq -0x8(%rbp), %rdi
addq $0x78, %rdi
leaq 0x12631(%rip), %rsi     # 0x21429
callq 0x33a0
jmp 0xedff
jmp 0xee01
jmp 0xee03
addq $0x170, %rsp            # imm = 0x170
popq %rbp
retq
movq -0x38(%rbp), %rdi
callq 0x3470
nopw %cs:(%rax,%rax)
nop