2011. 9. 27. 04:08
Dangling else 문제점.
2011. 9. 27. 04:08 in 컴파일러 & 운영체제
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 |