tutorial descargar c yacc bison

descargar - bison tutorial



Incluir estructura en la definiciĆ³n% union con Bison/Yacc (3)

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

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

Esto incluirá el código en el bloque "requiere" en el archivo tab.h, así como 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 los tipos a los que se hace referencia en% directivas de unión, y es el mejor lugar para anular las definiciones YYSTYPE e YYLTYPE predeterminadas de Bison.

Estoy tratando de incluir una estructura como parte de la unión con Bison, pero obtengo un error en el ''struct node args'' 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?


Tal vez más simple (creo) - usé esto yo mismo:

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

Luego, en flex puede usar "yylval.s.name", o "yylval.s.type", etc. mientras esté en bison, en lugar de $$=0, $1=bla ... ahora puede escribir $<s.type>$=0 , $<s.type>1=bla...


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

Debe arreglar esto asegurándose de que "struct node" esté definido antes de incluir y.tab.h en cualquier lugar.

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

Luego incluya node.h antes de y.tab.h en su archivo parser.l, 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" por "struct node * args", ya que no necesitará conocer el tipo completo hasta que lo use en algún lugar. No estoy seguro de si esto encajaría con su código.

Cualquiera de los dos debería funcionar.