[C con Clase] librerias yacc

Manuel L. notret en gmx.es
Dom Mayo 16 08:50:17 CEST 2010


Hola, Josmeagol:

Sí, estoy algo familiarizado. Si no lo estuviese, ya no respondería a sus preguntas.

Respecto al funcionamiento de yacc, no es correcto que éste pueda actuar sin lex. Lo que necesita es la función yylex, pero puede proporcionarle otra. No obstante, ya que se ha optado por un desarrollo rápido de un analizador sintáctico, lo recomendable es hacer lo mismo con el analizador léxico.

En cuanto a su procedimiento para la compilación no me ha quedado muy claro lo que quería hacer, pero también he de decir que yo he trabajado con flex y bison, los plagios mejorados de GNU :-&

Por los problemas de compilación deduzco lo siguiente: cero, uno y central son símbolos terminales de la gramática. Si ello es así, la solución es sencilla: cuando compile hágalo con los dos archivos generados por ambos programas, porque cada uno aporta un analizador distinto. Debe incluir el y.tab.c además de lex.yy.c en la entrada del g++. Además, cerciórese de que en la parte del código inicial dentro del lex incluye la cabecera y.tab.h, es decir: al comienzo del fichero paar el lex tiene una declaración del siguiente tipo:

%{

//...
#include "y.tab.h"

%}

Si lo hace en otra parte del programa puede que no funcione.

Saludos.

El pasado 2010-05-14 12:59:56, josmeagol escribió:
 
j> Si es en linux, al parecer yacc no puede actuar sin lex, al instalar lex me
j> he quitado el problema de las librerías pero como es costumbre los errores
j> suelen ir a mas, por lo que he estado investigando el protocolo para yacc es
j> algo rebuscado,
j> No se si estas familiarizado con este programa, pero al parecer hay que
j> crear un archivo .txt, en el cual tienes que incluir y.tab.h, donde defines
j> los símbolos terminales para el autómata, que al pasárselo a lex genera
j> lex.yy.c, este lo incluyes en el .txt que le pasas a yacc con el lenguaje,
j> con la opción de -d te genera ademas de y.tab.c, y.tab.h que si lo incluyes
j> en el primer .txt y lo pasas nuevamente por lex, te da el definitivo
j> lex.yy.c, y en principio ya puedes compilar con gcc o g++ y la opción -lfl.
j> Alguno de estos pasos del rompecabezas tengo que estar haciendo mal ya que
j> ahora la salida es la siguiente:
j>  g++ lex.yy.c -o ejecutable -lfl -ll -lm
j> lex.yy.c:520: error: expected ‘,’ or ‘...’ before numeric constant
j> lexico.txt: In function ‘int yylex()’:
j> lexico.txt:5: error: ‘cero’ was not declared in this scope
j> lexico.txt:6: error: ‘uno’ was not declared in this scope
j> lexico.txt:7: error: ‘central’ was not declared in this scope


Más información sobre la lista de distribución Cconclase