// File: Caproner[P]Naive_Compiler/main.cpp
// Function: main
int main(int argc,char *argv[])
{
	Lexical L;
	L.init();
	
	Grammar G;
	G.init();
	
	Semantic S;
	S.init();
	
	FILE *Input;
	if(argc!=1)Input=fopen(argv[1],"r");
	else cout<<"[Naive by Caproner]\nWelcome to use Naive_C!\n > ";
	
	string s;
	while(true)
	{
		if(argc==1)
		{
			if(!getline(cin,s))break;
		}
		else
		{
			if(fgets(Read,100000,Input)==NULL)break;
			s=Read;
		}
		L.Input(s);
		if(!L.Analysis())
		{
			cout<<"Error：词法分析出错"<<endl<<" > ";
			continue;
		}
		
		Word_List WL=L.Output();
		#ifdef TEST
		for(int i=0;i<WL.List.size();i++)
		{
			cout<<"["<<WL.List[i].Number<<","<<WL.List[i].Value<<"]"<<endl;
		}
		cout<<"词法分析结束"<<endl;
		#endif
		
		G.Input(WL);
		if(!G.Analysis())
		{
			cout<<"Error：语法分析出错"<<endl<<" > ";
			continue;
		}
		
		Forest F=G.Output();
		#ifdef TEST
		for(int i=0;i<F.forest.size();i++)
		{
			cout<<"输出第"<<i+1<<"棵语法树"<<endl;
			print(F.forest[i]);
		}
		cout<<"语法分析结束"<<endl;
		#endif
		
		if(!S.Analysis(F))
		{
			cout<<"Error：语义分析出错"<<endl<<" > ";
			continue; 
		}
		
		#ifdef TEST
		for(int i=0;i<F.forest.size();i++)
		{
			cout<<"输出第"<<i+1<<"棵语法树"<<endl;
			print(F.forest[i]);
		}
		cout<<"语义分析结束"<<endl;
		#endif
		cout<<" > ";
	}
	
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x340, %rsp            # imm = 0x340
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
leaq -0x78(%rbp), %rdi
movq %rdi, -0x2d0(%rbp)
callq 0x2c30
movq -0x2d0(%rbp), %rdi
callq 0x71f0
jmp 0x2727
leaq -0x200(%rbp), %rdi
callq 0x2c70
jmp 0x2735
leaq -0x200(%rbp), %rdi
callq 0x9430
jmp 0x2743
leaq -0x230(%rbp), %rdi
movq %rdi, -0x2d8(%rbp)
callq 0x2d70
movq -0x2d8(%rbp), %rdi
callq 0x10900
jmp 0x2764
cmpl $0x1, -0x8(%rbp)
je 0x27d3
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
leaq 0xf9b9(%rip), %rsi      # 0x12132
callq 0x2290
movq %rax, -0x2e0(%rbp)
jmp 0x2787
movq -0x2e0(%rbp), %rax
movq %rax, -0x238(%rbp)
jmp 0x27ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
jmp 0x2bd1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
jmp 0x2bc5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
jmp 0x2bb9
movq 0x1a7f6(%rip), %rdi     # 0x1cfd0
leaq 0xf85f(%rip), %rsi      # 0x12040
callq 0x2200
jmp 0x27e8
jmp 0x27ea
leaq -0x258(%rbp), %rdi
callq 0x22c0
jmp 0x27f8
cmpl $0x1, -0x8(%rbp)
jne 0x285f
movq 0x1a7db(%rip), %rdi     # 0x1cfe0
leaq -0x258(%rbp), %rsi
callq 0x2080
movq %rax, -0x2e8(%rbp)
jmp 0x281a
movq -0x2e8(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x2100
movb %al, -0x2e9(%rbp)
jmp 0x2838
movb -0x2e9(%rbp), %al
testb $0x1, %al
jne 0x2844
jmp 0x285d
jmp 0x2b74
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
jmp 0x2bad
jmp 0x28a9
movq -0x238(%rbp), %rdx
leaq 0x1a9b3(%rip), %rdi     # 0x1d220
movl $0x186a0, %esi          # imm = 0x186A0
callq 0x2300
movq %rax, -0x2f8(%rbp)
jmp 0x2880
movq -0x2f8(%rbp), %rax
cmpq $0x0, %rax
jne 0x2892
jmp 0x2b74
leaq 0x1a987(%rip), %rsi     # 0x1d220
leaq -0x258(%rbp), %rdi
callq 0x22b0
jmp 0x28a7
jmp 0x28a9
leaq -0x278(%rbp), %rdi
leaq -0x258(%rbp), %rsi
callq 0x20e0
jmp 0x28be
leaq -0x78(%rbp), %rdi
leaq -0x278(%rbp), %rsi
callq 0x7210
jmp 0x28d0
leaq -0x278(%rbp), %rdi
callq 0x2140
leaq -0x78(%rbp), %rdi
callq 0x7240
movb %al, -0x2f9(%rbp)
jmp 0x28ed
movb -0x2f9(%rbp), %al
testb $0x1, %al
jne 0x296b
jmp 0x28f9
movq 0x1a6d0(%rip), %rdi     # 0x1cfd0
leaq 0xf769(%rip), %rsi      # 0x12070
callq 0x2200
movq %rax, -0x308(%rbp)
jmp 0x2915
movq -0x308(%rbp), %rdi
movq 0x1a69d(%rip), %rsi     # 0x1cfc0
callq 0x2240
movq %rax, -0x310(%rbp)
jmp 0x2931
movq -0x310(%rbp), %rdi
leaq 0xf72d(%rip), %rsi      # 0x1206c
callq 0x2200
jmp 0x2946
jmp 0x27f6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
leaq -0x278(%rbp), %rdi
callq 0x2140
jmp 0x2bad
leaq -0x290(%rbp), %rdi
leaq -0x78(%rbp), %rsi
callq 0x72f0
jmp 0x297d
leaq -0x2a8(%rbp), %rdi
leaq -0x290(%rbp), %rsi
callq 0x2d90
jmp 0x2992
leaq -0x200(%rbp), %rdi
leaq -0x2a8(%rbp), %rsi
callq 0x9870
jmp 0x29a7
leaq -0x2a8(%rbp), %rdi
callq 0x2dc0
leaq -0x200(%rbp), %rdi
callq 0x9950
movb %al, -0x311(%rbp)
jmp 0x29c7
movb -0x311(%rbp), %al
testb $0x1, %al
jne 0x2a67
jmp 0x29d7
movq 0x1a5f2(%rip), %rdi     # 0x1cfd0
leaq 0xf6a6(%rip), %rsi      # 0x1208b
callq 0x2200
movq %rax, -0x320(%rbp)
jmp 0x29f3
movq -0x320(%rbp), %rdi
movq 0x1a5bf(%rip), %rsi     # 0x1cfc0
callq 0x2240
movq %rax, -0x328(%rbp)
jmp 0x2a0f
movq -0x328(%rbp), %rdi
leaq 0xf64f(%rip), %rsi      # 0x1206c
callq 0x2200
jmp 0x2a24
movl $0x2, -0x2ac(%rbp)
jmp 0x2b44
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
jmp 0x2b66
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
leaq -0x2a8(%rbp), %rdi
callq 0x2dc0
jmp 0x2b66
leaq -0x2c8(%rbp), %rdi
leaq -0x200(%rbp), %rsi
callq 0x99d0
jmp 0x2a7c
leaq -0x230(%rbp), %rdi
leaq -0x2c8(%rbp), %rsi
callq 0x10920
movb %al, -0x329(%rbp)
jmp 0x2a97
movb -0x329(%rbp), %al
testb $0x1, %al
jne 0x2b19
jmp 0x2aa3
movq 0x1a526(%rip), %rdi     # 0x1cfd0
leaq 0xf5f5(%rip), %rsi      # 0x120a6
callq 0x2200
movq %rax, -0x338(%rbp)
jmp 0x2abf
movq -0x338(%rbp), %rdi
movq 0x1a4f3(%rip), %rsi     # 0x1cfc0
callq 0x2240
movq %rax, -0x340(%rbp)
jmp 0x2adb
movq -0x340(%rbp), %rdi
leaq 0xf583(%rip), %rsi      # 0x1206c
callq 0x2200
jmp 0x2af0
movl $0x2, -0x2ac(%rbp)
jmp 0x2b38
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x80(%rbp)
movl %eax, -0x84(%rbp)
leaq -0x2c8(%rbp), %rdi
callq 0x2de0
jmp 0x2b66
movq 0x1a4b0(%rip), %rdi     # 0x1cfd0
leaq 0xf545(%rip), %rsi      # 0x1206c
callq 0x2200
jmp 0x2b2e
movl $0x0, -0x2ac(%rbp)
leaq -0x2c8(%rbp), %rdi
callq 0x2de0
leaq -0x290(%rbp), %rdi
callq 0x2dc0
movl -0x2ac(%rbp), %eax
testl %eax, %eax
je 0x2b61
jmp 0x2b5c
jmp 0x27f6
jmp 0x27f6
leaq -0x290(%rbp), %rdi
callq 0x2dc0
jmp 0x2bad
leaq -0x258(%rbp), %rdi
callq 0x2140
leaq -0x230(%rbp), %rdi
callq 0x2e00
leaq -0x200(%rbp), %rdi
callq 0x2e20
leaq -0x78(%rbp), %rdi
callq 0x2eb0
movl -0x4(%rbp), %eax
addq $0x340, %rsp            # imm = 0x340
popq %rbp
retq
leaq -0x258(%rbp), %rdi
callq 0x2140
leaq -0x230(%rbp), %rdi
callq 0x2e00
leaq -0x200(%rbp), %rdi
callq 0x2e20
leaq -0x78(%rbp), %rdi
callq 0x2eb0
movq -0x80(%rbp), %rdi
callq 0x2350
nopw %cs:(%rax,%rax)
nopl (%rax)