// File: /workspace/github_c_makefile_star2_O3/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 0x2(%rax), %rdx
leaq 0x5886(%rip), %rdi      # 0x7078
movq %rax, 0x10(%rsi)
movzbl (%rcx,%rax), %r8d
cmpq $0x7d, %r8
ja 0x1b49
movslq (%rdi,%r8,4), %r9
addq %rdi, %r9
jmpq *%r9
incq %rax
movq %rax, 0x8(%rsi)
incq %rdx
jmp 0x17f2
leaq (%rcx,%rax), %r14
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x1, %r15d
movabsq $0x3ffffff03ffffff, %rdx # imm = 0x3FFFFFF03FFFFFF
movzbl (%r14,%r15), %edi
leal -0x41(%rdi), %r8d
cmpl $0x39, %r8d
ja 0x185c
btq %r8, %rdx
jae 0x185c
leaq (%rax,%r15), %rdi
incq %rdi
movq %rdi, 0x8(%rsi)
incq %r15
jmp 0x1837
addl $-0x30, %edi
cmpl $0xa, %edi
jb 0x184c
movl $0x18, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
addq %r15, %rax
movq %rax, 0x18(%rbx)
leaq 0x5a07(%rip), %rdi      # 0x7287
movq %r14, %rsi
movq %r15, %rdx
callq 0x1060
testl %eax, %eax
je 0x18c6
leaq 0x59f6(%rip), %rdi      # 0x728c
movq %r14, %rsi
movq %r15, %rdx
callq 0x1060
testl %eax, %eax
je 0x18cd
leaq 0x59e3(%rip), %rdi      # 0x728f
movq %r14, %rsi
movq %r15, %rdx
callq 0x1060
testl %eax, %eax
jne 0x1b40
movl $0x19, %eax
jmp 0x18d2
movl $0x1b, %eax
jmp 0x18d2
movl $0x1a, %eax
movl %eax, (%rbx)
jmp 0x1b40
leaq 0x1(%rax), %rdi
movq %rdi, 0x8(%rsi)
movb 0x1(%rcx,%rax), %r8b
addb $-0x30, %r8b
cmpb $0x9, %r8b
ja 0x190b
movq %rdx, 0x8(%rsi)
movb (%rcx,%rdx), %dil
addb $-0x30, %dil
incq %rdx
cmpb $0xa, %dil
jb 0x18f0
decq %rdx
movq %rdx, %rdi
movl $0x1c, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movq %rdi, 0x18(%rbx)
jmp 0x1b40
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xf, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x8, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x6, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x15, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xb, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x2, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x10, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xc, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x14, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x11, (%rbx)
jmp 0x1b34
movl $0x1f, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movq %rax, 0x18(%rbx)
jmp 0x1b40
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x13, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdi
movq %rdi, 0x8(%rsi)
movq %rdi, 0x10(%rsi)
cmpb $0x22, 0x1(%rcx,%rax)
movq %rdi, %rax
je 0x1a34
movq %rdx, 0x8(%rsi)
cmpb $0x22, (%rcx,%rdx)
leaq 0x1(%rdx), %rdx
jne 0x1a20
decq %rdx
movq %rdx, %rax
movl $0x1e, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rdi, 0x10(%rbx)
movq %rax, 0x18(%rbx)
incq %rax
movq %rax, 0x8(%rsi)
jmp 0x1b40
leaq 0x1(%rax), %rdi
movq %rdi, 0x8(%rsi)
cmpb $0x27, 0x1(%rcx,%rax)
je 0x1a75
movq %rdx, 0x8(%rsi)
cmpb $0x27, (%rcx,%rdx)
leaq 0x1(%rdx), %rdx
jne 0x1a61
decq %rdx
movq %rdx, %rdi
movl $0x1d, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movq %rdi, 0x18(%rbx)
incq %rdi
movq %rdi, 0x8(%rsi)
jmp 0x1b40
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x12, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x5, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x1, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x4, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xe, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x3, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xa, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x9, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0x7, (%rbx)
jmp 0x1b34
leaq 0x1(%rax), %rdx
movq %rdx, 0x8(%rsi)
movl $0xd, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movq %rdx, 0x18(%rbx)
movq %rbx, %rax
popq %rbx
popq %r14
popq %r15
retq
movzbl %r8b, %edi
callq 0x1242
nop