// File: /workspace/github_c_makefile_star2_O2/yutopp[P]cc/lexer.c
// Function: lexer_read
Token lexer_read(Lexer* lex) {
    for(;;) {
        lex->begin_pos = lex->current_pos;

        char c0 = current(lex);
        switch(c0) {
        case ' ':
        case '\t':
        case '\n':
            skip(lex);
            continue;

        case 'A' ... 'Z':
        case 'a' ... 'z':
            skip(lex);
            return read_id(lex);

        case '0' ... '9':
            skip(lex);
            return read_number_lit(lex);

        case '"':
            skip(lex);
            return read_string_lit(lex);

        case '\'':
            skip(lex);
            return read_char_lit(lex);

        case '#':
            skip(lex);
            return make_token(lex, TOK_KIND_SHARP);

        case '>':
            skip(lex);
            return make_token(lex, TOK_KIND_GT);

        case '<':
            skip(lex);
            return make_token(lex, TOK_KIND_LT);

        case '(':
            skip(lex);
            return make_token(lex, TOK_KIND_LPAREN);

        case ')':
            skip(lex);
            return make_token(lex, TOK_KIND_RPAREN);

        case '[':
            skip(lex);
            return make_token(lex, TOK_KIND_LBRACKET);

        case ']':
            skip(lex);
            return make_token(lex, TOK_KIND_RBRACKET);

        case '{':
            skip(lex);
            return make_token(lex, TOK_KIND_LBRACE);

        case '}':
            skip(lex);
            return make_token(lex, TOK_KIND_RBRACE);

        case ';':
            skip(lex);
            return make_token(lex, TOK_KIND_SEMICOLON);

        case ':':
            skip(lex);
            return make_token(lex, TOK_KIND_COLON);

        case '.':
            skip(lex);
            return make_token(lex, TOK_KIND_DOT);

        case ',':
            skip(lex);
            return make_token(lex, TOK_KIND_COMMA);

        case '+':
            skip(lex);
            return make_token(lex, TOK_KIND_PLUS);

        case '-':
            skip(lex);
            return make_token(lex, TOK_KIND_MINUS);

        case '*':
            skip(lex);
            return make_token(lex, TOK_KIND_MUL);

        case '/':
            skip(lex);
            return make_token(lex, TOK_KIND_DIV);

        case '=':
            skip(lex);
            return make_token(lex, TOK_KIND_ASSIGN);

        case '!':
            skip(lex);
            return make_token(lex, TOK_KIND_NOT);

        case '&':
            skip(lex);
            return make_token(lex, TOK_KIND_AND);

        case '|':
            skip(lex);
            return make_token(lex, TOK_KIND_OR);

        case '\0':
            return make_token(lex, TOK_KIND_EOF);

        default:
            fprintf(stderr, "Unexpected token: '%c'", c0);
            exit(1);
        }
    }

    // unreachable
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
movq (%rsi), %rcx
movq 0x8(%rsi), %rax
leaq 0x4b9e(%rip), %rdx      # 0x6078
movq %rax, 0x10(%rsi)
movzbl (%rcx,%rax), %edi
cmpq $0x7d, %rdi
ja 0x17cc
movslq (%rdx,%rdi,4), %r8
addq %rdx, %r8
jmpq *%r8
incq %rax
movq %rax, 0x8(%rsi)
jmp 0x14da
leaq (%rcx,%rax), %r14
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
pushq $0x1
popq %r15
movabsq $0x3ffffff03ffffff, %rdx # imm = 0x3FFFFFF03FFFFFF
movzbl (%r14,%r15), %edi
leal -0x41(%rdi), %r8d
cmpl $0x39, %r8d
ja 0x153e
btq %r8, %rdx
jae 0x153e
leaq (%rax,%r15), %rdi
incq %rdi
movq %rdi, 0x8(%rsi)
incq %r15
jmp 0x1519
addl $-0x30, %edi
cmpl $0xa, %edi
jb 0x152e
movl $0x18, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
addq %r15, %rax
movq %rax, 0x18(%rbx)
leaq 0x4d25(%rip), %rdi      # 0x6287
movq %r14, %rsi
movq %r15, %rdx
callq 0x1060
testl %eax, %eax
je 0x15a1
leaq 0x4d14(%rip), %rdi      # 0x628c
movq %r14, %rsi
movq %r15, %rdx
callq 0x1060
testl %eax, %eax
je 0x15a5
leaq 0x4d01(%rip), %rdi      # 0x628f
movq %r14, %rsi
movq %r15, %rdx
callq 0x1060
testl %eax, %eax
jne 0x15d9
pushq $0x19
jmp 0x15a7
pushq $0x1b
jmp 0x15a7
pushq $0x1a
popq %rax
movl %eax, (%rbx)
jmp 0x15d9
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movb (%rcx,%rdx), %dil
addb $-0x30, %dil
cmpb $0x9, %dil
ja 0x15c7
incq %rdx
jmp 0x15b0
movl $0x1c, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movq %rdx, 0x18(%rbx)
movq %rbx, %rax
popq %rbx
popq %r14
popq %r15
retq
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xf, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x8, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x6, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x15, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xb, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x2, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x10, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xc, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x14, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x11, (%rbx)
jmp 0x15cd
movl $0x1f, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movq %rax, 0x18(%rbx)
jmp 0x15d9
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x13, (%rbx)
jmp 0x15cd
incq %rax
movq %rax, 0x8(%rsi)
movq %rax, 0x10(%rsi)
movq %rax, %rdx
cmpb $0x22, (%rcx,%rdx)
je 0x16d5
incq %rdx
movq %rdx, 0x8(%rsi)
jmp 0x16c6
movl $0x1e, (%rbx)
jmp 0x16f6
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
cmpb $0x27, (%rcx,%rdx)
je 0x16f0
incq %rdx
jmp 0x16e1
movl $0x1d, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movq %rdx, 0x18(%rbx)
incq %rdx
movq %rdx, 0x8(%rsi)
jmp 0x15d9
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x12, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x5, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x1, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x4, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xe, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x3, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xa, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x9, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x7, (%rbx)
jmp 0x15cd
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xd, (%rbx)
jmp 0x15cd
movsbl %dil, %edx
movq 0x9821(%rip), %rax      # 0xaff8
movq (%rax), %rdi
leaq 0x4a8f(%rip), %rsi      # 0x6270
xorl %eax, %eax
callq 0x1120
pushq $0x1
popq %rdi
callq 0x11b0