2011-12-27 10 views
5

La especificación enumera las categorías de fichas pp a 2,5, pero contiene una última categoría¿Qué caracteres quedan para los pp-tokens?

cada carácter que no sea un espacio en blanco que no puede ser uno de los anteriores

tengo un tiempo difícil encontrar un ejemplo donde un token de pp que captura dicho carácter produce un programa C++ válido. Como explica 2.5, un programa puede contener un comodín " o ', pero el comportamiento no está definido. ¿Hay algún ejemplo de un programa válido?

Respuesta

1

Puede stringize un token extraviado en validez. Actualmente; ya hiciste eso en a previous question!

fichas de personajes callejeros también pueden aparecer en un grupo omitidos por la compilación condicional, es decir

#if 0 
@ \ ` € 
#endif 

Tenga en cuenta que en todos estos casos, la única ficha de personaje callejero es la barra invertida, ya que un UCN como \u0040 no lo hace formar un identificador, y UCN es un caso especial dentro de los identificadores, y la barra invertida sola es "la secuencia más larga de caracteres que podría constituir un token de preprocesamiento", siendo u0040 un identificador separado.

+0

Hm solo el \ carácter de esos tokens parásitos coincide con la última categoría de tokens de pp, porque ese es el único carácter en esa línea que está en el conjunto de caracteres básicos de origen. Los otros se convertirán en UCN (identificadores), ¿o me estoy perdiendo algo? Estoy aceptando esto debido a la idea '#if 0' y la idea de stringize/concatenate. ¡Gracias! –

+0

Solo ciertos UCN pueden formar identificadores (§E). Técnicamente, creo que los tres caracteres extendidos formarían una barra inversa perdida seguida de una secuencia alfanumérica que se convierte en un identificador. Esto se debe a la regla de masticar máxima explícita. (En realidad, eso implica que las marcas diacríticas * no pueden * ser catenadas, porque solo la barra inversa principal es vista por el operador '##'!) – Potatoswatter

+0

"puede" o "puede"? Si es "may", entonces de acuerdo con las directivas IEC, la secuencia inválida de caracteres todavía debe ser lexed como un identificador, y rechazada como no válida más adelante. –

1

Creo que $ y @, por ejemplo, entran en esa categoría (suponiendo que estos caracteres estén en el juego de caracteres fuente). Ambos son tokens de pp válidos, pero no son tokens válidos, y se diagnosticarán como un error de sintaxis en una fase de traducción posterior (a menos que hayan sido eliminados por #if, #ifdef, etc.).

No conozco ningún caso en el que un token de pp dé como resultado un token válido.

+0

Hm, '$' y '@' no están en el juego de caracteres de origen básico. Por lo tanto, ambos se traducirían a nombres de caracteres universales y serían manejados por las otras categorías de tokens de pp (identificador). –

+0

¿Tal vez un '#' que no está al comienzo de una línea? ¿O un '\' que no está al final de una línea ni dentro de un literal? – rodrigo

+0

@rod a '#' es un preprocesamiento-op-o-punc. A \ que no está al final de una línea ni dentro de un literal parece ser posible. Teniendo '#define BAR (X) # X' entonces uno puede decir' BAR (A \ nB) ', que contiene los identificadores' A 'y 'nB' separados por el \ token, emparejados por la última categoría del token PP (o si la implementación permite identificadores que contienen \, sería un identificador único). Gracias por esta idea! –

Cuestiones relacionadas