Ví dụ chính xác này được đề cập trong dự thảo tiêu chuẩn C99 ( cùng chi tiết trong C11 ) phần 6.4 Các yếu tố đơn giản, đoạn 4 có nội dung:
Nếu luồng đầu vào đã được phân tích cú pháp thành mã thông báo tiền xử lý lên đến một ký tự nhất định, mã thông báo tiền xử lý tiếp theo là chuỗi ký tự dài nhất có thể tạo thành mã thông báo tiền xử lý. [...]
còn được gọi là quy tắc tối đa munch được sử dụng trong phân tích từ vựng để tránh sự mơ hồ và hoạt động bằng cách lấy càng nhiều phần tử càng tốt để tạo thành một mã thông báo hợp lệ.
đoạn văn cũng có hai ví dụ, ví dụ thứ hai là một đối sánh chính xác cho câu hỏi của bạn và như sau:
VÍ DỤ 2: Đoạn chương trình x +++++ y được phân tích cú pháp là x ++ ++ + y, điều này vi phạm một ràng buộc đối với toán tử tăng, mặc dù việc phân tích cú pháp x ++ + ++ y có thể mang lại một biểu thức đúng.
cho chúng ta biết rằng:
a+++++b
sẽ được phân tích cú pháp thành:
a ++ ++ + b
điều này vi phạm các ràng buộc về tăng số bài đăng vì kết quả của số tăng bài đăng đầu tiên là một giá trị và số tăng bài đăng yêu cầu một giá trị. Điều này được đề cập trong phần Các 6.5.2.4
toán tử tăng và giảm Postfix cho biết ( mỏ nhấn mạnh ):
Toán hạng của toán tử tăng hoặc giảm hậu tố phải có kiểu thực hoặc con trỏ đủ điều kiện hoặc không đủ tiêu chuẩn và phải là giá trị có thể sửa đổi.
và
Kết quả của toán tử postfix ++ là giá trị của toán hạng.
Cuốn sách Gotchas C ++ cũng đề cập đến trường hợp này trong Gotcha #17
Maximal Munch Problems, nó cũng là vấn đề tương tự trong C ++ và nó cũng đưa ra một số ví dụ. Nó giải thích rằng khi xử lý nhóm ký tự sau:
->*
máy phân tích từ vựng có thể thực hiện một trong ba việc:
- Hãy đối xử với nó như ba thẻ:
-
, >
và*
- Coi nó như hai mã thông báo:
->
và*
- Coi nó như một mã thông báo:
->*
Các nhai tối đa quy định cho phép nó để tránh những sự mơ hồ. Tác giả chỉ ra rằng nó ( Trong ngữ cảnh C ++ ):
giải quyết nhiều vấn đề hơn nó gây ra, nhưng trong hai tình huống phổ biến, đó là một sự khó chịu.
Ví dụ đầu tiên sẽ là các mẫu có đối số mẫu cũng là mẫu ( đã được giải quyết trong C ++ 11 ), ví dụ:
list<vector<string>> lovos; // error!
^^
Điều này diễn giải các dấu ngoặc nhọn đóng là toán tử shift , và do đó, cần có một khoảng trắng để phân biệt:
list< vector<string> > lovos;
^
Trường hợp thứ hai liên quan đến các đối số mặc định cho con trỏ, ví dụ:
void process( const char *= 0 ); // error!
^^
sẽ được hiểu là *=
toán tử gán, giải pháp trong trường hợp này là đặt tên cho các tham số trong khai báo.