// File: lhydave[P]SysYCompilerLab/main.cpp
// Function: main
int main(int argc, char **argv)
{
	bool S = false, e = false, t = false, v = false;
	string output_s;
	// parse args
	for (auto i = 0; i < argc; i++)
	{
		if (argv[i][0] == '-')
		{
			switch (argv[i][1])
			{
			case 'S': S = true; break;
			case 'e': e = true; break;
			case 't': t = true; break;
			case 'v': v = true; break;
			case 'o':
				if (argv[i + 1] == nullptr)
				{
					printf("no output file dedicated");
					return 0;
				}
				output_s = argv[++i];
				break;
			default: printf("unrecognized parameter\n"); return 0;
			}
		}
		else
			yyin = fopen(argv[i], "r");
	}
	if (!S)
	{
		printf("not support yet!\n");
		return 0;
	}
	if (e && t)
	{
		printf("at most one parameter can be dedicated.\n");
		return 0;
	}
	if (!yyin)
	{
		printf("no valid input file!\n");
		return 0;
	}
	sysY_AST::init_tables();
	do
	{
		yyparse();
	} while (!feof(yyin));
	sysY_AST::check_main();
	if (has_err)
		return 1;
	if (e) // generate eeyore
	{
		auto out_f = fopen(output_s.c_str(), "w");
		fprintf(out_f, "%s", sysY_AST::root->code.c_str());
		return 0;
	}
	else if (v) // debug
	{
		auto out_f = fopen("eeyore.out", "w");
		fprintf(out_f, "%s", sysY_AST::root->code.c_str());
		fflush(out_f);
	}
	// generate tigger
	eeyore_AST::build_AST(sysY_AST::root->code);
	no_alloc::gen_code();
	if (t)
	{
		auto out_f = fopen(output_s.c_str(), "w");
		fprintf(out_f, "%s", tigger_dst.str().c_str());
		return 0;
	}
	else if (v)
	{
		auto out_f = fopen("tigger.out", "w");
		fprintf(out_f, "%s", tigger_dst.str().c_str());
		fflush(out_f);
	}
	// generate risc-v code
	riscv::gen_code();
	if (!(e || t))
	{
		auto out_f = fopen(output_s.c_str(), "w");
		fprintf(out_f, "%s", riscv_dst.str().c_str());
		return 0;
	}
	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x140, %rsp            # imm = 0x140
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movb $0x0, -0x11(%rbp)
movb $0x0, -0x12(%rbp)
movb $0x0, -0x13(%rbp)
movb $0x0, -0x14(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x54c0
movl $0x0, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
cmpl -0x8(%rbp), %eax
jge 0x21be6
movq -0x10(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsbl (%rax), %eax
cmpl $0x2d, %eax
jne 0x21ba4
movq -0x10(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsbl 0x1(%rax), %eax
addl $-0x53, %eax
movl %eax, %ecx
movq %rcx, -0xe0(%rbp)
subl $0x23, %eax
ja 0x21b7f
movq -0xe0(%rbp), %rax
leaq 0x2c70c(%rip), %rcx     # 0x4e1ec
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movb $0x1, -0x11(%rbp)
jmp 0x21ba2
movb $0x1, -0x12(%rbp)
jmp 0x21ba2
movb $0x1, -0x13(%rbp)
jmp 0x21ba2
movb $0x1, -0x14(%rbp)
jmp 0x21ba2
movq -0x10(%rbp), %rax
movl -0x3c(%rbp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
cmpq $0x0, (%rax,%rcx,8)
jne 0x21b5e
leaq 0x2c754(%rip), %rdi     # 0x4e27c
xorl %eax, %eax
callq 0x5070
jmp 0x21b31
movl $0x0, -0x4(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x21fb2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x56c0
jmp 0x21fc7
movq -0x10(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movl %ecx, %edx
incl %edx
movl %edx, -0x3c(%rbp)
movq 0x8(%rax,%rcx,8), %rsi
leaq -0x38(%rbp), %rdi
callq 0x54b0
jmp 0x21b7d
jmp 0x21ba2
leaq 0x2c70f(%rip), %rdi     # 0x4e295
xorl %eax, %eax
callq 0x5070
jmp 0x21b8f
movl $0x0, -0x4(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x21fb2
jmp 0x21bd6
movq -0x10(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
leaq 0x2ba07(%rip), %rsi     # 0x4d5be
callq 0x53d0
movq %rax, -0xe8(%rbp)
jmp 0x21bc5
movq -0xe8(%rbp), %rcx
leaq 0x507cd(%rip), %rax     # 0x723a0
movq %rcx, (%rax)
jmp 0x21bd8
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x21a89
testb $0x1, -0x11(%rbp)
jne 0x21c0f
leaq 0x2c6ba(%rip), %rdi     # 0x4e2ad
xorl %eax, %eax
callq 0x5070
jmp 0x21bfc
movl $0x0, -0x4(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x21fb2
testb $0x1, -0x12(%rbp)
je 0x21c3e
testb $0x1, -0x13(%rbp)
je 0x21c3e
leaq 0x2c69d(%rip), %rdi     # 0x4e2bf
xorl %eax, %eax
callq 0x5070
jmp 0x21c2b
movl $0x0, -0x4(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x21fb2
leaq 0x5075b(%rip), %rax     # 0x723a0
cmpq $0x0, (%rax)
jne 0x21c6e
leaq 0x2c696(%rip), %rdi     # 0x4e2e8
xorl %eax, %eax
callq 0x5070
jmp 0x21c5b
movl $0x0, -0x4(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x21fb2
callq 0x1ae30
jmp 0x21c75
jmp 0x21c77
callq 0x5f90
jmp 0x21c7e
jmp 0x21c80
leaq 0x50719(%rip), %rax     # 0x723a0
movq (%rax), %rdi
callq 0x5530
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x21c77
callq 0x1c640
jmp 0x21ca2
testb $0x1, 0x50807(%rip)     # 0x724b0
je 0x21cbe
movl $0x1, -0x4(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x21fb2
testb $0x1, -0x12(%rbp)
je 0x21d36
leaq -0x38(%rbp), %rdi
callq 0x5160
movq %rax, %rdi
leaq 0x2ba42(%rip), %rsi     # 0x4d719
callq 0x53d0
movq %rax, -0xf0(%rbp)
jmp 0x21ce5
movq -0xf0(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq 0x507a6(%rip), %rdi     # 0x724a8
addq $0x18, %rdi
callq 0x5160
movq -0xf8(%rbp), %rdi
movq %rax, %rdx
leaq 0x2c5e2(%rip), %rsi     # 0x4e2fe
movb $0x0, %al
callq 0x54e0
movl $0x0, -0x4(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x21fb2
testb $0x1, -0x14(%rbp)
je 0x21da3
leaq 0x2c5be(%rip), %rdi     # 0x4e301
leaq 0x2b9cf(%rip), %rsi     # 0x4d719
callq 0x53d0
movq %rax, -0x100(%rbp)
jmp 0x21d58
movq -0x100(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movq %rax, -0x108(%rbp)
movq 0x50733(%rip), %rdi     # 0x724a8
addq $0x18, %rdi
callq 0x5160
movq -0x108(%rbp), %rdi
movq %rax, %rdx
leaq 0x2c56f(%rip), %rsi     # 0x4e2fe
xorl %eax, %eax
callq 0x54e0
movq -0x60(%rbp), %rdi
callq 0x53c0
jmp 0x21da1
jmp 0x21da3
jmp 0x21da5
movq 0x506fc(%rip), %rdi     # 0x724a8
addq $0x18, %rdi
callq 0x220c0
jmp 0x21db7
callq 0x3ef60
jmp 0x21dbe
testb $0x1, -0x13(%rbp)
je 0x21e57
leaq -0x38(%rbp), %rdi
callq 0x5160
movq %rax, %rdi
leaq 0x2b93e(%rip), %rsi     # 0x4d719
callq 0x53d0
movq %rax, -0x110(%rbp)
jmp 0x21de9
movq -0x110(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0x118(%rbp)
leaq 0x506b2(%rip), %rsi     # 0x724b8
leaq -0x88(%rbp), %rdi
callq 0x5330
jmp 0x21e14
leaq -0x88(%rbp), %rdi
callq 0x5160
movq -0x118(%rbp), %rdi
movq %rax, %rdx
leaq 0x2c4cd(%rip), %rsi     # 0x4e2fe
movb $0x0, %al
callq 0x54e0
leaq -0x88(%rbp), %rdi
callq 0x56c0
movl $0x0, -0x4(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x21fb2
testb $0x1, -0x14(%rbp)
je 0x21ef5
leaq 0x2c4a4(%rip), %rdi     # 0x4e30c
leaq 0x2b8aa(%rip), %rsi     # 0x4d719
callq 0x53d0
movq %rax, -0x120(%rbp)
jmp 0x21e7d
movq -0x120(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rax
movq %rax, -0x128(%rbp)
leaq 0x50618(%rip), %rsi     # 0x724b8
leaq -0xb0(%rbp), %rdi
callq 0x5330
jmp 0x21eae
leaq -0xb0(%rbp), %rdi
movq %rdi, -0x130(%rbp)
callq 0x5160
movq -0x128(%rbp), %rdi
movq %rax, %rdx
leaq 0x2c42c(%rip), %rsi     # 0x4e2fe
xorl %eax, %eax
callq 0x54e0
movq -0x130(%rbp), %rdi
callq 0x56c0
movq -0x90(%rbp), %rdi
callq 0x53c0
jmp 0x21ef3
jmp 0x21ef5
jmp 0x21ef7
callq 0x459b0
jmp 0x21efe
testb $0x1, -0x12(%rbp)
jne 0x21fa4
testb $0x1, -0x13(%rbp)
jne 0x21fa4
leaq -0x38(%rbp), %rdi
callq 0x5160
movq %rax, %rdi
leaq 0x2b7f4(%rip), %rsi     # 0x4d719
callq 0x53d0
movq %rax, -0x138(%rbp)
jmp 0x21f33
movq -0x138(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq -0xb8(%rbp), %rax
movq %rax, -0x140(%rbp)
leaq 0x506da(%rip), %rsi     # 0x72630
leaq -0xd8(%rbp), %rdi
callq 0x5330
jmp 0x21f64
leaq -0xd8(%rbp), %rdi
callq 0x5160
movq -0x140(%rbp), %rdi
movq %rax, %rdx
leaq 0x2c37d(%rip), %rsi     # 0x4e2fe
movb $0x0, %al
callq 0x54e0
leaq -0xd8(%rbp), %rdi
callq 0x56c0
movl $0x0, -0x4(%rbp)
movl $0x1, -0x50(%rbp)
jmp 0x21fb2
movl $0x0, -0x4(%rbp)
movl $0x1, -0x50(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x56c0
movl -0x4(%rbp), %eax
addq $0x140, %rsp            # imm = 0x140
popq %rbp
retq
movq -0x48(%rbp), %rdi
callq 0x5610