Pregunta

Estoy tratando de incluir una estructura como parte de la unión con Bison, pero aparece un error en los 'argumentos del nodo de estructura' en% union:

parser.y:17: error: field ‘args’ has incomplete type

El Código:

struct node {
    char * val;
    struct node * next;
};

%}

%union {
    char * string;
    struct node args;
}

%token <string> CD WORD PWD EXIT

%type <args> arg_list

¿Alguien sabe lo que estoy haciendo mal?

¿Fue útil?

Solución

Aún mejor, use la directiva% code con " requiere " opción, es decir:

%code requires {
    struct node {
        char * val;
        struct node * next;
    };
}

%union {
    char * string;
    struct node args;
}

Esto incluirá el código en " requiere " bloquee el archivo tab.h y el archivo fuente del analizador.

De la documentación: http://www.gnu.org /software/bison/manual/html_node/Decl-Summary.html#Decl-Summary

  
      
  • requiere   
        
    • Propósito: este es el mejor lugar para escribir el código de dependencia requerido para   YYSTYPE y YYLTYPE. En otras palabras,   es el mejor lugar para definir tipos   referenciado en% directivas sindicales, y   es el mejor lugar para anular   YYSTYPE y YYLTYPE predeterminados de Bison   definiciones.
    •   
  •   

Otros consejos

Todo se reduce a la pobre salida y.tab.h que obtienes.

Debe solucionar esto asegurándose de que " struct node " se define antes de incluir y.tab.h en cualquier lugar.

Para hacer esto, cree un archivo node.h con la definición de estructura.

Luego incluya node.h antes y.tab.h en su archivo parser.l, archivo parser.y así como cualquier archivo c que tenga que incluya y.tab.h. Esto es un poco molesto.

Alternativamente, puede cambiar " struct node args " a " struct node * args " ya que no necesitaría saber el tipo completo hasta que vaya a usarlo en algún lugar. No estoy seguro de si esto encajaría con su código.

Cualquiera de los dos debería funcionar.

Quizás más simple (creo): lo usé yo mismo:

%union {
  char   c; 
  struct {
     char name[30];
     int  type;
  } s;
}

Entonces, en flex puedes usar " yylval.s.name " , o " yylval.s.type " ;, etc. mientras está en bisonte, en lugar de $$=0, $1=bla ... ahora puede escribir $<s.type>$=0 , $<s.type>1=bla...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top