Cho dù người dùng xác định hoặc cách khác, số nguyên và dấu chấm động luôn luôn là số dương.
Lý do khá đơn giản: nếu bạn cho phép các chữ cái âm, lexing trở thành ngữ cảnh phụ thuộc. Tức là, khi phải đối mặt với một cái gì đó giống như - 10
, người lexer không thể chỉ xem văn bản đó một mình và biết liệu nó có được coi là hai mã riêng biệt (-
và 10
) hay một (-10
). Nếu bạn luôn coi đó là một mã thông báo, thì một cái gì đó như a - 10
sẽ dẫn đến <a> and <-10>
(ví dụ: <identifier><literal>
, không phải là một chuỗi hợp pháp trong C++ (hoặc hầu hết các ngôn ngữ lập trình khác).
Để giải quyết vấn đề đó, trình phân tích cú pháp có thể cung cấp ngữ cảnh cho lexer, nói tại bất kỳ thời điểm nào cho dù mong đợi (ví dụ) toán tử hay toán hạng, vì vậy nó sẽ biết rằng nếu nó là để tạo toán tử, thì -
sẽ được coi là mã thông báo của riêng mình, nhưng nếu toán hạng được mong đợi, -10
sẽ là một mã thông báo duy nhất.
Nói chung dễ dàng hơn để có một quy tắc duy nhất luôn tuân theo thoug h và một hoạt động là -
luôn là một toán tử và chữ cái không thể bao gồm một số -
.
Nguồn
2013-02-20 05:40:18
Bạn đã thử? Tôi nghĩ rằng họ được phép – balki
@ balki - vâng, tôi nhận được các lỗi biên dịch - sẽ cập nhật OP trong giây lát ... ... thực sự, một số âm gấp đôi là ok, do 'long double', nhưng tôi không thể làm cho nó mất một 'long long' - lemme thử lại. – kfmfe04
Bạn đang sử dụng trình biên dịch nào? [Nó không được hỗ trợ rộng rãi lắm.] (Http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) – cgmb