// File: protonpopsicle[P]lang/src/compiler/Parser.cpp
// Function: Parser::factor()
char Parser::factor() {
    int x;
    std::string s;
    
    switch (look.tag) {
        // factor -> true
        case TRUE:
            move();
            return byteCoder->makeBool(1);
        // factor -> false
        case FALSE:
            move();
            return byteCoder->makeBool(0);
        // factor -> int
        case NUM:
            x = look.val;
            move();
            return byteCoder->makeInt(x);
        // factor -> string
        case QUOTE:
            s = look.lexeme;
            move();
            return byteCoder->makeString(s);
        // factor -> id
        case ID:
            s = look.lexeme;
            move();
            return byteCoder->getVar(s);
    }
    throw Error("expected datatype");
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x100, %rsp            # imm = 0x100
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xc0(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x22f0
movq -0xc0(%rbp), %rax
movswl 0x18(%rax), %eax
addl $0xffffff00, %eax       # imm = 0xFFFFFF00
movl %eax, %ecx
movq %rcx, -0xb8(%rbp)
subl $0x5, %eax
ja 0x9b74
movq -0xb8(%rbp), %rax
leaq 0x4895(%rip), %rcx      # 0xe1f8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0xc0(%rbp), %rdi
callq 0x8e50
jmp 0x997a
movq -0xc0(%rbp), %rax
movq 0x10(%rax), %rdi
movl $0x1, %esi
callq 0x2640
movb %al, -0xc1(%rbp)
jmp 0x9997
movb -0xc1(%rbp), %al
movb %al, -0x1(%rbp)
movl $0x1, -0x48(%rbp)
jmp 0x9c3e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x9c53
movq -0xc0(%rbp), %rdi
callq 0x8e50
jmp 0x99cb
movq -0xc0(%rbp), %rax
movq 0x10(%rax), %rdi
xorl %esi, %esi
callq 0x2640
movb %al, -0xc2(%rbp)
jmp 0x99e5
movb -0xc2(%rbp), %al
movb %al, -0x1(%rbp)
movl $0x1, -0x48(%rbp)
jmp 0x9c3e
movq -0xc0(%rbp), %rdi
movl 0x1c(%rdi), %eax
movl %eax, -0x14(%rbp)
callq 0x8e50
jmp 0x9a0e
movq -0xc0(%rbp), %rax
movq 0x10(%rax), %rdi
movl -0x14(%rbp), %esi
callq 0x2670
movb %al, -0xc3(%rbp)
jmp 0x9a29
movb -0xc3(%rbp), %al
movb %al, -0x1(%rbp)
movl $0x1, -0x48(%rbp)
jmp 0x9c3e
movq -0xc0(%rbp), %rsi
addq $0x20, %rsi
leaq -0x38(%rbp), %rdi
callq 0x2050
jmp 0x9a54
movq -0xc0(%rbp), %rdi
callq 0x8e50
jmp 0x9a62
movq -0xc0(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0xd0(%rbp)
leaq -0x68(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x2100
jmp 0x9a83
movq -0xd0(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0x26a0
movb %al, -0xd1(%rbp)
jmp 0x9a9b
movb -0xd1(%rbp), %al
movb %al, -0x1(%rbp)
leaq -0x68(%rbp), %rdi
callq 0x2160
movl $0x1, -0x48(%rbp)
jmp 0x9c3e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x68(%rbp), %rdi
callq 0x2160
jmp 0x9c53
movq -0xc0(%rbp), %rsi
addq $0x20, %rsi
leaq -0x38(%rbp), %rdi
callq 0x2050
jmp 0x9ae9
movq -0xc0(%rbp), %rdi
callq 0x8e50
jmp 0x9af7
movq -0xc0(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0xe0(%rbp)
leaq -0x88(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x2100
jmp 0x9b1b
movq -0xe0(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x26f0
movb %al, -0xe1(%rbp)
jmp 0x9b36
movb -0xe1(%rbp), %al
movb %al, -0x1(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x2160
movl $0x1, -0x48(%rbp)
jmp 0x9c3e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x2160
jmp 0x9c53
movb $0x1, -0xaa(%rbp)
movl $0x20, %edi
callq 0x2120
movq %rax, -0xf8(%rbp)
leaq -0xa9(%rbp), %rdi
movq %rdi, -0xf0(%rbp)
callq 0x23a0
movq -0xf0(%rbp), %rdx
leaq 0x4663(%rip), %rsi      # 0xe210
leaq -0xa8(%rbp), %rdi
callq 0x3880
jmp 0x9bbb
movq -0xf8(%rbp), %rdi
leaq -0xa8(%rbp), %rsi
callq 0x6400
jmp 0x9bd0
movq -0xf8(%rbp), %rdi
movb $0x0, -0xaa(%rbp)
leaq 0xb1cb(%rip), %rsi      # 0x14db0
leaq -0x62bc(%rip), %rdx     # 0x3930
callq 0x2370
jmp 0x9c65
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x9c19
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0xa8(%rbp), %rdi
callq 0x2160
leaq -0xa9(%rbp), %rdi
callq 0x2270
testb $0x1, -0xaa(%rbp)
jne 0x9c30
jmp 0x9c3c
movq -0xf8(%rbp), %rdi
callq 0x21b0
jmp 0x9c53
leaq -0x38(%rbp), %rdi
callq 0x2160
movb -0x1(%rbp), %al
addq $0x100, %rsp            # imm = 0x100
popq %rbp
retq
leaq -0x38(%rbp), %rdi
callq 0x2160
movq -0x40(%rbp), %rdi
callq 0x2390
nopw %cs:(%rax,%rax)
nop