728x90
반응형
- 최대한 잘라먹기(
Maximal Munch
) 는 컴파일러가 코드를 파싱할 때 가장 긴 토큰을 우선적으로 인식하는 방식입니다. - 이는 형태소 분석(
lexical analysis
) 과정에서 애매모호한 구문을 어떻게 처리할지를 결정하는 중요한 원칙입니다.
- 컴파일러는 소스 코드를 읽고 토큰(
Token
) 으로 나누어 의미를 분석합니다. - 이 과정에서 컴파일러는 가능한 가장 긴 문자열을 하나의 토큰으로 인식하려고 합니다.
-
소스 출처 : C++ gotchas! 및 Internet
-
cpp
-
+++++p->*mp
-
위의 코드에서
->*
는 두 가지로 해석될 수 있습니다.-
->
와*
두 개의 연산자로 분리
-
->*
하나의 연산자로 처리
-
-
이처럼 해석이 달라질 수 있는 부분이
Maximal Munch
에서 발생하는 대표적인 문제입니다.
-
cpp
-
list<vector<string>> loves;
-
이 코드도 해석이 애매할 수 있습니다.
-
컴파일러는
>>
를 이동 연산자(Shift Operator
) 로 잘못 해석할 가능성이 있습니다.
-
cpp
-
list< vector<string> > loves;
- 위와 같이 공백을 추가하면 명확하게 해석됩니다.
-
같은 코드라도 컴파일러와 버전에 따라 다르게 처리됩니다.
- Visual C++ 2005 → 컴파일 성공
- GCC 3.4.2 → 컴파일 오류 발생
- MINGW/GCC →
>>
대신> >
필요함 (컴파일 오류) - C99 컴파일러 →
>>
로 인한 오류 발생 - g++ 4.8, g++ 7.3 → 컴파일 성공
-
이처럼 최신 컴파일러에서는 과거의 오류를 자동으로 해결하는 경우도 있습니다.
-
언어마다 구문 처리 방식이 다르므로, 같은 코드를 작성하더라도 해석이 달라질 수 있습니다.
-
Python
- 공백과 들여쓰기(Tab, Space)가 문법적으로 중요함.
-
Java
- 공백이 비교적 자유로우며, 들여쓰기와 관계없이 코드가 동작함.
-
C++
에서는 공백이 큰 영향을 미치지는 않지만, 위와 같은>>
문제처럼 특정 문맥에서는 주의가 필요합니다.
Maximal Munch
는 컴파일러의 토큰 인식 원칙 중 하나로, 애매한 구문을 어떻게 해석할지를 결정하는 역할을 합니다.- 컴파일러마다 해석이 다를 수 있으며, 최신 버전에서는 해결될 수도 있습니다.
- 구형 컴파일러가 오류를 발생시키는 것이 꼭 잘못된 것은 아닙니다. 애매모호한 코드는 문제를 일으킬 가능성이 있기 때문입니다.
- 표준을 준용하되, 현실적으로 다양한 컴파일러의 동작을 고려해야 합니다.
728x90
반응형
'C C++' 카테고리의 다른 글
현재 윈도우즈 버전 얻기 예제 (0) | 2007.05.19 |
---|---|
C++ 상수 포인터 (0) | 2007.05.17 |
TTOF2() 함수 (0) | 2007.05.09 |
CMainFrame IDR_MAINFRAME 확장자 연결 문자열 (0) | 2007.04.26 |
GetProcAddress 과 Unicode (0) | 2007.04.14 |