2011. 9. 27. 04:08

Dangling else 문제점.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
안녕하세요.
Geeks_Company 입니다.
오늘 설명 드릴 부분은 일명 dangling else 라는 문제 인데요.

즉 문법이 명확하지 않아서 모호한 문장이 생길수 있는데서 기반된 문제점입니다.

사전에서 dangle의 의미는 여러개 있지만, 이런걸 뜻합니다.
dangle from the ceiling
천장에 매달려 있다

대표로 쓰이는 예시입니다.
stmt = 
If stmt else stmt| If stmt 의 문법을 따를 경우,

if stmt if stmt else stmt 의 경우가 생길수 있으며,

윗부분은 소스상에서 2가지로 해석이 됩니다.

첫번째 경우
if (true)
{
  if (true) ;
  else ;
}

두번째 경우
if (true)
{
  if (true) ;
}
else ;

즉 밑에 댕길 댕길 달린 else를 명확하게 구분짓기 애매한 문법입니다.

구지 dangling else 구문 말고도, 항상 반복되는 문법을 보다 모면,

유사한 문제점을 갖을 수 있는 문법은 많습니다.

이런 dangling else 문제들은 이미 해결책이 존재 하지만,

이러한 문제에 직면했을때, 기억할 핵심 부분은 "N개의 구문이 1개의 문법으로 수렴 처리" 입니다.

예를 들겠습니다.

stmt = null
S1= stmt
S2= S2 | S1 
S3= S2 | S1

S3 
=> S2
=> S1
=> stmt 
=> null

위의 경우 S3, S2, S1 => stmt 로 수렴 하게 됩니다.
하지만 S2의 경우 S3의 경우를 볼수 없으므로, S3를 활용하여,
모호한 부분을 제거 할수 있습니다.

dangling else 역시 이렇게 처리 하면 됩니다.

경우
stmt =
1 : if stmt
2 : if stmt else stmt
3 : if if stmt 
4 : if stmt else if stmt

위의 경우 가 if else 반복 구문의 전체 경우 이며,

자세히 보시면 else 는 if 다음에 나온다는걸 알수 있습니다.

그러므로 if or if-else 후에 if 구문만 따로 붙는 문법을 만들고,

그회에는 if - else or if (if else ) else (if else) 로 처리를 하면

dangling else 구문은 해결됩니다.


그러면 문법을 정의 하면 이러 합니다.

stmt = ifelseStmt | onlyifStmt | variable_decl; 

// if ( if else ) else ( if else ) 가 있는 문법은 이곳에서 처리
ifelseStmt = if ifelseStmt else ifelseStmt
| stmt ;

// only if 만 중첩 되거나, if ( if ) else (if - else ) 문법은 이곳에서 처리. 
onlyifStmt = 
 if ifelseStmt 
| if onlyifStmt 
| if ifelseStmt else onlyifStmt


문법 확인 1)
only if 의 경우 
if onlyifstmt -> 반복. 
            if (true)
            {
                if (true)
                {
                    if (true)
                    {
                        ;
                    }
                }
            }

문법 확인 2)
only if 에 if else 구문의 경우.
if ( ifelseStmt )

            if (true)
            {
                if (true)
                {
                    ;
                }
                else ; 
            }

문법 확인 3)
if-else 구문에서 else 후 if 구문만 추가.
if (ifelseStmt->stmt) else (onlyifStmt) 

   if (true)
            {
;
            }
            else
            {
                if (true)
                {

                }
            }

문법 확인 4)
if - else 구문에서 else 후에 if-else 추가
if (ifelseStmt -> stmt) else (ifelseStmt) 
   if (true)
            {
                ;

            }
            else
            {
                if (true)
                {

                }
                else ; 
            }


문법 확인 5)
if else 구문에서 if 안에 if , else 안에 ifelse의경우

if (ifelsestmt ) else (ifelseStmt)
=> if(stmt) else (ifelseStmt)
=> if(onlyifStmt) else (ifelseStmt)

            if (true)
            {
                if (true)
                {
                    ;   
                }

            }
            else
            {
                if (true)
                {

                }
                else ; 
            }

감사 합니다.

'컴파일러 & 운영체제' 카테고리의 다른 글

DB 스키마 구문 분석기.  (0) 2011.11.10
파서 만들때 유념 할 사항.  (0) 2011.10.25
재귀 함수 활용 변수 선언문 처리 1.  (0) 2011.09.26
무제 part1  (0) 2011.09.22
Parser에서 재귀 함수의 역할  (0) 2011.09.21