2011-12-27 17 views
5

Các spec liệt kê các loại thẻ pp ở 2.5, nhưng có chứa một loại cuối cùngNhững ký tự nào còn lại cho trang-tokens?

mỗi nhân vật không phải da trắng không gian mà không thể là một trong những trên

Tôi có một thời gian khó tìm một ví dụ trong đó một mã thông báo trang bắt được một ký tự như vậy sẽ sinh ra một chương trình C++ hợp lệ. Như 2.5 giải thích, một chương trình có thể chứa mã thông báo " hoặc ' hoang dã, nhưng sau đó hành vi không xác định. Có ví dụ về chương trình hợp lệ không?

Trả lời

1

Bạn có thể xâu chuỗi mã thông báo thành giá trị. Thực ra; bạn đã làm điều đó trong a previous question!

thẻ nhân vật Stray cũng có thể xuất hiện trong một nhóm bỏ qua bởi biên soạn có điều kiện, tức là

#if 0 
@ \ ` € 
#endif 

Lưu ý rằng trong tất cả những trường hợp này, chỉ đi lạc nhân vật token là dấu chéo ngược, vì một UCN như \u0040 không tạo thành một định danh, và UCN là một trường hợp đặc biệt trong các mã định danh, và dấu chéo ngược một mình là "chuỗi ký tự dài nhất có thể tạo thành một mã thông báo tiền xử lý", với u0040 là một mã định danh riêng biệt.

+0

Hm chỉ có \ ký tự của những thẻ đi lạc phù hợp với danh mục trang mã thông báo cuối cùng, bởi vì đó là ký tự duy nhất trong dòng đó nằm trong bộ ký tự nguồn cơ bản. Những người khác sẽ trở thành UCN (nhận dạng), hoặc tôi thiếu cái gì? Tôi chấp nhận điều này vì ý tưởng '#if 0' và ý tưởng xâu chuỗi/ghép nối. Cảm ơn! –

+0

Chỉ một số UCN nhất định có thể tạo thành mã định danh (§E). Về mặt kỹ thuật, tôi nghĩ rằng ba ký tự mở rộng sẽ tạo thành một dấu gạch chéo ngược đi theo sau là một chuỗi ký tự chữ và số trở thành một mã định danh. Điều này là do quy tắc munch tối đa rõ ràng. (Trên thực tế, điều đó ngụ ý rằng dấu phụ * không thể * được catenated, bởi vì chỉ có dấu gạch chéo ngược hàng đầu được nhìn thấy bởi toán tử '##'!) – Potatoswatter

+0

"may" hay "có thể"? Nếu nó là "có thể", sau đó theo các chỉ thị IEC, chuỗi ký tự không hợp lệ vẫn phải được lexed như một định danh, và bị từ chối là không hợp lệ sau này. –

1

Tôi tin rằng $@, ví dụ: thuộc danh mục đó (giả sử các ký tự này nằm trong bộ ký tự nguồn). Cả hai đều là mã thông báo pp hợp lệ, nhưng không phải là mã thông báo hợp lệ và sẽ được chẩn đoán là lỗi cú pháp trong giai đoạn dịch sau (trừ khi chúng đã bị xóa bởi #if, #ifdef, v.v.).

Tôi không biết bất kỳ trường hợp nào mà một mã thông báo trang như vậy dẫn đến một mã thông báo hợp lệ.

+0

Hm, '$' và '@' không nằm trong bộ ký tự nguồn cơ bản. Vì vậy, cả hai sẽ được dịch sang các tên nhân vật phổ quát và sẽ được xử lý bởi các loại mã thông báo trang khác (số nhận dạng). –

+0

Có thể một '#' không nằm ở đầu dòng? Hoặc một '\' mà không phải là ở cuối của một dòng cũng không phải bên trong của một chữ? – rodrigo

+0

@rod a '#' là tiền xử lý-op-hoặc-punc. A \ đó không phải là ở cuối của một dòng cũng không phải bên trong của một chữ có vẻ là có thể. Có '#define BAR (X) # X' thì người ta có thể nói' BAR (A \ nB) ', chứa các mã định danh' A' và 'nB' được phân cách bởi \ token, khớp với loại mã thông báo PP cuối cùng (hoặc nếu việc triển khai cho phép các mã định danh chứa \, nó sẽ là một định danh duy nhất). Cảm ơn thông tin chi tiết này! –

Các vấn đề liên quan