2012-02-05 8 views
8

¿Qué hace la siguiente línea?¿Qué significa #line?

#line 25 "CSSGrammar.y" 

¿Y qué hay con la extensión?

+0

Solo por curiosidad ... ¿Qué compilador come esto? – Vyktor

+0

@Vyktor Estoy usando MSVS2008. –

+1

@Vyktor es parte del estándar –

Respuesta

11

De acuerdo con la Norma:

§16.4.3:

Una directiva de preprocesamiento de la forma

# line digit-sequence new-line 

hace que la aplicación se comporte como si la siguiente secuencia de líneas de código fuente comienza con una línea fuente que tiene un número de línea especificado por la secuencia de dígitos (interpretada como un entero decimal). Si la secuencia de dígitos especifica cero o un número mayor que 2147483647, el comportamiento no está definido.

§16.4.4:

Una directiva de preprocesamiento de la forma

# line digit-sequence " s-char-sequenceopt" new-line 

establece el número de línea se presume de manera similar y cambia el presunto nombre del archivo de origen para ser el contenido del literal de la cadena de caracteres.

§16.4.5:

Una directiva de preprocesamiento de la forma

# line pp-tokens new-line 

(que no coincide con una de las dos formas anteriores) está permitido. Los tokens de preprocesamiento después de la línea en la directiva se procesan igual que en texto normal (cada identificador actualmente definido como nombre de macro es reemplazado por su lista de reemplazo de tokens de preprocesamiento). Si la directiva resultante después de todos los reemplazos no coincide con una de las dos formas anteriores, el comportamiento no está definido; de lo contrario, el resultado se procesa según corresponda.

La extensión .y es justo lo que el autor eligió para usar, tal vez para que sea evidente que era un archivo YACC (la palabra "gramática" también apunta a que a pesar de que es sólo una suposición).

2

El generador de análisis 'yacc' consume archivos que terminan en .y y emite archivos que contienen c o C++. Agrega estas líneas #line para permitir que un depurador regrese a su origen original, no acepte sustitutos.

7

Simplemente indica que la línea actual de código se obtiene de la línea 25 de CSSGrammar.y, un archivo de gramática de estilo YACC que es donde se generó este código.

Esto puede ser utilizado por los depuradores para entrar en la gramática en lugar de en el código generado.

+2

No solo para depuradores: también ayuda a los compiladores a señalar las fuentes correctas de errores. –

1

es una opción de preprocesador c. Le dice al c-analizador que elimine el recuento de líneas del archivo de origen y simule, que esta es la línea # 25.

Con esta información es más fácil para usted depurar el archivo fuente. El archivo yacc se traducirá a una fuente c, donde esta es la línea fuente pretendida.

1

Es una directiva para el compilador creer que la siguiente línea es la línea número 25 en el archivo CSSGrammar.y. Entonces, si un error es detectado por el compilador en la segunda línea siguiente, que sería reportado como procedente de la línea 26 del CSSGrammar.y

Programas archivos de generación de C, como bison, o yacc, o flex o ANTLR, o incluso MELT usan esa posibilidad mucho.

Si se genera información de depuración (por ejemplo, con gcc -g), apuntará al archivo CSSGrammar.y en su ejemplo.

4

directiva #line modifica la posición de informe para el compilador, y es utilizada por el software de generación de código para ayudar al programador a identificar el problema en la fuente original. Puede ser utilizado por cualquier persona para ayudar a redirigir el informe de errores para que sea más informativo.

Así, por ejemplo, su analizador genera un archivo CSSGrammar.cpp, que es compilado por el compilador C++ y contiene fragmentos de código C++, una directiva #line 25 "CSSGrammar.y" le dice al compilador C++ que trate ese punto particular en el archivo como si es la línea número 25 de CSSGrammar.y

El compilador continuará analizando las líneas subsiguientes y notificará errores en las condiciones iniciales de esa directiva.

lo tanto, si se produce un error de 3 líneas más adelante sería informar de que se ha producido un error en la línea 28 en CSSGrammar.y

Tenga en cuenta que un único archivo de origen puede tener fuentes que vienen de varias partes; y que esta directiva puede usarse con bastante eficacia para indicar condiciones de error.

Por lo general, verá que hay múltiples directivas #line en el camino; solo están ahí para dar cuenta de varias inyecciones a lo largo del camino (para restablecer el informe de intercalación, si lo desea).

Tenga en cuenta que la directiva #line puede ser utilizada por CUALQUIER generador, incluido el suyo, y no está limitado a todos los generadores de analizadores sintácticos.