2011-12-27 3 views
5

В спецификации перечислены категории рр лексем в 2,5, но содержит последнюю категориюКакие символы остались для pp-токенов?

каждый небелый-пробел, который не может быть один из вышеперечисленных

У меня есть трудно найти пример, когда маркер pp, захвативший такой символ, дает действительную C++-программу. Как объясняется 2.5, программа может содержать маркер диких " или ', но тогда поведение не определено. Есть ли пример действительной программы?

ответ

1

Вы можете привязать блуждающий токен к действительности. На самом деле; вы уже сделали это в a previous question!

Бродячие маркеры символов могут также появляться в группе пропущено условной компиляции, т.е.

#if 0 
@ \ ` € 
#endif 

Обратите внимание, что во всех этих случаях, только бездомная маркер символ обратной косой черты, так как ОКН, такие как \u0040 не формировать идентификатор, а UCN - особый случай в идентификаторах, а только обратная косая черта - это «самая длинная последовательность символов, которая может составлять токен предварительной обработки», причем u0040 является отдельным идентификатором.

+0

Hm, только символ \ те из этих блуждающих токенов совпадает с последней категорией маркеров pp, потому что это единственный символ в этой строке, который находится в базовом наборе символов. Остальные станут UCN (идентификаторы), или я что-то упускаю? Я принимаю это из-за идеи '#if 0' и идеи stringize/concatenate. Благодаря! –

+0

Только определенные UCN могут формировать идентификаторы (§E). Технически я считаю, что три расширенных символа образуют блуждающую обратную косую черту, а затем буквенно-цифровую последовательность, которая становится идентификатором. Это связано с явным максимальным правилом munch. (На самом деле, это означает, что диакритические знаки * не могут быть сочтены, потому что только операторная косая черта рассматривается оператором '##'!) – Potatoswatter

+0

«может» или «может»? Если это «возможно», то в соответствии с директивами IEC недопустимая последовательность символов должна по-прежнему лексироваться как идентификатор и позже отклоняться как недопустимая. –

1

Я считаю, что $ и @, например, попадают в эту категорию (при условии, что эти символы находятся в наборе символов источника). Оба являются действительными pp-токенами, но не являются допустимыми токенами и будут диагностированы как синтаксическая ошибка на более поздней стадии перевода (если только они не были удалены #if, #ifdef и т. Д.).

Я не знаю ни одного случая, когда такой pp-токен приводит к действительному токену.

+0

Hm, '$' и '@' не входят в базовый набор символов. Таким образом, оба будут переведены на универсальные имена символов и будут обрабатываться другими категориями токенов pp (идентификатор). –

+0

Может быть, '#', который не находится в начале строки? Или '\', который не находится в конце строки или внутри буквального? – rodrigo

+0

@rod a '#' - это preprocessing-op-or-punc. Кажется, что A \, который не находится в конце строки или внутри литерала. Имея '#define BAR (X) # X', можно сказать' BAR (A \ nB) ', который содержит идентификаторы' A' и 'nB', разделенные \ token, сопоставляемые последней категорией маркеров PP (или if реализация позволяет идентификаторы, содержащие \, это будет один идентификатор). Спасибо за это понимание! –

Смежные вопросы