// File: baziotis[P]minijava-cpp/tokens.cpp
// Function: token_name(TOK)
const char* token_name(TOK tok) {
    switch (tok) {
    case TOK::EOI: return "End of Input";
    case TOK::LPAR: return "(";
    case TOK::RPAR: return ")";
    case TOK::LBRACE: return "{";
    case TOK::RBRACE: return "}";
    case TOK::LBRACKET: return "[";
    case TOK::RBRACKET: return "]";
    case TOK::COMMA: return ",";
    case TOK::DOT: return ".";
    case TOK::SEMI: return ";";
    case TOK::INTLIT: return "IntegerLiteral";
    case TOK::ID: return "Identifier";
    case TOK::NOT: return "!";
    case TOK::STAR: return"*";
    case TOK::PLUS: return "+";
    case TOK::MINUS: return "-";
    case TOK::LT: return "<";
    case TOK::AND_AND: return "&&";
    case TOK::ASGN: return "=";

    case TOK::PUBLIC: return "public";
    case TOK::STATIC: return "static";
    case TOK::VOID: return "void";
    case TOK::STRING: return "String";
    case TOK::TRUE: return "true";
    case TOK::FALSE: return "false";
    case TOK::THIS: return "this";
    case TOK::NEW: return "new";
    case TOK::CLASS: return "class";
    case TOK::EXTENDS: return "extewnds";
    
    case TOK::INT: return "int";
    case TOK::BOOLEAN: return "boolean";
    case TOK::ELSE: return "else";
    case TOK::IF: return "if";
    case TOK::PRINT: return "System.out.println";
    case TOK::RETURN: return "return";
    case TOK::WHILE: return "while";
    default: assert(0);
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movl %edi, -0xc(%rbp)
movl -0xc(%rbp), %eax
decl %eax
movl %eax, %ecx
movq %rcx, -0x18(%rbp)
subl $0x23, %eax
ja 0xbd9b
movq -0x18(%rbp), %rax
leaq 0xf9e2(%rip), %rcx      # 0x1b54c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0xfa62(%rip), %rax      # 0x1b5dc
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xfd38(%rip), %rax      # 0x1b8c2
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0x100e2(%rip), %rax     # 0x1bc7c
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xfa3f(%rip), %rax      # 0x1b5e9
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xfa31(%rip), %rax      # 0x1b5eb
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xfa23(%rip), %rax      # 0x1b5ed
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0x1110a(%rip), %rax     # 0x1cce4
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xfa05(%rip), %rax      # 0x1b5ef
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xe071(%rip), %rax      # 0x19c6b
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf9e7(%rip), %rax      # 0x1b5f1
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xd5e3(%rip), %rax      # 0x191fd
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xd5c8(%rip), %rax      # 0x191f2
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf9b9(%rip), %rax      # 0x1b5f3
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xe229(%rip), %rax      # 0x19e73
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xe234(%rip), %rax      # 0x19e8e
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xd542(%rip), %rax      # 0x191ac
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf97b(%rip), %rax      # 0x1b5f5
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf96d(%rip), %rax      # 0x1b5f7
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf960(%rip), %rax      # 0x1b5fa
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf952(%rip), %rax      # 0x1b5fc
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf949(%rip), %rax      # 0x1b603
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf940(%rip), %rax      # 0x1b60a
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf935(%rip), %rax      # 0x1b60f
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xecb9(%rip), %rax      # 0x1a9a3
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xeca3(%rip), %rax      # 0x1a99d
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf90c(%rip), %rax      # 0x1b616
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf901(%rip), %rax      # 0x1b61b
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0x1013f(%rip), %rax     # 0x1be69
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf8e5(%rip), %rax      # 0x1b61f
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xd68f(%rip), %rax      # 0x193d6
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xd686(%rip), %rax      # 0x193da
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf8c7(%rip), %rax      # 0x1b628
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf8bf(%rip), %rax      # 0x1b62d
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xe0c9(%rip), %rax      # 0x19e44
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf8a8(%rip), %rax      # 0x1b630
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xf8a2(%rip), %rax      # 0x1b637
movq %rax, -0x8(%rbp)
jmp 0xbdba
leaq 0xfbe0(%rip), %rdi      # 0x1b982
leaq 0xf894(%rip), %rsi      # 0x1b63d
movl $0x2d, %edx
leaq 0xf893(%rip), %rcx      # 0x1b648
callq 0x20d0
movq -0x8(%rbp), %rax
addq $0x20, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nop