// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/parse.c
// Function: parse_expr_postfix
ast_n *parse_expr_postfix(lexer *lx) {
	ast_n *node = parse_expr_primary(lx);

	ast_n *n_node;
	token t = lex_peek(lx);
	switch (t.type) {
		case TOK_LBK: //Array accessor
			n_node = astn_new(EXPR, EXPR_ARRAY, t);
			n_node->dat.expr.left = node;
			lex_adv(lx);

			//Get offset
			n_node->dat.expr.right = parse_expr(lx);
			//n_node->dat.expr.right = parse_expr_primary(lx);
			
			t = lex_peek(lx);
			if (t.type != TOK_RBK)
				c_error(&t.loc, "Missing ']' after array offset\n");
			lex_adv(lx);

			return n_node;
		case TOK_LPR: //Function calls
			//Check for a cast expression
			lex_adv(lx);
			if (is_type_spec(lx, lex_peek(lx))) {
				lex_unget(lx, make_tok_node(lex_peek(lx)));
				lex_unget(lx, make_tok_node(t));
				break;
			}
			n_node = astn_new(EXPR, EXPR_CALL, t);
			n_node->dat.expr.left = node;

			//Empty parameter list
			if (lex_peek(lx).type == TOK_RPR) {
				lex_adv(lx);
				return n_node;
			}

			//Get parameter list
			n_node->dat.expr.right = parse_expr_arglist(lx);
			
			t = lex_peek(lx);
			if (t.type != TOK_RPR)
				c_error(&t.loc, "Missing ')' after parameter list\n");
			lex_adv(lx);
			s_type *type = astn_type(n_node);

			return n_node;
		case TOK_PRD:
		case TOK_PTR:
			n_node = astn_new(EXPR, (t.type == TOK_PRD) ? EXPR_MEMB : EXPR_PTR_MEMB, t);
			lex_adv(lx);

			//Check for identifier
			t = lex_peek(lx);
			if (t.type != TOK_IDENT) {
				c_error(&t.loc, "Expected identifier after '%s'\n",
					(t.type == TOK_PRD) ? "." : "->");
			}
			n_node->dat.expr.left = node;
			n_node->dat.expr.right = astn_new(EXPR, EXPR_IDENT, t);
			lex_adv(lx);
			return n_node;
		case TOK_INC:
			n_node = astn_new(EXPR, EXPR_INC_POST, t);
			n_node->dat.expr.left = node;
			lex_adv(lx);
			return n_node;
		case TOK_DEC:
			n_node = astn_new(EXPR, EXPR_INC_POST, t);
			n_node->dat.expr.left = node;
			lex_adv(lx);
			return n_node;
	}

	return node;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1d0, %rsp            # imm = 0x1D0
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
callq 0xd740
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rsi
leaq -0x50(%rbp), %rdi
callq 0x9790
movl -0x50(%rbp), %eax
addl $-0x4, %eax
movl %eax, %ecx
movq %rcx, -0x180(%rbp)
subl $0x20, %eax
ja 0xd6b9
movq -0x180(%rbp), %rax
leaq 0x5771(%rip), %rcx      # 0x12a20
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movups -0x50(%rbp), %xmm0
movups -0x40(%rbp), %xmm1
movups -0x30(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
movl $0x1, %edi
movl $0x1e, %esi
callq 0x3350
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x10(%rbp), %rdi
callq 0xc0a0
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x10(%rbp), %rsi
leaq -0x80(%rbp), %rdi
callq 0x9790
leaq -0x50(%rbp), %rdi
leaq -0x80(%rbp), %rsi
movl $0x30, %edx
callq 0x3160
cmpl $0xa, -0x50(%rbp)
je 0xd349
leaq -0x50(%rbp), %rdi
addq $0x8, %rdi
leaq 0x5d49(%rip), %rsi      # 0x1308b
movb $0x0, %al
callq 0x3880
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd6c1
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x10(%rbp), %rax
movq %rax, -0x188(%rbp)
movq -0x10(%rbp), %rsi
leaq -0xb0(%rbp), %rdi
callq 0x9790
movq -0x188(%rbp), %rdi
movups -0xb0(%rbp), %xmm0
movups -0xa0(%rbp), %xmm1
movups -0x90(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
callq 0x9a20
cmpl $0x0, %eax
je 0xd44b
movq -0x10(%rbp), %rax
movq %rax, -0x198(%rbp)
movq -0x10(%rbp), %rsi
leaq -0xe0(%rbp), %rdi
callq 0x9790
movups -0xe0(%rbp), %xmm0
movups -0xd0(%rbp), %xmm1
movups -0xc0(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
callq 0x9aa0
movq -0x198(%rbp), %rdi
movq %rax, %rsi
callq 0x99d0
movq -0x10(%rbp), %rax
movq %rax, -0x190(%rbp)
movups -0x50(%rbp), %xmm0
movups -0x40(%rbp), %xmm1
movups -0x30(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
callq 0x9aa0
movq -0x190(%rbp), %rdi
movq %rax, %rsi
callq 0x99d0
jmp 0xd6b9
movups -0x50(%rbp), %xmm0
movups -0x40(%rbp), %xmm1
movups -0x30(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
movl $0x1, %edi
movl $0x1f, %esi
callq 0x3350
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rsi
leaq -0x110(%rbp), %rdi
callq 0x9790
cmpl $0x8, -0x110(%rbp)
jne 0xd4b3
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd6c1
movq -0x10(%rbp), %rdi
callq 0xd6d0
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x10(%rbp), %rsi
leaq -0x140(%rbp), %rdi
callq 0x9790
leaq -0x50(%rbp), %rdi
leaq -0x140(%rbp), %rsi
movl $0x30, %edx
callq 0x3160
cmpl $0x8, -0x50(%rbp)
je 0xd508
leaq -0x50(%rbp), %rdi
addq $0x8, %rdi
leaq 0x5af9(%rip), %rsi      # 0x12ffa
movb $0x0, %al
callq 0x3880
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x20(%rbp), %rdi
callq 0x3500
movq %rax, -0x148(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd6c1
movl -0x50(%rbp), %ecx
movl $0x21, %esi
movl $0x20, %eax
cmpl $0x4, %ecx
cmovel %eax, %esi
movups -0x50(%rbp), %xmm0
movups -0x40(%rbp), %xmm1
movups -0x30(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
movl $0x1, %edi
callq 0x3350
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x10(%rbp), %rsi
leaq -0x178(%rbp), %rdi
callq 0x9790
leaq -0x50(%rbp), %rdi
leaq -0x178(%rbp), %rsi
movl $0x30, %edx
callq 0x3160
cmpl $0x35, -0x50(%rbp)
je 0xd5cb
leaq -0x50(%rbp), %rdi
addq $0x8, %rdi
movl -0x50(%rbp), %ecx
leaq 0x4d53(%rip), %rdx      # 0x12302
leaq 0x52cb(%rip), %rax      # 0x12881
cmpl $0x4, %ecx
cmoveq %rax, %rdx
leaq 0x5ae7(%rip), %rsi      # 0x130ab
movb $0x0, %al
callq 0x3880
movq -0x18(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x20(%rax)
movups -0x50(%rbp), %xmm0
movups -0x40(%rbp), %xmm1
movups -0x30(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
movl $0x1, %edi
movl $0x24, %esi
callq 0x3350
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd6c1
movups -0x50(%rbp), %xmm0
movups -0x40(%rbp), %xmm1
movups -0x30(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
movl $0x1, %edi
movl $0x22, %esi
callq 0x3350
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd6c1
movups -0x50(%rbp), %xmm0
movups -0x40(%rbp), %xmm1
movups -0x30(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
movl $0x1, %edi
movl $0x22, %esi
callq 0x3350
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd6c1
movq -0x18(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x1d0, %rsp            # imm = 0x1D0
popq %rbp
retq
nop