// File: Caproner[P]Naive_Compiler/Semantic/Semantic.cpp
// Function: Semantic::DFS(TreeNode*)
bool Semantic::DFS(TreeNode *p)
{
	if(p->Next.size()==0)return true;
	
	for(int i=0;i<p->Next.size();i++)
	{
		if(!(this->DFS(p->Next[i])))return false;
	}
	
	if(p->Next.size()==1)
	{
		TreeNode *q=p->Next[0];
		p->Node_Word.Number=q->Node_Word.Number;
		p->Node_Word.Value=q->Node_Word.Value;
		return true;
	}
	
	if(p->Next.size()==2)
	{
		TreeNode *a=p->Next[0];
		TreeNode *b=p->Next[1];
		if(a->Node_Word.Number==1)
		{
			if(this->Var_Space.find(b->Node_Word.Value)!=this->Var_Space.end())
				return false;
			this->Var_Space[b->Node_Word.Value]=0;
			return true;
		}
		else
		{
			if(b->Node_Word.Number==3)
			{
				if(this->Var_Space.find(b->Node_Word.Value)==this->Var_Space.end())
					return false;
				printf("%lf\n",this->Var_Space[b->Node_Word.Value]);
				return true;
			}
			else
			{
				printf("%lf\n",b->Node_Word.Value);
				return true;
			}
		}
	}
	
	if(p->Next.size()==3)
	{
		TreeNode *a=p->Next[0];
		TreeNode *b=p->Next[1];
		TreeNode *c=p->Next[2];
		if(a->Node_Word.Number==10)
		{
			p->Node_Word.Number=b->Node_Word.Number;
			p->Node_Word.Value=b->Node_Word.Value;
			return true;
		}
		if(b->Node_Word.Number==9)
		{
			if(this->Var_Space.find(a->Node_Word.Value)==this->Var_Space.end())
				return false;
			this->Var_Space[a->Node_Word.Value]=c->Node_Word.Value;
			return true;
		}
		if(a->Node_Word.Number==3)
		{
			if(this->Var_Space.find(a->Node_Word.Value)==this->Var_Space.end())
				return false;
			a->Node_Word.Number=4;
			a->Node_Word.Value=this->Var_Space[a->Node_Word.Value];
		}
		if(c->Node_Word.Number==3)
		{
			if(this->Var_Space.find(c->Node_Word.Value)==this->Var_Space.end())
				return false;
			c->Node_Word.Number=4;
			c->Node_Word.Value=this->Var_Space[c->Node_Word.Value];
		}
		if((b->Node_Word.Number==8)&&(c->Node_Word.Value==0))return false;
		p->Node_Word.Number=4;
		if(b->Node_Word.Number==5)
			p->Node_Word.Value=a->Node_Word.Value+c->Node_Word.Value;
		if(b->Node_Word.Number==6)
			p->Node_Word.Value=a->Node_Word.Value-c->Node_Word.Value;
		if(b->Node_Word.Number==7)
			p->Node_Word.Value=a->Node_Word.Value*c->Node_Word.Value;
		if(b->Node_Word.Number==8)
			p->Node_Word.Value=a->Node_Word.Value/c->Node_Word.Value;
		return true;
	}
	
	if(p->Next.size()==4)
	{
		TreeNode *a=p->Next[0];
		TreeNode *b=p->Next[1];
		TreeNode *c=p->Next[2];
		TreeNode *d=p->Next[3];
		if(this->Var_Space.find(b->Node_Word.Value)!=this->Var_Space.end())
			return false;
		this->Var_Space[b->Node_Word.Value]=d->Node_Word.Value;
		return true;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xf0, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
callq 0x2bf0
cmpq $0x0, %rax
jne 0x102da
movb $0x1, -0x1(%rbp)
jmp 0x108e7
movl $0x0, -0x1c(%rbp)
movslq -0x1c(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
callq 0x2bf0
movq %rax, %rcx
movq -0xe0(%rbp), %rax
cmpq %rcx, %rax
jae 0x10342
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
movslq -0x1c(%rbp), %rsi
callq 0x2c10
movq -0xd8(%rbp), %rdi
movq (%rax), %rsi
callq 0x102a0
testb $0x1, %al
jne 0x10335
movb $0x0, -0x1(%rbp)
jmp 0x108e7
jmp 0x10337
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x102e1
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
callq 0x2bf0
cmpq $0x1, %rax
jne 0x10394
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x2c10
movq (%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movl (%rax), %ecx
movq -0x18(%rbp), %rax
movl %ecx, (%rax)
movq -0x28(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movb $0x1, -0x1(%rbp)
jmp 0x108e7
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
callq 0x2bf0
cmpq $0x2, %rax
jne 0x104e9
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x2c10
movq (%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
movl $0x1, %esi
callq 0x2c10
movq (%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x30(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x1044d
movq -0xd8(%rbp), %rdi
movq -0x38(%rbp), %rsi
addq $0x8, %rsi
callq 0x109e0
movq -0xd8(%rbp), %rdi
movq %rax, -0x40(%rbp)
callq 0x10a10
movq %rax, -0x48(%rbp)
leaq -0x40(%rbp), %rdi
leaq -0x48(%rbp), %rsi
callq 0x109b0
testb $0x1, %al
jne 0x10420
jmp 0x10429
movb $0x0, -0x1(%rbp)
jmp 0x108e7
movq -0xd8(%rbp), %rdi
movq -0x38(%rbp), %rsi
addq $0x8, %rsi
callq 0x10a40
xorps %xmm0, %xmm0
movsd %xmm0, (%rax)
movb $0x1, -0x1(%rbp)
jmp 0x108e7
movq -0x38(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x104c9
movq -0xd8(%rbp), %rdi
movq -0x38(%rbp), %rsi
addq $0x8, %rsi
callq 0x109e0
movq -0xd8(%rbp), %rdi
movq %rax, -0x50(%rbp)
callq 0x10a10
movq %rax, -0x58(%rbp)
leaq -0x50(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x10b20
testb $0x1, %al
jne 0x10491
jmp 0x1049a
movb $0x0, -0x1(%rbp)
jmp 0x108e7
movq -0xd8(%rbp), %rdi
movq -0x38(%rbp), %rsi
addq $0x8, %rsi
callq 0x10a40
movsd (%rax), %xmm0
leaq 0x1d0f(%rip), %rdi      # 0x121c8
movb $0x1, %al
callq 0x2050
movb $0x1, -0x1(%rbp)
jmp 0x108e7
movq -0x38(%rbp), %rax
movsd 0x8(%rax), %xmm0
leaq 0x1cef(%rip), %rdi      # 0x121c8
movb $0x1, %al
callq 0x2050
movb $0x1, -0x1(%rbp)
jmp 0x108e7
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
callq 0x2bf0
cmpq $0x3, %rax
jne 0x107d2
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x2c10
movq (%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
movl $0x1, %esi
callq 0x2c10
movq (%rax), %rax
movq %rax, -0x68(%rbp)
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
movl $0x2, %esi
callq 0x2c10
movq (%rax), %rax
movq %rax, -0x70(%rbp)
movq -0x60(%rbp), %rax
cmpl $0xa, (%rax)
jne 0x1057a
movq -0x68(%rbp), %rax
movl (%rax), %ecx
movq -0x18(%rbp), %rax
movl %ecx, (%rax)
movq -0x68(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movb $0x1, -0x1(%rbp)
jmp 0x108e7
movq -0x68(%rbp), %rax
cmpl $0x9, (%rax)
jne 0x10601
movq -0xd8(%rbp), %rdi
movq -0x60(%rbp), %rsi
addq $0x8, %rsi
callq 0x109e0
movq -0xd8(%rbp), %rdi
movq %rax, -0x78(%rbp)
callq 0x10a10
movq %rax, -0x80(%rbp)
leaq -0x78(%rbp), %rdi
leaq -0x80(%rbp), %rsi
callq 0x10b20
testb $0x1, %al
jne 0x105be
jmp 0x105c7
movb $0x0, -0x1(%rbp)
jmp 0x108e7
movq -0xd8(%rbp), %rdi
movq -0x70(%rbp), %rax
movsd 0x8(%rax), %xmm0
movsd %xmm0, -0xe8(%rbp)
movq -0x60(%rbp), %rsi
addq $0x8, %rsi
callq 0x10a40
movsd -0xe8(%rbp), %xmm0
movsd %xmm0, (%rax)
movb $0x1, -0x1(%rbp)
jmp 0x108e7
movq -0x60(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x10685
movq -0xd8(%rbp), %rdi
movq -0x60(%rbp), %rsi
addq $0x8, %rsi
callq 0x109e0
movq -0xd8(%rbp), %rdi
movq %rax, -0x88(%rbp)
callq 0x10a10
movq %rax, -0x90(%rbp)
leaq -0x88(%rbp), %rdi
leaq -0x90(%rbp), %rsi
callq 0x10b20
testb $0x1, %al
jne 0x10651
jmp 0x1065a
movb $0x0, -0x1(%rbp)
jmp 0x108e7
movq -0xd8(%rbp), %rdi
movq -0x60(%rbp), %rax
movl $0x4, (%rax)
movq -0x60(%rbp), %rsi
addq $0x8, %rsi
callq 0x10a40
movsd (%rax), %xmm0
movq -0x60(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movq -0x70(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x10709
movq -0xd8(%rbp), %rdi
movq -0x70(%rbp), %rsi
addq $0x8, %rsi
callq 0x109e0
movq -0xd8(%rbp), %rdi
movq %rax, -0x98(%rbp)
callq 0x10a10
movq %rax, -0xa0(%rbp)
leaq -0x98(%rbp), %rdi
leaq -0xa0(%rbp), %rsi
callq 0x10b20
testb $0x1, %al
jne 0x106d5
jmp 0x106de
movb $0x0, -0x1(%rbp)
jmp 0x108e7
movq -0xd8(%rbp), %rdi
movq -0x70(%rbp), %rax
movl $0x4, (%rax)
movq -0x70(%rbp), %rsi
addq $0x8, %rsi
callq 0x10a40
movsd (%rax), %xmm0
movq -0x70(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movq -0x68(%rbp), %rax
cmpl $0x8, (%rax)
jne 0x1072f
movq -0x70(%rbp), %rax
movsd 0x8(%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x1072f
jp 0x1072f
movb $0x0, -0x1(%rbp)
jmp 0x108e7
movq -0x18(%rbp), %rax
movl $0x4, (%rax)
movq -0x68(%rbp), %rax
cmpl $0x5, (%rax)
jne 0x1075d
movq -0x60(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x70(%rbp), %rax
addsd 0x8(%rax), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movq -0x68(%rbp), %rax
cmpl $0x6, (%rax)
jne 0x10781
movq -0x60(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x70(%rbp), %rax
subsd 0x8(%rax), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movq -0x68(%rbp), %rax
cmpl $0x7, (%rax)
jne 0x107a5
movq -0x60(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x70(%rbp), %rax
mulsd 0x8(%rax), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movq -0x68(%rbp), %rax
cmpl $0x8, (%rax)
jne 0x107c9
movq -0x60(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x70(%rbp), %rax
divsd 0x8(%rax), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movb $0x1, -0x1(%rbp)
jmp 0x108e7
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
callq 0x2bf0
cmpq $0x4, %rax
jne 0x108e5
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x2c10
movq (%rax), %rax
movq %rax, -0xa8(%rbp)
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
movl $0x1, %esi
callq 0x2c10
movq (%rax), %rax
movq %rax, -0xb0(%rbp)
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
movl $0x2, %esi
callq 0x2c10
movq (%rax), %rax
movq %rax, -0xb8(%rbp)
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
movl $0x3, %esi
callq 0x2c10
movq -0xd8(%rbp), %rdi
movq (%rax), %rax
movq %rax, -0xc0(%rbp)
movq -0xb0(%rbp), %rsi
addq $0x8, %rsi
callq 0x109e0
movq -0xd8(%rbp), %rdi
movq %rax, -0xc8(%rbp)
callq 0x10a10
movq %rax, -0xd0(%rbp)
leaq -0xc8(%rbp), %rdi
leaq -0xd0(%rbp), %rsi
callq 0x109b0
testb $0x1, %al
jne 0x108a2
jmp 0x108a8
movb $0x0, -0x1(%rbp)
jmp 0x108e7
movq -0xd8(%rbp), %rdi
movq -0xc0(%rbp), %rax
movsd 0x8(%rax), %xmm0
movsd %xmm0, -0xf0(%rbp)
movq -0xb0(%rbp), %rsi
addq $0x8, %rsi
callq 0x10a40
movsd -0xf0(%rbp), %xmm0
movsd %xmm0, (%rax)
movb $0x1, -0x1(%rbp)
jmp 0x108e7
ud2
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0xf0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)