2011-06-09 9 views
10

He buscado casi todos los materiales en línea. Pero todavía estoy confundido por qué Lexer no puede identificar yylval.yylval indefinido con flex y bison

Aquí es el caso: he definido un grupo de ADT en node.h y hacerlos realidad en node.c, mi propósito es generar un AST después de estas estructuras se almacenan correctamente. Pero estoy sorprendido con el archivo de bisontes.

En primer lugar, cambiar %union a union YYSTYPE {...}; y typedef union YYSTYPE YYSTYPE;, no por lo que necesito hacer esto, algunos otros archivos publicados en Internet parece funcionar bien con %uinion.

Entonces, estoy sorprendido con yylval cosas. He hecho bison -d cosas, y lo he comprobado ya en parser.c (he especificado la salida de bisonte), así que creo que extern YYSTYPE yylval; debería funcionar. Pero no es así Entonces me pregunto si hay otra manera de resolver el problema no declarado de Yylval.

Yo sólo uso los dos tipos de YYSTYPE estructura, int y char *, puedo separar la unión YYSYTPE y estructura para la AST? Esto significa que los no terminales no tendrán tipos asociados. ¿Tienen alguna otra idea?

+0

todavía me pregunto lo que quiere decir "separar la unión' YYSTYPE' y estructura para la AST", y yo no creo que sea necesario. ¿Has tenido problemas al usar '% union' y'% type' en bison? – neuront

+0

@neuront Sí, estoy de acuerdo contigo. No es necesario especificar explícitamente YYSTYPE en bison. Pero el problema es que no puedo pasar sin hacer eso.En otras palabras, aunque '% union' y'% union YYSTYPE' funcionan de la misma manera, sin embargo, en mi caso, tengo que elegir el último. No sé por qué? Para '% union' y'% type', conozco la relación entre ellos. Solo sé cómo resolver el error con 'YYSTYPE undefined'. Cuando busqué en línea, encontré que es un problema común. – chenrui

Respuesta

1

Debe usar% union. No necesita tipear la unión.

Utiliza bison -d para obtener un archivo de encabezado con cualquier declaración (como tipos de terminales, no terminales y tokens). Ejemplo:

bison -d parser.y Otorgará dos archivos, parser.tab.c y parser.tab.h. Puede incluir el último archivo en su archivo lexer, para que sepa sus definiciones %token. Este archivo también incluye la definición de yylval y su tipo.

No debe separar la unión porque lo más probable es que la expanda y la necesite para comunicarse entre el lexer y el analizador.

5

En caso de que sea de ayuda a los demás, encontré (OpenBSD lex yacc v2.5.4 +) que la inclusión de

extern YYSTYPE yylval; 

en mi fuente lex fue insuficiente para evitar un problema 'yylval indefinido', a pesar de que la y.tab.c archivo contiene:

#ifndef YYSTYPE 
typedef int YYSTYPE; 
#endif 

i fijo esto poniendo una definición explícita de la lex fuente:

#define YYSTYPE int 
extern YYSTYPE yyltype 

Sin embargo, no tengo muy claro si la definición de esta manera se propagará a la localización del archivo de origen yacc ...

Cuestiones relacionadas