// File: /workspace/github_c_makefile_star2_O0/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 %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x20(%rbp)
movq %rdi, -0x18(%rbp)
movq %rsi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rcx
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rdi
callq 0x1910
movb %al, -0x9(%rbp)
movsbl -0x9(%rbp), %eax
movl %eax, %ecx
movq %rcx, -0x28(%rbp)
subl $0x7d, %eax
ja 0x18d7
movq -0x28(%rbp), %rax
leaq 0x9ad2(%rip), %rcx      # 0xb07c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rdi
callq 0x1930
jmp 0x1574
jmp 0x15c0
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
callq 0x1950
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
callq 0x1a60
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
callq 0x1ac0
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
callq 0x1b30
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x1, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x3, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x2, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x4, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x5, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x6, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x7, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x8, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x9, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0xa, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0xb, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0xc, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0xd, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0xe, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0xf, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x10, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x11, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x12, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x13, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x14, %edx
callq 0x1b90
jmp 0x18fd
movq -0x8(%rbp), %rdi
callq 0x1930
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x15, %edx
callq 0x1b90
jmp 0x18fd
movq -0x20(%rbp), %rdi
movq -0x8(%rbp), %rsi
movl $0x1f, %edx
callq 0x1b90
jmp 0x18fd
movq 0xd71a(%rip), %rax      # 0xeff8
movq (%rax), %rdi
movsbl -0x9(%rbp), %edx
leaq 0x9988(%rip), %rsi      # 0xb274
movb $0x0, %al
callq 0x10e0
movl $0x1, %edi
callq 0x1170
movq -0x18(%rbp), %rax
addq $0x30, %rsp
popq %rbp
retq
nopw (%rax,%rax)