«   2020/07   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Tags
more
Archives
Today
0
Total
1,731
관리 메뉴

넓적부리의 작업실

If~Else, Begin~End 명령어 구현 (3) 본문

CSharp/PEBakery

If~Else, Begin~End 명령어 구현 (3)

넓적부리 2016. 9. 22. 11:39

이번 포스팅에서는 지난 포스팅에 이어 If~Else, Begin~End가 중첩이 되는 경우, 어떻게 처리해야 하는가를 살펴보고자 합니다.



3. If 문의 중첩

1) If 2중 중첩

- 컴파일 전
If,%A%,Equal,A,If,%B%,Equal,B,Set,%C%,C
Echo,EndOfSection

- 컴파일 후
IfCompact,%A%,Equal,A
Jump,Relative,2
Jump,Relative,5
IfCompact,%B%,Equal,B

Jump,Relative,2

Jump,Relative,2

Set,%C%,C
Echo,EndOfSection

2) If 3중 중첩

- 컴파일 전
If,%A%,Equal,A,If,%B%,Equal,B,If,%C%,Equal,C,Set,%D%,D
Echo,EndOfSection

- 컴파일 후
IfCompact,%A%,Equal,A
Jump,Relative,2
Jump,Relative,8
IfCompact,%B%,Equal,B
Jump,Relative,2
Jump,Relative,5
IfCompact,%B%,Equal,C
Jump,Relative,2
Jump,Relative,2
Set,%D%,D
Echo,EndOfSection

3) If 2중 중첩과 Else

- 컴파일 전
If,%A%,Equal,A,If,%B%,Equal,B,Set,%C%,C
Else,Set,%Z%,Z
Echo,EndOfSection

- 컴파일 후
IfCompact,%A%,Equal,A
Jump,Relative,2
Jump,Relative,5
IfCompact,%B%,Equal,B

Jump,Relative,2

Jump,Relative,2

Set,%C%,C

Jump,Relative,2

Set,%Z%,Z
Echo,EndOfSection

4) If 2중 중첩과 Else 2중 중첩

- 컴파일 전
If,%A%,Equal,A,If,%B%,Equal,B,Set,%C%,C
Else,If,%Y%,Equal,Y,Set,%Z%,Z
Echo,EndOfSection

- 컴파일 후
IfCompact,%A%,Equal,A
Jump,Relative,2
Jump,Relative,5
IfCompact,%B%,Equal,B
Jump,Relative,2
Jump,Relative,2
Set,%C%,C
Jump,Relative,5
IfCompact,%Y%,Equal,Y
Jump,Relative,2
Jump,Relative,2
Set,%Z%,Z
Echo,EndOfSection

위 예시들을 종합하면, 중첩이 존재하는 If~Else, Begin~End 문을 다음과 같이 일반화할 수 있습니다.

5) 일반화 - If 다중 중첩

- 컴파일 전
If,<Condition1>,If,<Condition2>, ... ,If,<ConditionN>,Begin
(X commands)
End
Else,Begin
(Y commands)
End
Echo,EndOfSection

- 컴파일 후

IfCompact,<Condition1>
Jump,Relative,2
Jump,Relative,3(N-1)+X+1
IfCompact,<Condition2>
Jump,Relative,2
Jump,Relative,3(N-2)+X+1
(...)
IfCompact,<ConditionN>
Jump,Relative,2
Jump,Relative,X+1
(X commands)
Jump,Relative,Y+1
(Y commands)
Echo,EndOfSection

6) 일반화 - If 다중 중첩, Begin~End 중첩

- 컴파일 전
If,<Condition1>,If,<Condition2>, ... ,If,<ConditionN>,Begin
(W commands)
If,<NestCond1>,If,<NestCond2>, ... ,If,<NestCondM>,Begin
(X commands)
End
(Y commands)
End
Else,Begin
(Z commands)
End
Echo,EndOfSection

- 컴파일 후
IfCompact,<Condition1>
Jump,Relative,2
Jump,Relative,3(N-1)+3M+W+1
IfCompact,<Condition2>
Jump,Relative,2
Jump,Relative,3(N-2)+3M+W+1
(...)
IfCompact,<ConditionN>
Jump,Relative,2
Jump,Relative,3M+W+1
(W commands)
IfCompact,<NestCond1>
Jump,Relative,2
Jump,Relative,3(M-1)+X+1
IfCompact,<NestCond2>
Jump,Relative,2
Jump,Relative,3(M-2)+X+1
(...)
IfCompact,<NestCondM>
Jump,Relative,2
Jump,Relative,X+1
(X commands)
(Y commands)
Jump,Relative,Z+1
(Z commands)
Echo,EndOfSection


0 Comments
댓글쓰기 폼