2011-10-03 16 views
7

yacc no parece gustarle cuando mis tokens son del tipo que definí.yacc - campo tiene tipo incompleto

En la parte superior de mi gramática (.y) archivo en un bloque %{ ... %}, que incluyen un archivo de cabecera que define la siguiente estructura:

typedef struct _spim_register { 
    spim_register_type type; /* This is a simple enumeration, already defined */ 
    int number;    
} spim_register; 

Antes de mi lista de reglas, que tengo:

%token AREG 
... 
%union { 
struct _spim_register reg; 
} 
... 
%type <reg> register AREG 

me sale

error: field ‘reg’ has incomplete type

en la línea en el %union cláusula al intentar compilar el código producido por bison. En mi declaración %union, tratando de declarar reg escribiendo spim_register reg; da el error:

unknown type name ‘spim_register’ 

Parece que hay algo especial en %union { ... }, porque soy capaz de utilizar las estructuras de datos de mi archivo de cabecera en las acciones de las normas.

+3

[Posiblemente relacionado] (http://stackoverflow.com/questions/1430390/include-struct-in-the-union-def-with-bison-yacc) – user786653

Respuesta

9

Sería de gran ayuda si mi #includes estaban en el orden correcto ...

La respuesta fue, como dio a entender user786653, here. Necesitaba incluir el archivo de encabezado que define mi estructura personalizada antes de incluyendo el archivo .tab.h en el archivo .l.

+0

Funcionó para mí también. ¡Gracias! –

5

Me encontré con el mismo problema. Debido a que mi * .L archivo de la siguiente manera:

incluyen "y.tab.h"

incluyen "FP.h"

entonces, Reescribí así:

incluyen "FP .h"

incluyen "y.tab.h"

funciona. Muchas gracias. @ArIck

+0

Trabajando en xcode Encontré que necesitaba eliminar los Datos Derivados para mi proyecto para que la reordenación realmente suceda. Por algún motivo, xcode no incluía realmente el nuevo archivo. – Jbryson

Cuestiones relacionadas