2010-08-13 12 views
10

Cuando compilo mi archivo .y con bison parser.y -d -t y luego incluyo el archivo parser.tab.h en mi archivo flexible, gcc dice "error: error de sintaxis antes de la constante numérica". Hace referencia a la línea 32, que es la primera línea en la enumeración de yytokentype.GCC dice "error de sintaxis antes de la constante numérica" ​​en el archivo de encabezado generado de bison

enum yytokentype { 
    BREAK = 258, 
    ... } 

El error es sobre la línea "BREAK = 258." Honestamente, no sé por qué sucede esto. Realmente me gustaría usar el yylval generado y lo necesito desde este archivo de encabezado. Incluso si declarase yytokentype como este en mi archivo flexible, obtendría el mismo error. ¿Algo que podría estar haciendo mal?

+2

supongo que hay una redefinición del 'BREAK' algún lugar por encima de la línea con error. La bandera ''E' para gcc es buena para descubrir estos problemas. – msw

Respuesta

19

¿Se ha definido BREAK en otro lugar en su código? Me sale un error similar al siguiente ejemplo de juguete: ejemplo

#define BREAK 10 
enum yytokentype { 
    BREAK = 258 
}; 

Cuerpo:

$ cc -c file.c 
file.c:4: error: expected identifier before numeric constant 
+0

Hmm? Ese ejemplo fallará con o sin el '# define' debido al punto y coma. –

+0

Sí ... Ese es el problema. Revisé todos mis #includes y lo encontré en uno de ellos. Gracias por la ayuda a los dos. – Kizaru

+0

@Kinopiko, oops, debería haber copiado/pegado en lugar de volver a escribir. Corregido ahora. –

6

Presumiblemente, BREAK ya está definido en algún lugar del archivo de salida flexible, por lo que después de que se ejecute el preprocesador obtendrá una afirmación como 99 = 258 o algo así. Intente mirar la salida de cpp yy.lex.c o gcc -E yy.lex.c. Miré un archivo de salida flexible, pero no encontré BREAK en ninguna parte, solo YY_BREAK.

Cuestiones relacionadas