728x90
반응형

최대한 잘라먹기(Maximal Munch)

  • 최대한 잘라먹기(Maximal Munch) 는 컴파일러가 코드를 파싱할 때 가장 긴 토큰을 우선적으로 인식하는 방식입니다.
  • 이는 형태소 분석(lexical analysis) 과정에서 애매모호한 구문을 어떻게 처리할지를 결정하는 중요한 원칙입니다.

1. Maximal Munch의 개념

  • 컴파일러는 소스 코드를 읽고 토큰(Token) 으로 나누어 의미를 분석합니다.
  • 이 과정에서 컴파일러는 가능한 가장 긴 문자열을 하나의 토큰으로 인식하려고 합니다.

예제 1: p->*mp

  • 소스 출처 : C++ gotchas! 및 Internet

  • cpp

  •  +++++p->*mp
    
  • 위의 코드에서 ->* 는 두 가지로 해석될 수 있습니다.

      1. ->* 두 개의 연산자로 분리
      1. ->* 하나의 연산자로 처리
  • 이처럼 해석이 달라질 수 있는 부분이 Maximal Munch에서 발생하는 대표적인 문제입니다.


2. STL 코드에서의 문제

  • cpp

  •  list<vector<string>> loves;
    
  • 이 코드도 해석이 애매할 수 있습니다.

  • 컴파일러는 >>이동 연산자(Shift Operator) 로 잘못 해석할 가능성이 있습니다.

해결 방법

  • cpp

  •  list< vector<string> > loves;
    
  • 위와 같이 공백을 추가하면 명확하게 해석됩니다.


3. 컴파일러마다 다른 처리 방식

컴파일러별 결과 차이

  • 같은 코드라도 컴파일러와 버전에 따라 다르게 처리됩니다.

    • Visual C++ 2005 → 컴파일 성공
    • GCC 3.4.2 → 컴파일 오류 발생
    • MINGW/GCC>> 대신 > > 필요함 (컴파일 오류)
    • C99 컴파일러>> 로 인한 오류 발생
    • g++ 4.8, g++ 7.3 → 컴파일 성공
  • 이처럼 최신 컴파일러에서는 과거의 오류를 자동으로 해결하는 경우도 있습니다.



4. 코딩 스타일과 언어별 차이

  • 언어마다 구문 처리 방식이 다르므로, 같은 코드를 작성하더라도 해석이 달라질 수 있습니다.

  • Python

    • 공백과 들여쓰기(Tab, Space)가 문법적으로 중요함.
  • Java

    • 공백이 비교적 자유로우며, 들여쓰기와 관계없이 코드가 동작함.
  • C++에서는 공백이 큰 영향을 미치지는 않지만, 위와 같은 >> 문제처럼 특정 문맥에서는 주의가 필요합니다.



5. 정리

  • 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

+ Recent posts