이 정확한 예는 C99 표준 초안 ( C11의 세부 사항과 동일 ) 섹션 6.4 어휘 요소 단락 4 에서 다룹니다 .
입력 스트림이 주어진 문자까지 사전 처리 토큰으로 구문 분석 된 경우 다음 사전 처리 토큰은 사전 처리 토큰을 구성 할 수있는 가장 긴 문자 시퀀스입니다. [...]
모호함을 피하기 위해 어휘 분석에 사용되는 최대 뭉크 규칙 으로도 알려져 있으며 유효한 토큰을 형성하기 위해 가능한 한 많은 요소를 취하여 작동합니다.
단락에는 또한 두 번째 예가 질문에 정확히 일치하며 다음과 같은 두 가지 예가 있습니다.
예 2 프로그램 조각 x +++++ y는 x ++ ++ + y로 구문 분석되며, 이는 x ++ + ++ y 구문 분석이 올바른 식을 생성 할 수 있지만 증가 연산자에 대한 제약 조건을 위반합니다.
이는 우리에게 다음을 알려줍니다.
a+++++b
다음과 같이 구문 분석됩니다.
a ++ ++ + b
첫 번째 포스트 증분의 결과는 rvalue이고 포스트 증분에는 lvalue가 필요하기 때문에 포스트 증분에 대한 제약 조건을 위반합니다. 이 절에서 다루고있다 6.5.2.4
후위 증가 및 감소 연산자 (라고 강조 광산 ) :
접미사 증가 또는 감소 연산자의 피연산자는 규정 된 또는 규정되지 않은 실수 또는 포인터 유형을 가져야 하며 수정 가능한 lvalue 여야합니다.
과
접미사 ++ 연산자의 결과는 피연산자의 값입니다.
이 책은 C ++ 둘점은 또한이 경우 커버 Gotcha #17
최대한 뭉크 문제 는 동일한 문제가 C ++ 뿐만 아니라 그것은 또한 몇 가지 예를 제공합니다. 다음 문자 집합을 처리 할 때 설명합니다.
->*
어휘 분석기는 다음 세 가지 중 하나를 수행 할 수 있습니다.
- 세 개의 토큰으로 취급 :
-
, >
및*
- 이 토큰로 취급 :
->
및*
- 하나의 토큰으로 취급하십시오.
->*
최대 뭉크의 규칙은 이러한 모호성을 피할 수 있습니다. 저자는 다음과 같이 지적합니다 ( C ++ 컨텍스트에서 ) :
원인보다 더 많은 문제를 해결하지만, 두 가지 일반적인 상황에서는 성가신 일입니다.
첫 번째 예는 템플릿 인수도 템플릿 ( C ++ 11에서 해결됨) 인 템플릿 입니다. 예를 들면 다음과 같습니다.
list<vector<string>> lovos;
^^
닫는 꺾쇠 괄호를 시프트 연산자 로 해석 하므로 명확성을 위해 공백이 필요합니다.
list< vector<string> > lovos;
^
두 번째 경우에는 포인터에 대한 기본 인수가 포함됩니다. 예를 들면 다음과 같습니다.
void process( const char *= 0 );
^^
*=
할당 연산자 로 해석됩니다 .이 경우 해결책은 선언에서 매개 변수의 이름을 지정하는 것입니다.