// File: rfotino[P]consolite-compiler/src/syntax.cpp
// Function: ExprToken::_validate()
bool ExprToken::_validate() {
  std::stack<std::string> operands;
  for (auto token : _postfix) {
    auto op = std::dynamic_pointer_cast<OperatorToken>(token);
    if (std::dynamic_pointer_cast<LiteralToken>(token) ||
        std::dynamic_pointer_cast<FunctionCallToken>(token)) {
      operands.push("rvalue");
    } else if (std::dynamic_pointer_cast<GlobalVarToken>(token) ||
               std::dynamic_pointer_cast<ParamToken>(token) ||
               std::dynamic_pointer_cast<LocalVarToken>(token)) {
      operands.push("lvalue");
    } else if (nullptr != op) {
      std::string rhs = operands.top();
      operands.pop();
      std::string lhs;
      if (op->isBinary()) {
        lhs = operands.top();
        operands.pop();
      }
      std::string result;
      if ("=" == op->str()) {
        if ("rvalue" == lhs) {
          _error("Can't assign to an rvalue in expression.", op->line());
          return false;
        }
        result = "rvalue";
      } else if ("*" == op->str() && op->isUnary()) {
        result = "lvalue";
      } else if ("&" == op->str() && op->isUnary()) {
        if ("lvalue" != rhs) {
          _error("Can't get address of an rvalue in expression.",
                 op->line());
          return false;
        }
        result = "rvalue";
      } else if ("[" == op->str()) {
        result = "lvalue";
      } else {
        result = "rvalue";
      }
      operands.push(result);
    }
  }
  return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x300, %rsp            # imm = 0x300
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x298(%rbp)
leaq -0x60(%rbp), %rdi
callq 0xe680
movq -0x298(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rdi
callq 0x32fd0
movq %rax, -0x70(%rbp)
movq -0x68(%rbp), %rdi
callq 0x33000
movq %rax, -0x78(%rbp)
leaq -0x70(%rbp), %rdi
leaq -0x78(%rbp), %rsi
callq 0x33030
testb $0x1, %al
jne 0x20a92
jmp 0x2146f
leaq -0x70(%rbp), %rdi
callq 0x33070
movq %rax, %rsi
leaq -0x88(%rbp), %rdi
callq 0x33090
leaq -0x98(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x32a80
leaq -0xa8(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x330c0
leaq -0xa8(%rbp), %rdi
callq 0x33150
movb %al, %cl
movb $0x0, -0xb9(%rbp)
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x299(%rbp)
jne 0x20b1e
leaq -0xb8(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x33170
movb $0x1, -0xb9(%rbp)
leaq -0xb8(%rbp), %rdi
callq 0x33200
movb %al, -0x299(%rbp)
movb -0x299(%rbp), %al
movb %al, -0x29a(%rbp)
testb $0x1, -0xb9(%rbp)
jne 0x20b35
jmp 0x20b41
leaq -0xb8(%rbp), %rdi
callq 0x32f70
leaq -0xa8(%rbp), %rdi
callq 0x32f90
movb -0x29a(%rbp), %al
testb $0x1, %al
jne 0x20b5c
jmp 0x20bfd
leaq -0xe1(%rbp), %rdi
movq %rdi, -0x2a8(%rbp)
callq 0x8760
movq -0x2a8(%rbp), %rdx
leaq 0x4ee36(%rip), %rsi     # 0x6f9b3
leaq -0xe0(%rbp), %rdi
callq 0xced0
jmp 0x20b8b
leaq -0x60(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
callq 0x32940
jmp 0x20b9d
leaq -0xe0(%rbp), %rdi
callq 0x8848
leaq -0xe1(%rbp), %rdi
callq 0x8460
jmp 0x213f8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
jmp 0x20bec
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
leaq -0xe0(%rbp), %rdi
callq 0x8848
leaq -0xe1(%rbp), %rdi
callq 0x8460
jmp 0x2144c
leaq -0x108(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x33220
leaq -0x108(%rbp), %rdi
callq 0x332b0
movb %al, %cl
movb $0x0, -0x119(%rbp)
movb $0x0, -0x131(%rbp)
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x2a9(%rbp)
jne 0x20c9a
leaq -0x118(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x332d0
movb $0x1, -0x119(%rbp)
leaq -0x118(%rbp), %rdi
callq 0x33360
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0x2a9(%rbp)
jne 0x20c9a
leaq -0x130(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x33380
movb $0x1, -0x131(%rbp)
leaq -0x130(%rbp), %rdi
callq 0x33410
movb %al, -0x2a9(%rbp)
movb -0x2a9(%rbp), %al
movb %al, -0x2aa(%rbp)
testb $0x1, -0x131(%rbp)
jne 0x20cb1
jmp 0x20cbd
leaq -0x130(%rbp), %rdi
callq 0x10dc0
testb $0x1, -0x119(%rbp)
jne 0x20cc8
jmp 0x20cd4
leaq -0x118(%rbp), %rdi
callq 0xd400
leaq -0x108(%rbp), %rdi
callq 0x9880
movb -0x2aa(%rbp), %al
testb $0x1, %al
jne 0x20cef
jmp 0x20d90
leaq -0x159(%rbp), %rdi
movq %rdi, -0x2b8(%rbp)
callq 0x8760
movq -0x2b8(%rbp), %rdx
leaq 0x4ecaa(%rip), %rsi     # 0x6f9ba
leaq -0x158(%rbp), %rdi
callq 0xced0
jmp 0x20d1e
leaq -0x60(%rbp), %rdi
leaq -0x158(%rbp), %rsi
callq 0x32940
jmp 0x20d30
leaq -0x158(%rbp), %rdi
callq 0x8848
leaq -0x159(%rbp), %rdi
callq 0x8460
jmp 0x213f6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
jmp 0x20d7f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
leaq -0x158(%rbp), %rdi
callq 0x8848
leaq -0x159(%rbp), %rdi
callq 0x8460
jmp 0x2144c
xorl %eax, %eax
movl %eax, %edi
leaq -0x98(%rbp), %rsi
callq 0x33430
testb $0x1, %al
jne 0x20da9
jmp 0x213f4
leaq -0x60(%rbp), %rdi
callq 0x32a40
movq %rax, -0x2c0(%rbp)
jmp 0x20dbb
movq -0x2c0(%rbp), %rsi
leaq -0x180(%rbp), %rdi
callq 0x81b0
jmp 0x20dd0
leaq -0x60(%rbp), %rdi
callq 0x32c00
jmp 0x20ddb
leaq -0x1a0(%rbp), %rdi
callq 0x8590
leaq -0x98(%rbp), %rdi
callq 0x32c70
movq %rax, %rdi
callq 0x32590
movb %al, -0x2c1(%rbp)
jmp 0x20e03
movb -0x2c1(%rbp), %al
testb $0x1, %al
jne 0x20e0f
jmp 0x20e88
leaq -0x60(%rbp), %rdi
callq 0x32a40
movq %rax, -0x2d0(%rbp)
jmp 0x20e21
movq -0x2d0(%rbp), %rsi
leaq -0x1a0(%rbp), %rdi
callq 0x8070
jmp 0x20e36
leaq -0x60(%rbp), %rdi
callq 0x32c00
jmp 0x20e41
jmp 0x20e88
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
jmp 0x2144c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
jmp 0x213e6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
jmp 0x213da
leaq -0x1c0(%rbp), %rdi
callq 0x8590
leaq -0x98(%rbp), %rdi
callq 0x32c70
movq %rax, %rsi
leaq -0x1e0(%rbp), %rdi
callq 0x33460
jmp 0x20eb1
leaq 0x4e7ca(%rip), %rdi     # 0x6f682
leaq -0x1e0(%rbp), %rsi
callq 0xd590
movb %al, -0x2d1(%rbp)
jmp 0x20ecc
leaq -0x1e0(%rbp), %rdi
callq 0x8848
movb -0x2d1(%rbp), %al
testb $0x1, %al
jne 0x20ee7
jmp 0x21032
leaq 0x4eac5(%rip), %rdi     # 0x6f9b3
leaq -0x1a0(%rbp), %rsi
callq 0xd590
movb %al, -0x2d2(%rbp)
jmp 0x20f02
movb -0x2d2(%rbp), %al
testb $0x1, %al
jne 0x20f11
jmp 0x21018
leaq -0x201(%rbp), %rdi
movq %rdi, -0x2e0(%rbp)
callq 0x8760
movq -0x2e0(%rbp), %rdx
leaq 0x4ea8f(%rip), %rsi     # 0x6f9c1
leaq -0x200(%rbp), %rdi
callq 0xced0
jmp 0x20f40
leaq -0x98(%rbp), %rdi
callq 0x32c70
movq %rax, %rdi
callq 0x32270
movl %eax, -0x2e4(%rbp)
jmp 0x20f5c
movl -0x2e4(%rbp), %esi
leaq -0x200(%rbp), %rdi
callq 0x6d960
jmp 0x20f70
leaq -0x200(%rbp), %rdi
callq 0x8848
leaq -0x201(%rbp), %rdi
callq 0x8460
movb $0x0, -0x1(%rbp)
movl $0x1, -0x208(%rbp)
jmp 0x2139c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
jmp 0x213ce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
leaq -0x1e0(%rbp), %rdi
callq 0x8848
jmp 0x213ce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
jmp 0x21007
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
leaq -0x200(%rbp), %rdi
callq 0x8848
leaq -0x201(%rbp), %rdi
callq 0x8460
jmp 0x213ce
leaq 0x4e994(%rip), %rsi     # 0x6f9b3
leaq -0x1c0(%rbp), %rdi
callq 0x8580
jmp 0x2102d
jmp 0x21380
leaq -0x98(%rbp), %rdi
callq 0x32c70
movq %rax, %rsi
leaq -0x228(%rbp), %rdi
callq 0x33460
jmp 0x2104f
leaq 0x4e610(%rip), %rdi     # 0x6f666
leaq -0x228(%rbp), %rsi
callq 0xd590
movb %al, -0x2e5(%rbp)
jmp 0x2106a
movb -0x2e5(%rbp), %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0x2e6(%rbp)
jne 0x2107f
jmp 0x210a9
leaq -0x98(%rbp), %rdi
callq 0x32c70
movq %rax, %rdi
callq 0x32570
movb %al, -0x2e7(%rbp)
jmp 0x2109b
movb -0x2e7(%rbp), %al
movb %al, -0x2e6(%rbp)
jmp 0x210a9
movb -0x2e6(%rbp), %al
movb %al, -0x2e8(%rbp)
leaq -0x228(%rbp), %rdi
callq 0x8848
movb -0x2e8(%rbp), %al
testb $0x1, %al
jne 0x210cd
jmp 0x2110a
leaq 0x4e8e6(%rip), %rsi     # 0x6f9ba
leaq -0x1c0(%rbp), %rdi
callq 0x8580
jmp 0x210e2
jmp 0x2137e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
leaq -0x228(%rbp), %rdi
callq 0x8848
jmp 0x213ce
leaq -0x98(%rbp), %rdi
callq 0x32c70
movq %rax, %rsi
leaq -0x248(%rbp), %rdi
callq 0x33460
jmp 0x21127
leaq 0x4e548(%rip), %rdi     # 0x6f676
leaq -0x248(%rbp), %rsi
callq 0xd590
movb %al, -0x2e9(%rbp)
jmp 0x21142
movb -0x2e9(%rbp), %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0x2ea(%rbp)
jne 0x21157
jmp 0x21181
leaq -0x98(%rbp), %rdi
callq 0x32c70
movq %rax, %rdi
callq 0x32570
movb %al, -0x2eb(%rbp)
jmp 0x21173
movb -0x2eb(%rbp), %al
movb %al, -0x2ea(%rbp)
jmp 0x21181
movb -0x2ea(%rbp), %al
movb %al, -0x2ec(%rbp)
leaq -0x248(%rbp), %rdi
callq 0x8848
movb -0x2ec(%rbp), %al
testb $0x1, %al
jne 0x211a8
jmp 0x212dc
leaq 0x4e80b(%rip), %rdi     # 0x6f9ba
leaq -0x180(%rbp), %rsi
callq 0xd8e0
movb %al, -0x2ed(%rbp)
jmp 0x211c3
movb -0x2ed(%rbp), %al
testb $0x1, %al
jne 0x211d2
jmp 0x212c2
leaq -0x269(%rbp), %rdi
movq %rdi, -0x2f8(%rbp)
callq 0x8760
movq -0x2f8(%rbp), %rdx
leaq 0x4e7f7(%rip), %rsi     # 0x6f9ea
leaq -0x268(%rbp), %rdi
callq 0xced0
jmp 0x21201
leaq -0x98(%rbp), %rdi
callq 0x32c70
movq %rax, %rdi
callq 0x32270
movl %eax, -0x2fc(%rbp)
jmp 0x2121d
movl -0x2fc(%rbp), %esi
leaq -0x268(%rbp), %rdi
callq 0x6d960
jmp 0x21231
leaq -0x268(%rbp), %rdi
callq 0x8848
leaq -0x269(%rbp), %rdi
callq 0x8460
movb $0x0, -0x1(%rbp)
movl $0x1, -0x208(%rbp)
jmp 0x2139c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
leaq -0x248(%rbp), %rdi
callq 0x8848
jmp 0x213ce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
jmp 0x212b1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
leaq -0x268(%rbp), %rdi
callq 0x8848
leaq -0x269(%rbp), %rdi
callq 0x8460
jmp 0x213ce
leaq 0x4e6ea(%rip), %rsi     # 0x6f9b3
leaq -0x1c0(%rbp), %rdi
callq 0x8580
jmp 0x212d7
jmp 0x2137c
leaq -0x98(%rbp), %rdi
callq 0x32c70
movq %rax, %rsi
leaq -0x290(%rbp), %rdi
callq 0x33460
jmp 0x212f9
leaq 0x4e384(%rip), %rdi     # 0x6f684
leaq -0x290(%rbp), %rsi
callq 0xd590
movb %al, -0x2fd(%rbp)
jmp 0x21314
leaq -0x290(%rbp), %rdi
callq 0x8848
movb -0x2fd(%rbp), %al
testb $0x1, %al
jne 0x2132c
jmp 0x21363
leaq 0x4e687(%rip), %rsi     # 0x6f9ba
leaq -0x1c0(%rbp), %rdi
callq 0x8580
jmp 0x21341
jmp 0x2137a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xf0(%rbp)
movl %eax, -0xf4(%rbp)
leaq -0x290(%rbp), %rdi
callq 0x8848
jmp 0x213ce
leaq 0x4e649(%rip), %rsi     # 0x6f9b3
leaq -0x1c0(%rbp), %rdi
callq 0x8580
jmp 0x21378
jmp 0x2137a
jmp 0x2137c
jmp 0x2137e
jmp 0x21380
leaq -0x60(%rbp), %rdi
leaq -0x1c0(%rbp), %rsi
callq 0x33490
jmp 0x21392
movl $0x0, -0x208(%rbp)
leaq -0x1c0(%rbp), %rdi
callq 0x8848
leaq -0x1a0(%rbp), %rdi
callq 0x8848
leaq -0x180(%rbp), %rdi
callq 0x8848
movl -0x208(%rbp), %eax
testl %eax, %eax
jne 0x21402
jmp 0x213cc
jmp 0x213f4
leaq -0x1c0(%rbp), %rdi
callq 0x8848
leaq -0x1a0(%rbp), %rdi
callq 0x8848
leaq -0x180(%rbp), %rdi
callq 0x8848
jmp 0x2144c
jmp 0x213f6
jmp 0x213f8
movl $0x0, -0x208(%rbp)
leaq -0x98(%rbp), %rdi
callq 0x32b50
movl -0x208(%rbp), %eax
testl %eax, %eax
jne 0x21424
jmp 0x2141a
movl $0x0, -0x208(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x327f0
movl -0x208(%rbp), %eax
testl %eax, %eax
jne 0x2147d
jmp 0x2143c
jmp 0x2143e
leaq -0x70(%rbp), %rdi
callq 0x334c0
jmp 0x20a7c
leaq -0x98(%rbp), %rdi
callq 0x32b50
leaq -0x88(%rbp), %rdi
callq 0x327f0
leaq -0x60(%rbp), %rdi
callq 0x10390
jmp 0x21494
movb $0x1, -0x1(%rbp)
movl $0x1, -0x208(%rbp)
leaq -0x60(%rbp), %rdi
callq 0x10390
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x300, %rsp            # imm = 0x300
popq %rbp
retq
movq -0xf0(%rbp), %rdi
callq 0x8750