// File: silverneko[P]Lambda-calculus-interpreter/src/ExpressionParser.cpp
// Function: tokenParser(Token&)
Parser tokenParser(Token& token){
  auto f = [&token](Token::Type t){
    return [&token, t](const string& str){ token = Token(t, str);};
  };
  auto g = [&token](const string& str){
    if(str == "let") token = Token(Token::Keyword, "let");
    else if(str == "in") token = Token(Token::Keyword, "in");
    else token = Token(Token::Identifier, str);
  };
  return (comment[f(Token::Undefined)]
      | integer[f(Token::Constant)]
      | charLiteral[f(Token::Constant)]
      | identifier[g]
      | lambda[f(Token::Lambda)]
      | leftBracket[f(Token::LeftBracket)]
      | rightBracket[f(Token::RightBracket)]
      | panic[f(Token::Undefined)]
      );
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x480, %rsp            # imm = 0x480
movq %rdi, -0x3e8(%rbp)
movq %rdi, %rax
movq %rax, -0x3e0(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x20(%rbp)
leaq -0x18(%rbp), %rdi
xorl %esi, %esi
callq 0x15490
movl %edx, -0x138(%rbp)
movq %rax, -0x140(%rbp)
movl -0x138(%rbp), %eax
movl %eax, -0x128(%rbp)
movq -0x140(%rbp), %rax
movq %rax, -0x130(%rbp)
leaq -0x120(%rbp), %rdi
movq %rdi, -0x3d8(%rbp)
leaq -0x130(%rbp), %rsi
callq 0x154c0
movq -0x3d8(%rbp), %rdx
leaq 0x1b78a(%rip), %rsi     # 0x30408
leaq -0x100(%rbp), %rdi
callq 0x13490
jmp 0x14c8c
leaq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x15490
movl %edx, -0x3f4(%rbp)
movq %rax, -0x3f0(%rbp)
jmp 0x14ca9
movl -0x3f4(%rbp), %eax
movq -0x3f0(%rbp), %rcx
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1a8(%rbp)
movl -0x1a8(%rbp), %eax
movl %eax, -0x198(%rbp)
movq -0x1b0(%rbp), %rax
movq %rax, -0x1a0(%rbp)
leaq -0x190(%rbp), %rdi
movq %rdi, -0x400(%rbp)
leaq -0x1a0(%rbp), %rsi
callq 0x154c0
movq -0x400(%rbp), %rdx
leaq 0x1b643(%rip), %rsi     # 0x30348
leaq -0x170(%rbp), %rdi
callq 0x13490
jmp 0x14d13
leaq -0xe0(%rbp), %rdi
leaq -0x100(%rbp), %rsi
leaq -0x170(%rbp), %rdx
callq 0x137d0
jmp 0x14d2f
leaq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x15490
movl %edx, -0x40c(%rbp)
movq %rax, -0x408(%rbp)
jmp 0x14d4c
movl -0x40c(%rbp), %eax
movq -0x408(%rbp), %rcx
movq %rcx, -0x210(%rbp)
movl %eax, -0x208(%rbp)
movl -0x208(%rbp), %eax
movl %eax, -0x1f8(%rbp)
movq -0x210(%rbp), %rax
movq %rax, -0x200(%rbp)
leaq -0x1f0(%rbp), %rdi
movq %rdi, -0x418(%rbp)
leaq -0x200(%rbp), %rsi
callq 0x154c0
movq -0x418(%rbp), %rdx
leaq 0x1b5c0(%rip), %rsi     # 0x30368
leaq -0x1d0(%rbp), %rdi
callq 0x13490
jmp 0x14db6
leaq -0xc0(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
leaq -0x1d0(%rbp), %rdx
callq 0x137d0
jmp 0x14dd2
leaq -0x250(%rbp), %rdi
movq %rdi, -0x420(%rbp)
leaq -0x20(%rbp), %rsi
callq 0x15550
movq -0x420(%rbp), %rdx
leaq 0x1b591(%rip), %rsi     # 0x30388
leaq -0x230(%rbp), %rdi
callq 0x13490
jmp 0x14e05
leaq -0xa0(%rbp), %rdi
leaq -0xc0(%rbp), %rsi
leaq -0x230(%rbp), %rdx
callq 0x137d0
jmp 0x14e21
leaq -0x18(%rbp), %rdi
movl $0x4, %esi
callq 0x15490
movl %edx, -0x42c(%rbp)
movq %rax, -0x428(%rbp)
jmp 0x14e3e
movl -0x42c(%rbp), %eax
movq -0x428(%rbp), %rcx
movq %rcx, -0x2b0(%rbp)
movl %eax, -0x2a8(%rbp)
movl -0x2a8(%rbp), %eax
movl %eax, -0x298(%rbp)
movq -0x2b0(%rbp), %rax
movq %rax, -0x2a0(%rbp)
leaq -0x290(%rbp), %rdi
movq %rdi, -0x438(%rbp)
leaq -0x2a0(%rbp), %rsi
callq 0x154c0
movq -0x438(%rbp), %rdx
leaq 0x1b50e(%rip), %rsi     # 0x303a8
leaq -0x270(%rbp), %rdi
callq 0x13490
jmp 0x14ea8
leaq -0x80(%rbp), %rdi
leaq -0xa0(%rbp), %rsi
leaq -0x270(%rbp), %rdx
callq 0x137d0
jmp 0x14ec1
leaq -0x18(%rbp), %rdi
movl $0x5, %esi
callq 0x15490
movl %edx, -0x444(%rbp)
movq %rax, -0x440(%rbp)
jmp 0x14ede
movl -0x444(%rbp), %eax
movq -0x440(%rbp), %rcx
movq %rcx, -0x310(%rbp)
movl %eax, -0x308(%rbp)
movl -0x308(%rbp), %eax
movl %eax, -0x2f8(%rbp)
movq -0x310(%rbp), %rax
movq %rax, -0x300(%rbp)
leaq -0x2f0(%rbp), %rdi
movq %rdi, -0x450(%rbp)
leaq -0x300(%rbp), %rsi
callq 0x154c0
movq -0x450(%rbp), %rdx
leaq 0x1b48e(%rip), %rsi     # 0x303c8
leaq -0x2d0(%rbp), %rdi
callq 0x13490
jmp 0x14f48
leaq -0x60(%rbp), %rdi
leaq -0x80(%rbp), %rsi
leaq -0x2d0(%rbp), %rdx
callq 0x137d0
jmp 0x14f5e
leaq -0x18(%rbp), %rdi
movl $0x6, %esi
callq 0x15490
movl %edx, -0x45c(%rbp)
movq %rax, -0x458(%rbp)
jmp 0x14f7b
movl -0x45c(%rbp), %eax
movq -0x458(%rbp), %rcx
movq %rcx, -0x370(%rbp)
movl %eax, -0x368(%rbp)
movl -0x368(%rbp), %eax
movl %eax, -0x358(%rbp)
movq -0x370(%rbp), %rax
movq %rax, -0x360(%rbp)
leaq -0x350(%rbp), %rdi
movq %rdi, -0x468(%rbp)
leaq -0x360(%rbp), %rsi
callq 0x154c0
movq -0x468(%rbp), %rdx
leaq 0x1b411(%rip), %rsi     # 0x303e8
leaq -0x330(%rbp), %rdi
callq 0x13490
jmp 0x14fe5
leaq -0x40(%rbp), %rdi
leaq -0x60(%rbp), %rsi
leaq -0x330(%rbp), %rdx
callq 0x137d0
jmp 0x14ffb
leaq -0x18(%rbp), %rdi
xorl %esi, %esi
callq 0x15490
movl %edx, -0x474(%rbp)
movq %rax, -0x470(%rbp)
jmp 0x15015
movl -0x474(%rbp), %eax
movq -0x470(%rbp), %rcx
movq %rcx, -0x3d0(%rbp)
movl %eax, -0x3c8(%rbp)
movl -0x3c8(%rbp), %eax
movl %eax, -0x3b8(%rbp)
movq -0x3d0(%rbp), %rax
movq %rax, -0x3c0(%rbp)
leaq -0x3b0(%rbp), %rdi
movq %rdi, -0x480(%rbp)
leaq -0x3c0(%rbp), %rsi
callq 0x154c0
movq -0x480(%rbp), %rdx
leaq 0x1b3b7(%rip), %rsi     # 0x30428
leaq -0x390(%rbp), %rdi
callq 0x13490
jmp 0x1507f
movq -0x3e8(%rbp), %rdi
leaq -0x40(%rbp), %rsi
leaq -0x390(%rbp), %rdx
callq 0x137d0
jmp 0x15098
leaq -0x390(%rbp), %rdi
callq 0x1c350
leaq -0x3b0(%rbp), %rdi
callq 0x1c2f0
leaq -0x40(%rbp), %rdi
callq 0x1c350
leaq -0x330(%rbp), %rdi
callq 0x1c350
leaq -0x350(%rbp), %rdi
callq 0x1c2f0
leaq -0x60(%rbp), %rdi
callq 0x1c350
leaq -0x2d0(%rbp), %rdi
callq 0x1c350
leaq -0x2f0(%rbp), %rdi
callq 0x1c2f0
leaq -0x80(%rbp), %rdi
callq 0x1c350
leaq -0x270(%rbp), %rdi
callq 0x1c350
leaq -0x290(%rbp), %rdi
callq 0x1c2f0
leaq -0xa0(%rbp), %rdi
callq 0x1c350
leaq -0x230(%rbp), %rdi
callq 0x1c350
leaq -0x250(%rbp), %rdi
callq 0x1c2f0
leaq -0xc0(%rbp), %rdi
callq 0x1c350
leaq -0x1d0(%rbp), %rdi
callq 0x1c350
leaq -0x1f0(%rbp), %rdi
callq 0x1c2f0
leaq -0xe0(%rbp), %rdi
callq 0x1c350
leaq -0x170(%rbp), %rdi
callq 0x1c350
leaq -0x190(%rbp), %rdi
callq 0x1c2f0
leaq -0x100(%rbp), %rdi
callq 0x1c350
leaq -0x120(%rbp), %rdi
callq 0x1c2f0
movq -0x3e0(%rbp), %rax
addq $0x480, %rsp            # imm = 0x480
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x1546c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x15460
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x15454
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x15448
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x1543c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x15430
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x15424
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x1540c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x15400
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x153f4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x153e8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x153dc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x153d3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x153c7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x153bb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x153b2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x153a6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x1539a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x15391
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
jmp 0x15385
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x148(%rbp)
movl %eax, -0x14c(%rbp)
leaq -0x390(%rbp), %rdi
callq 0x1c350
leaq -0x3b0(%rbp), %rdi
callq 0x1c2f0
leaq -0x40(%rbp), %rdi
callq 0x1c350
leaq -0x330(%rbp), %rdi
callq 0x1c350
leaq -0x350(%rbp), %rdi
callq 0x1c2f0
leaq -0x60(%rbp), %rdi
callq 0x1c350
leaq -0x2d0(%rbp), %rdi
callq 0x1c350
leaq -0x2f0(%rbp), %rdi
callq 0x1c2f0
leaq -0x80(%rbp), %rdi
callq 0x1c350
leaq -0x270(%rbp), %rdi
callq 0x1c350
leaq -0x290(%rbp), %rdi
callq 0x1c2f0
leaq -0xa0(%rbp), %rdi
callq 0x1c350
leaq -0x230(%rbp), %rdi
callq 0x1c350
leaq -0x250(%rbp), %rdi
callq 0x1c2f0
leaq -0xc0(%rbp), %rdi
callq 0x1c350
leaq -0x1d0(%rbp), %rdi
callq 0x1c350
leaq -0x1f0(%rbp), %rdi
callq 0x1c2f0
leaq -0xe0(%rbp), %rdi
callq 0x1c350
leaq -0x170(%rbp), %rdi
callq 0x1c350
leaq -0x190(%rbp), %rdi
callq 0x1c2f0
leaq -0x100(%rbp), %rdi
callq 0x1c350
leaq -0x120(%rbp), %rdi
callq 0x1c2f0
movq -0x148(%rbp), %rdi
callq 0x33c0
nopw %cs:(%rax,%rax)