2008-11-27 14 views
5

¿Cómo manipula el compilador C/C++ el carácter de escape ["\"] en el código fuente? ¿Cómo se escribe la gramática del compilador para procesar ese personaje? ¿Qué hace el compilador después de encontrar ese personaje?¿Cuál es el carácter Magic Behind Escape ()

+0

al menos intente deletrear correctamente sus etiquetas creadas ... – Gilles

+0

disculpe por eso, la pregunta fue escrita a toda prisa – mahesh

+0

Este personaje (?) Falta en sus preguntas. ¿Cuál es la prisa, sin embargo? –

Respuesta

14

La mayoría de los compiladores se dividen en partes: el front-end del compilador se llama lexical analyzer o un escáner. Esta parte del compilador lee los caracteres reales y crea tokens. Tiene una máquina de estado que decide, al ver un carácter de escape, si es genuino (por ejemplo, cuando aparece dentro de una cadena) o si modifica el siguiente carácter. El token se emite en consecuencia como el carácter de escape o algún otro token (como una pestaña o una nueva línea) a la siguiente parte del compilador (the parser). La máquina de estado puede agrupar varios caracteres en un token.

1

el carácter de escape con un carácter siguiente (como \n) es un carácter único para el compilador C; el escáner lo presenta al analizador como token de carácter, por lo que no hay necesidad de reglas de sintaxis especiales en el analizador para el carácter de escape.

2

Por lo general, se escapa el siguiente carácter:

  • En una cadena literal o carácter literal, significa escapar el siguiente carácter. \a significa 'alerta' (parpadeando el terminal, pitido o lo que sea), \n significa 'avance de línea', \xNUM significa un número hexadecimal por ejemplo.
  • Si aparece como el último carácter visible antes de una nueva línea, ya sea dentro de una cadena o no (¡e incluso dentro de un comentario en toda la línea!), Actúa como una continuación de línea: se ignora el siguiente carácter de línea nueva, y la siguiente línea se fusiona con la línea actual.
+0

No olvide \ uXXXX y \ UXXXXXXXX en C99. –

+0

\ NNN (donde N son los dígitos 0-7) representa un número de byte en Octal. \ 0, comúnmente conocido como Null-Terminator, es realmente lo mismo que \ 000. Creo que 255 es \ 377 – abelenky

+0

Aaron, eso es correcto. hay otros usos de \ también. pensé que haría una lista de las más importantes (por medición subjetiva). –

5

Una nota interesante sobre este tema es On Trusting Trust [PDF link].

El documento describe una forma en que un compilador puede manejar este problema exactamente, muestra cómo el compilador c-written-in-c no tiene una traducción explícita de los códigos en valores ASCII; y cómo iniciar un nuevo código de escape en el compilador para que la comprensión del valor ASCII para el nuevo código también esté implícita.

+0

Ese es un artículo muy interesante que no había leído en mucho tiempo. Me olvidé de la sección sobre cómo ajustar un compilador para entender una nueva secuencia de caracteres de escape como '\ v', por lo que no pude ver su relevancia inmediatamente. Me alegro de haberlo verificado. –

+0

Awesome paper dmckee. gracias por compartir. – mahesh

Cuestiones relacionadas