FLEX ayuda.

Bueno, a ver si alguien controla de FLEX porque me está poniendo malo ya y tengo que entregar esta práctica mañana.

AL_miLenguaje_3.l
%{

#include <stdio.h>

#include <stdlib.h>

#include "tokens.h"



int fila=1, columna=1;

%}


digito            [0-9]

entero            {digito}+

numeroreal         {entero}"."{entero}

letra            [a-zA-Z]

palabra            {letra}+

identificador         {letra}[{palabra}"-"_{digito}]*

espacio            [ \t]+

null            null

caracter         .



puntoYcoma         ;

abreParentesis         "("

cierraParentesis      ")"

abreLlave         "{"

cierraLlave         "}"

punto            \.

retornoCarro         \n

comillas         \"

comillaSimple         '

coma            ,

inicio_comentario      "--"



tipo_car         car

tipo_ent         ent

tipo_bool         bool

valor_bool         ["verdadero""falso"]

tipo_real         real

tipo_cadena         cadena

tipo_array         array

rango            \.\.

de            de

tipo_estructura         estructura


si            si

sino            sino

elige            elige

caso            caso

defecto            defecto

desde            desde

mientras         mientras



suma            \+

resta            \-

multiplicacion         \*

division         \/

modulo            %

menor            <

mayor            >

menorOigual         <=

mayorOigual         >=

igualigual         ==

distinto         !=

y            &

o            \|

no            !

igual            =

masIgual         \+=

menosIgual         \-=

porIgual         \*=

entreIgual         \/=


%%


{identificador}         { return identificador; }

{entero}         { return entero; }

{numeroreal}         { return numeroreal; }

{null}            { return null; }


{puntoYcoma}         { return puntoYcoma; }

{abreParentesis}      { return abreParentesis; }   

{cierraParentesis}      { return cierraParentesis; }

{abreLlave}         { return abreLlave; }

{cierraLlave}         { return cierraLlave; }

{punto}            { return punto; }

{retornoCarro}         { return retornoCarro; }

{comillas}         { return comillas; }

{comillaSimple}         { return comillaSimple; }

{coma}            { return coma; }

{inicio_comentario}      { return inicio_comentario; }


{tipo_car}         { return tipo_car; }

{tipo_ent}         { return tipo_ent; }

{tipo_bool}         { return tipo_bool; }

{valor_bool}         { return valor_bool; }

{tipo_real}         { return tipo_real; }

{tipo_cadena}         { return tipo_cadena; }

{tipo_array}         { return tipo_array; }

{rango}            { return rango; }

{de}            { return de; }

{tipo_estructura}      { return tipo_estructura; }



{si}            { return si; }

{sino}            { return sino; }

{elige}            { return elige; }

{caso}            { return caso; }

{defecto}         { return defecto; }

{desde}            { return desde; }   

{mientras}         { return mientras; }



{suma}            { return suma; }

{resta}            { return resta; }

{multiplicacion}      { return multiplicacion; }

{division}         { return division; }

{modulo}         { return modulo; }



{menor}            { return menor; }

{mayor}            { return mayor; }

{menorOigual}         { return menorOigual; }

{mayorOigual}         { return mayorOigual; }

{igualigual}         { return igualigual; }

{distinto}         { return distinto; }



{y}            { return y; }

{o}            { return o; }

{no}            { return no; }

{igual}            { return igual; }

{masIgual}         { return masIgual; }

{menosIgual}         { return menosIgual; }

{porIgual}         { return porIgual; }

{entreIgual}         { return entreIgual; }



%%



int leerToken(){

   int token = yylex();



   if(token==13){

      columna = 1;

      fila++;

   }else{

      columna+=yyleng;

   }

}



void procesarToken(int token){

   char carac;

   switch(token){

      case comillas:

// ¿?¿?¿?¿?¿?¿?

         while(token=leerToken() != comillas || token != 13){}

         if(token == comillas){

            printf("(%d, %d) CADENA %s", fila, columna, yytext);

         }else{

            fprintf(stderr, "¡AVISO! (%d, %d) Carácter extraño. Sustituyendo por \"blanco\"", fila, columna);

            

            while(token=leerToken() != comillas && token != 13){}

            if(token == comillas)

               printf("(%d, %d) CADENA %s", fila, columna, yytext);

         }

         break;

      case entero:

         printf("(%d, %d) ENTERO %s", fila, columna, yytext);

         break;

      case numeroreal:

         printf("(%d, %d) NUMEROREAL %s", fila, columna, yytext);

         break;      

      case palabra:

         printf("(%d, %d) PALABRA %s", fila, columna, yytext);

         break;                  

      case identificador:

         printf("(%d, %d) IDENTIFICADOR %s", fila, columna, yytext);

         break;

      case null:

         printf("(%d, %d) NULL %s", fila, columna, yytext);

         break;         



// cositas

      case puntoYcoma:

         printf("(%d, %d) PUNTOYCOMA %s", fila, columna, yytext);

         break;

      case abreParentesis:

         printf("(%d, %d) ABREPARENTESIS %s", fila, columna, yytext);

         break;

      case cierraParentesis:

         printf("(%d, %d) CIERRAPARENTESIS %s", fila, columna, yytext);

         break;

      case abreLlave:

         printf("(%d, %d) ABRELLAVE %s", fila, columna, yytext);

         break;

      case cierraLlave:

         printf("(%d, %d) CIERRALLAVE %s", fila, columna, yytext);

         break;

      case punto:

         printf("(%d, %d) PUNTO %s", fila, columna, yytext);

         break;

      case retornoCarro:

         printf("(%d, %d) RETORNOCARRO %s", fila, columna, yytext);

         break;

      case comillaSimple:

         carac = leerToken();



         if((token = leerToken()) != comillaSimple){

            fprintf(stderr, "¡AVISO! (%d, %d) Falta comilla de fin de caracter. Se inserta automáticamente.", fila, columna);

            printf("(%d, %d) CARACTER %c", fila, columna, carac);

            procesarToken(token);

         }else{

            printf("(%d, %d) CARACTER %c", fila, columna, carac);

         }

         break;

      case coma:

         printf("(%d, %d) COMA %s", fila, columna, yytext);

         break;



// tipos

      case tipo_car:

         printf("(%d, %d) TIPO_CAR %s", fila, columna, yytext);

         break;

      case tipo_ent:

         printf("(%d, %d) TIPO_ENT %s", fila, columna, yytext);

         break;

      case tipo_bool:

         printf("(%d, %d) TIPO_BOOL %s", fila, columna, yytext);

         break;

      case valor_bool:

         printf("(%d, %d) VALOR_BOOL %s", fila, columna, yytext);

         break;

      case tipo_real:

         printf("(%d, %d) TIPO_REAL %s", fila, columna, yytext);

         break;

      case tipo_cadena:

         printf("(%d, %d) TIPO_CADENA %s", fila, columna, yytext);

         break;

      case tipo_array:

         printf("(%d, %d) TIPO_ARRAY %s", fila, columna, yytext);

         break;

      case rango:

         printf("(%d, %d) RANGO %s", fila, columna, yytext);

         break;

      case de:

         printf("(%d, %d) DE %s", fila, columna, yytext);

         break;

      case tipo_estructura:

         printf("(%d, %d) TIPO_ESTRUCTURA %s", fila, columna, yytext);

         break;



// estructuras de control

      case si:

         printf("(%d, %d) SI %s", fila, columna, yytext);

         break;

      case sino:

         printf("(%d, %d) SINO %s", fila, columna, yytext);

         break;

      case elige:

         printf("(%d, %d) ELIGE %s", fila, columna, yytext);

         break;

      case caso:

         printf("(%d, %d) CASO %s", fila, columna, yytext);

         break;

      case defecto:

         printf("(%d, %d) DEFECTO %s", fila, columna, yytext);

         break;

      case desde:

         printf("(%d, %d) DESDE %s", fila, columna, yytext);

         break;

      case mientras:

         printf("(%d, %d) MIENTRAS %s", fila, columna, yytext);

         break;



// operadores aritmeticos

      case suma:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case resta:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case multiplicacion:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case division:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case modulo:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case menor:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case mayor:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case menorOigual:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case mayorOigual:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case igualigual:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case distinto:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;



      case y:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case o:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case no:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case igual:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case masIgual:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case menosIgual:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case porIgual:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;

      case entreIgual:

         printf("(%d, %d) OPERADOR %s", fila, columna, yytext);

         break;



// añadidos posteriormente

      case inicio_comentario:

         while(token=leerToken() != 13){}

         printf("(%d, %d) COMENTARIO", fila, columna);

         break;

      default:

         fprintf(stderr,"(%d, %d) ¡ERROR! Carácter extraño %s", fila, columna, yytext);

   }

}



int main(int argc, char * argv){
   int token;
   
   if (argc!=2){

      fprintf(stderr,"¡ERROR FATAL! Introduzca como parámetro el fichero de entrada\n");

      return -1;
   }

   if((yyin = fopen (argv[1], "r")) == NULL){
      fprintf(stderr,"¡ERROR FATAL! Error abriendo el fichero de entrada\n");

      return -1;
   }

   token=leerToken();

   while(token){
      procesarToken(token);

      token = leerToken();
   }

      

   if(fclose(yyin)!=0){
      fprintf(stderr,"¡ERROR FATAL! Error cerrando el fichero de entrada\n");

      return -1;
   }

   return 0;
}


#=====================================================
# Fichero: Makefile
# Tema: genera un analizador léxico para
# introducir Flex/Lex
# Fecha: Noviembre-08
# Uso: make
#=====================================================
LEX=flex
CC=gcc

AL_miLenguaje_3: lex.yy.o
   $(CC) -o AL_miLenguaje_3 lex.yy.o -lfl
      #-L/opt/flex/lib -lfl para Merlin
lex.yy.o: lex.yy.c
   $(CC) -c lex.yy.c

lex.yy.c: AL_miLenguaje_3.l
   $(LEX) AL_miLenguaje_3.l


Consola
[pablo@pablerkas p2.2]$ make
flex AL_miLenguaje_3.l
AL_miLenguaje_3.l:89: warning, la regla no se puede aplicar
AL_miLenguaje_3.l:91: warning, la regla no se puede aplicar
AL_miLenguaje_3.l:92: warning, la regla no se puede aplicar
AL_miLenguaje_3.l:100: warning, la regla no se puede aplicar
gcc -c lex.yy.c
AL_miLenguaje_3.l: En la función ‘main’:
AL_miLenguaje_3.l:348: aviso: el paso del argumento 1 de ‘fopen’ crea un puntero desde un entero sin una conversión
gcc -o AL_miLenguaje_3 lex.yy.o -lfl
#-L/opt/flex/lib -lfl para Merlin
[pablo@pablerkas p2.2]$ ./AL_miLenguaje_3 factorial.ml
�ERROR FATAL! Error abriendo el fichero de entrada
[pablo@pablerkas p2.2]$ flex --version
flex 2.5.35


Las líneas son:

89 --> {tipo_car} { return tipo_car; }
91 --> {tipo_bool} { return tipo_bool; }
92 --> {valor_bool} { return valor_bool; }
100 --> {si} { return si; }

Pero lo que más me mosquea es que no sea capaz de abrir el fichero. He buscado por internet y en todos los ejemplos que he encontrado lo hacen así...

Gracias por adelantado sea lo que sea...
Ahora no tengo las prácticas que flex que hice pero juraría que metíamos los ficheros desde shell con una redirección (./programa < fichero), no usábamos fopen para nada.
Ya bueno, es un requisito de la práctica... Lo de la redirección ya lo hicimos antes, ahora toca pasarle el nombre de fichero como parámetro del programa.
Eso ya no lo hice, así que no te puedo decir nada exacto.

Las funciones de flex para leer no especifican un fichero, ¿no? Si siempre leen desde stdin lo que tendrás que redireccionar dentro del programa el fichero que quieres abrir al descriptor que corresponde a stdin.

No sé si he dicho alguna barbaridad [mad]
Hombre, suena lógico y fue lo que pensamos en un principio mi compañera y yo, pero luego vimos que todo el mundo usa la forma

yyin = fopen(argv[1],"r");

... pero a nosotros no nos funciona... Y ya sabes cómo son los profesores, que o lo haces como a ellos les gusta o te crujen.

De todas maneras, ¿tú sabes cómo se haría eso que dices? Intentamos un par de cosas pero no nos salió.
Sólo cierra stdin y abre el nuevo fichero usando el descriptor stdin.

Por ejemplo, el siguiente programa imprimiría el contenido de test.c:

#include <stdio.h>

int main(){
   fclose(stdin);
   stdin = fopen("test.c", "r");
   
   while (!feof(stdin)){
      fprintf(stdout, "%c", fgetc(stdin));
   }

   return 1;
}


Edito:

En un PDF sobre flex que no recuerdo de dónde saqué, en un ejemplo sencillo está esto:

main( argc, argv )
int argc;
char **argv;
    {
    ++argv, --argc; /* se salta el nombre del programa */
    if ( argc > 0 )
            yyin = fopen( argv[0], "r" );
    else
            yyin = stdin;
    yylex();
    }
El pdf ese también lo he visto yo, pero no funciona.

Lo primero me dice que violo un segmento... con lo buenecito que soy yo...
Slurp escribió:El pdf ese también lo he visto yo, pero no funciona.

Lo primero me dice que violo un segmento... con lo buenecito que soy yo...


No se si será una chorrada, pero pon la ruta completa (o un "./" delante) del fichero que quieres abrir, ya que el codigo que usas para abrir el fichero es correcto, y el error que da, tiene que ser que bien no es accesible o la ruta no es la correcta.
También lo he intentado ya con la ruta entera desde / y nada... Muchas gracias a los dos por el interés, supongo que mañana colgaré la solución del profesor aquí, porsiaca...
El problema es cómo tienes definido argv. O al menos es muy difícil que funcione si lo tienes tal cual lo has pegado.

Los warnings del compilador están para leerlos, etc....

- ferdy
Me he dado cuenta hace un rato, pero gracias... El warning lo solucioné anteriormente de una manera que me seguía dando el mismo error, así que supuse que no era por eso. Luego repasando todo de arriba abajo lo vi... Un día más que se va en una chorrada, cómo odio la programación.
Hombre, apuesto a que el warning llevaba ahí desde el primer minuto... igual la culpa no se la deberías echar a la programación si no a lo mal que os han enseñado C (o lo mal que lo has aprendido). Más que nada porque la única forma de 'arreglar' el warning es usando la declaración correcta y habría funcionado.

- ferdy
A ver, por partes. La declaración me la sé de memoria y me han enseñado C perfectamente, simplemente se me ha olvidado poner [] y ya está. Si con la declaración mal haces

argv++
yyin = fopen(argv,"r");

, como vi en algún ejemplo, el warning no aparece y por eso pasé del tema; porque no es la primera ni será la última que el compilador me da un warning por algo que es exactamente lo que yo quiero hacer. Lógicamente sabía que algo fallaba ahí (básicamente porque no funcionaba) y por eso pregunté aquí; no porque no hubiese visto el warning o hubiese pasado de él... Luego repasando todo línea a línea me di cuenta peeeeeeero en cualquier caso yo, particularmente, me cago en la programación, que siempre me tiene horas pegado a la pantalla por chorradas de este estilo. ¿A ti te gusta? Perfecto. ¿Tú has aprendido C que te cagas y estas cosas no te pasan? Me parece estupendo, a mí no... ni me interesa.
1) El ejemplo que pones es incorrecto. El código debería seguir dando warning.
2) Se nota que ni te gusta ni se te da bien, no es que sea nuestro problema.
3) Oye... te hemos hecho los deberes para que no suspendas, encima no vengas tocando las bolas, ¿no te parece?
1) Es incorrecto pero no da warning.
2) No he dicho que sea vuestro problema, he pedido ayuda tras cuatro horas cambiando cosas y buscando en google y leyendo guías. Si quieres me prestas la tuya y si no no.
3) No necesito que me perdones la vida... Con decir "es que se te ha olvidado []" sería suficiente, que seguramente es lo que habrían hecho amuchamu o Taber si se hubiesen dado cuenta... Pero no, me dices que los warning son para hacerles caso, que no he aprendido bien C... Si hubiese venido aquí en el minuto uno en que no me sale pues entendería tu prepotencia, pero no ha sido así.

Lo dicho, si quieres me ayudas y si no no, pero para ponerme de vago y tonto pues abstente, que igualmente lo solucioné al final sin tu visionaria ayuda. Y ten por seguro que si me va un suspenso en ello no eres mi última opción.
(0) ares:~ ferdy$ cat t.c
#include <stdio.h>

int main(int argc, char *argv)
{
   argv++;
   FILE f = fopen(argv[0], "r");
   return 0;
}
(0) ares:~ ferdy$ make t
cc     t.c   -o t
t.c: In function ‘main’:
t.c:6: warning: passing argument 1 of ‘fopen’ makes pointer from integer without a cast
t.c:6: error: invalid initializer
make: *** [t] Error 1
(2) ares:~ ferdy$


En fin... con lo fácil que es usar un compilador eh... incluso más fácil que programar.

2) No he dicho que sea vuestro problema, he pedido ayuda tras cuatro horas cambiando cosas y buscando en google y leyendo guías. Si quieres me prestas la tuya y si no no.
3) No necesito que me perdones la vida... Con decir "es que se te ha olvidado []" sería suficiente, que seguramente es lo que habrían hecho amuchamu o Taber si se hubiesen dado cuenta... Pero no, me dices que los warning son para hacerles caso, que no he aprendido bien C... Si hubiese venido aquí en el minuto uno en que no me sale pues entendería tu prepotencia, pero no ha sido así.

Lo dicho, si quieres me ayudas y si no no, pero para ponerme de vago y tonto pues abstente, que igualmente lo solucioné al final sin tu visionaria ayuda. Y ten por seguro que si me va un suspenso en ello no eres mi última opción.


No, si encima tendré que pedirte perdón porque no tengas ni puta idea de C y te haya ayudado (aunque lo hubieras solucionado tu).

En fin... que lo siento, no te jode.

- ferdy
%{

#include <stdio.h>

#include <stdlib.h>

#include "tokens.h"



int fila=1, columna=1;

%}




digito            [0-9]

entero            {digito}+

numeroreal         {entero}"."{entero}

letra            [a-zA-Z]
palabra            {letra}+

identificador         {letra}(-|_|{letra}|{digito})*

espacio            [ \t]+


caracter         .
finLinea         [\n]



tipo_car         car

tipo_ent         ent

tipo_bool         bool

valor_bool         verdadero|falso

tipo_real         real

tipo_cadena         cadena

tipo_array         array

rango            \.\.

de            de

tipo_estructura         estructura


si            si

sino            sino

elige            elige

caso            caso

defecto            defecto

desde            desde

mientras         mientras

null            null



suma            \+

resta            \-

multiplicacion         \*

division         \/

modulo            %

menor            <

mayor            >

menorOigual         <=

mayorOigual         >=

igualigual         ==

distinto         !=

y            &

o            \|

no            !

igual            =

masIgual         \+=

menosIgual         \-=

porIgual         \*=

entreIgual         \/=

puntoYcoma         ;

abreParentesis         \(

cierraParentesis      \)

abreLlave         \{

cierraLlave         \}

punto            \.

retornoCarro         \\n

comillas         \"

comillaSimple         '

coma            ,

inicio_comentario      \-\-


%%


{entero}         { return entero; }

{numeroreal}         { return numeroreal; }

{null}            { return null; }
{finLinea}         { return finLinea; }
{espacio}         { return espacio; }


{puntoYcoma}         { return puntoYcoma; }

{abreParentesis}      { return abreParentesis; }   

{cierraParentesis}      { return cierraParentesis; }

{abreLlave}         { return abreLlave; }

{cierraLlave}         { return cierraLlave; }

{punto}            { return punto; }

{retornoCarro}         { return retornoCarro; }

{comillas}         { return comillas; }

{comillaSimple}         { return comillaSimple; }

{coma}            { return coma; }

{inicio_comentario}      { return inicio_comentario; }


{tipo_car}         { return tipo_car; }

{tipo_ent}         { return tipo_ent; }

{tipo_bool}         { return tipo_bool; }

{valor_bool}         { return valor_bool; }

{tipo_real}         { return tipo_real; }

{tipo_cadena}         { return tipo_cadena; }

{tipo_array}         { return tipo_array; }

{rango}            { return rango; }

{de}            { return de; }

{tipo_estructura}      { return tipo_estructura; }



{si}            { return si; }

{sino}            { return sino; }

{elige}            { return elige; }

{caso}            { return caso; }

{defecto}         { return defecto; }

{desde}            { return desde; }   

{mientras}         { return mientras; }



{suma}            { return suma; }

{resta}            { return resta; }

{multiplicacion}      { return multiplicacion; }

{division}         { return division; }

{modulo}         { return modulo; }



{menor}            { return menor; }

{mayor}            { return mayor; }

{menorOigual}         { return menorOigual; }

{mayorOigual}         { return mayorOigual; }

{igualigual}         { return igualigual; }

{distinto}         { return distinto; }



{y}            { return y; }

{o}            { return o; }

{no}            { return no; }

{igual}            { return igual; }

{masIgual}         { return masIgual; }

{menosIgual}         { return menosIgual; }

{porIgual}         { return porIgual; }

{entreIgual}         { return entreIgual; }

{identificador}         { return identificador; }



%%



void procesarToken(int token){
   char carac;


   switch(token){

      case comillas:
         while(token=yylex() != comillas){
            if(token == finLinea){
               fprintf(stderr, "¡AVISO! (%d, %d) Caracter extranyo. Sustituyendo por \"blanco\"\n", fila, columna);
               fila++;
            }

            columna += yyleng;
         }

         printf("(%d, %d) CADENA \n", fila, columna);
         break;
      case entero:

         printf("(%d, %d) ENTERO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case numeroreal:

         printf("(%d, %d) NUMEROREAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;      

      case palabra:

         printf("(%d, %d) PALABRA %s\n", fila, columna, yytext);
         columna += yyleng;

         break;                  

      case identificador:

         printf("(%d, %d) IDENTIFICADOR %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case null:

         printf("(%d, %d) NULL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;         



// cositas

      case puntoYcoma:

         printf("(%d, %d) PUNTOYCOMA %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case abreParentesis:

         printf("(%d, %d) ABREPARENTESIS %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case cierraParentesis:

         printf("(%d, %d) CIERRAPARENTESIS %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case abreLlave:

         printf("(%d, %d) ABRELLAVE %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case cierraLlave:

         printf("(%d, %d) CIERRALLAVE %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case punto:

         printf("(%d, %d) PUNTO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case retornoCarro:

         printf("(%d, %d) RETORNOCARRO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case comillaSimple:

         carac = yylex();



         if((token = yylex()) != comillaSimple){

            fprintf(stderr, "¡AVISO! (%d, %d) Falta comilla de fin de caracter. Se inserta automaticamente.\n", fila, columna);

            printf("(%d, %d) CARACTER %c\n", fila, columna, carac);

            procesarToken(token);

         }else{

            printf("(%d, %d) CARACTER %c\n", fila, columna, carac);

         }
         columna += yyleng;

         break;

      case coma:

         printf("(%d, %d) COMA %s\n", fila, columna, yytext);
         columna += yyleng;

         break;



// tipos

      case tipo_car:

         printf("(%d, %d) TIPO_CAR %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_ent:

         printf("(%d, %d) TIPO_ENT %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_bool:

         printf("(%d, %d) TIPO_BOOL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case valor_bool:

         printf("(%d, %d) VALOR_BOOL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_real:

         printf("(%d, %d) TIPO_REAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_cadena:

         printf("(%d, %d) TIPO_CADENA %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_array:

         printf("(%d, %d) TIPO_ARRAY %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case rango:

         printf("(%d, %d) RANGO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case de:

         printf("(%d, %d) DE %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_estructura:

         printf("(%d, %d) TIPO_ESTRUCTURA %s\n", fila, columna, yytext);
         columna += yyleng;

         break;



// estructuras de control

      case si:

         printf("(%d, %d) SI %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case sino:

         printf("(%d, %d) SINO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case elige:

         printf("(%d, %d) ELIGE %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case caso:

         printf("(%d, %d) CASO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case defecto:

         printf("(%d, %d) DEFECTO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case desde:

         printf("(%d, %d) DESDE %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case mientras:

         printf("(%d, %d) MIENTRAS %s\n", fila, columna, yytext);
         columna += yyleng;

         break;



// operadores aritmeticos

      case suma:

         printf("(%d, %d) OPERADOR ARITMETICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case resta:

         printf("(%d, %d) OPERADOR ARITMETICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case multiplicacion:

         printf("(%d, %d) OPERADOR ARITMETICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case division:

         printf("(%d, %d) OPERADOR ARITMETICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case modulo:

         printf("(%d, %d) OPERADOR ARITMETICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;


      case menor:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case mayor:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case menorOigual:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case mayorOigual:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case igualigual:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case distinto:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;



      case y:

         printf("(%d, %d) OPERADOR LOGICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case o:

         printf("(%d, %d) OPERADOR LOGICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case no:

         printf("(%d, %d) OPERADOR LOGICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case igual:
         printf("(%d, %d) OPERADOR ASIGNACION %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case masIgual:

         printf("(%d, %d) OPERADOR ARITMETICO-ASIGNACION %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case menosIgual:

         printf("(%d, %d) OPERADOR ARITMETICO-ASIGNACION %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case porIgual:

         printf("(%d, %d) OPERADOR ARITMETICO-ASIGNACION %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case entreIgual:

         printf("(%d, %d) OPERADOR ARITMETICO-ASIGNACION %s\n", fila, columna, yytext);
         columna += yyleng;

         break;



// anyadidos posteriormente

      case inicio_comentario:
         printf("(%d, %d) COMENTARIO\n", fila, columna);


         while(token=yylex() != finLinea){}


         columna = 0;
         fila++;

         break;
      case finLinea:
         columna = 0;
         fila ++;
         break;
      case espacio:
         columna += yyleng;
         break;

      default:

         fprintf(stderr,"(%d, %d) ¡ERROR! Caracter extranyo %s\n", fila, columna, yytext);
         columna += yyleng;

   }

}



int main(int argc, char * argv){
   int token;
   /*
   if (argc!=2){

      fprintf(stderr,"¡ERROR FATAL! Introduzca como parametro el fichero de entrada\n");

      return -1;
   }

   if((yyin = fopen (argv[1], "r")) == NULL){
      fprintf(stderr,"¡ERROR FATAL! Error abriendo el fichero de entrada\n");

      return -1;
   }*/
   argv++;
   yyin = fopen(argv, "r");

   token=yylex();

   while(token){
      procesarToken(token);
      token = yylex();
   }      

   if(fclose(yyin)!=0){
      fprintf(stderr,"¡ERROR FATAL! Error cerrando el fichero de entrada\n");

      return -1;
   }

   return 0;
}


[pablo@pablerkas carpeta sin título]$ make
flex AL_miLenguaje_3.l
gcc -c lex.yy.c
gcc -o AL_miLenguaje_3 lex.yy.o -lfl
#-L/opt/flex/lib -lfl para Merlin
[pablo@pablerkas carpeta sin título]$


... es que encima me llamará mentiroso... Saber C está muy bien, pero en su día preferí aprender modales.
Saber C está muy bien, pero en su día preferí aprender modales.


Es una pena que fracasaras en ambas empresas.

Lo dicho, es cuestión de que aprendas a usar el compilador...

- ferdy
Hala tira, prográmate un par de amigos, enséñales C y a mí déjame en paz.

A ver si algún moderador cierra esto...
Slurp escribió:
%{

#include <stdio.h>

#include <stdlib.h>

#include "tokens.h"



int fila=1, columna=1;

%}




digito            [0-9]

entero            {digito}+

numeroreal         {entero}"."{entero}

letra            [a-zA-Z]
palabra            {letra}+

identificador         {letra}(-|_|{letra}|{digito})*

espacio            [ \t]+


caracter         .
finLinea         [\n]



tipo_car         car

tipo_ent         ent

tipo_bool         bool

valor_bool         verdadero|falso

tipo_real         real

tipo_cadena         cadena

tipo_array         array

rango            \.\.

de            de

tipo_estructura         estructura


si            si

sino            sino

elige            elige

caso            caso

defecto            defecto

desde            desde

mientras         mientras

null            null



suma            \+

resta            \-

multiplicacion         \*

division         \/

modulo            %

menor            <

mayor            >

menorOigual         <=

mayorOigual         >=

igualigual         ==

distinto         !=

y            &

o            \|

no            !

igual            =

masIgual         \+=

menosIgual         \-=

porIgual         \*=

entreIgual         \/=

puntoYcoma         ;

abreParentesis         \(

cierraParentesis      \)

abreLlave         \{

cierraLlave         \}

punto            \.

retornoCarro         \\n

comillas         \"

comillaSimple         '

coma            ,

inicio_comentario      \-\-


%%


{entero}         { return entero; }

{numeroreal}         { return numeroreal; }

{null}            { return null; }
{finLinea}         { return finLinea; }
{espacio}         { return espacio; }


{puntoYcoma}         { return puntoYcoma; }

{abreParentesis}      { return abreParentesis; }   

{cierraParentesis}      { return cierraParentesis; }

{abreLlave}         { return abreLlave; }

{cierraLlave}         { return cierraLlave; }

{punto}            { return punto; }

{retornoCarro}         { return retornoCarro; }

{comillas}         { return comillas; }

{comillaSimple}         { return comillaSimple; }

{coma}            { return coma; }

{inicio_comentario}      { return inicio_comentario; }


{tipo_car}         { return tipo_car; }

{tipo_ent}         { return tipo_ent; }

{tipo_bool}         { return tipo_bool; }

{valor_bool}         { return valor_bool; }

{tipo_real}         { return tipo_real; }

{tipo_cadena}         { return tipo_cadena; }

{tipo_array}         { return tipo_array; }

{rango}            { return rango; }

{de}            { return de; }

{tipo_estructura}      { return tipo_estructura; }



{si}            { return si; }

{sino}            { return sino; }

{elige}            { return elige; }

{caso}            { return caso; }

{defecto}         { return defecto; }

{desde}            { return desde; }   

{mientras}         { return mientras; }



{suma}            { return suma; }

{resta}            { return resta; }

{multiplicacion}      { return multiplicacion; }

{division}         { return division; }

{modulo}         { return modulo; }



{menor}            { return menor; }

{mayor}            { return mayor; }

{menorOigual}         { return menorOigual; }

{mayorOigual}         { return mayorOigual; }

{igualigual}         { return igualigual; }

{distinto}         { return distinto; }



{y}            { return y; }

{o}            { return o; }

{no}            { return no; }

{igual}            { return igual; }

{masIgual}         { return masIgual; }

{menosIgual}         { return menosIgual; }

{porIgual}         { return porIgual; }

{entreIgual}         { return entreIgual; }

{identificador}         { return identificador; }



%%



void procesarToken(int token){
   char carac;


   switch(token){

      case comillas:
         while(token=yylex() != comillas){
            if(token == finLinea){
               fprintf(stderr, "¡AVISO! (%d, %d) Caracter extranyo. Sustituyendo por \"blanco\"\n", fila, columna);
               fila++;
            }

            columna += yyleng;
         }

         printf("(%d, %d) CADENA \n", fila, columna);
         break;
      case entero:

         printf("(%d, %d) ENTERO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case numeroreal:

         printf("(%d, %d) NUMEROREAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;      

      case palabra:

         printf("(%d, %d) PALABRA %s\n", fila, columna, yytext);
         columna += yyleng;

         break;                  

      case identificador:

         printf("(%d, %d) IDENTIFICADOR %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case null:

         printf("(%d, %d) NULL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;         



// cositas

      case puntoYcoma:

         printf("(%d, %d) PUNTOYCOMA %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case abreParentesis:

         printf("(%d, %d) ABREPARENTESIS %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case cierraParentesis:

         printf("(%d, %d) CIERRAPARENTESIS %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case abreLlave:

         printf("(%d, %d) ABRELLAVE %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case cierraLlave:

         printf("(%d, %d) CIERRALLAVE %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case punto:

         printf("(%d, %d) PUNTO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case retornoCarro:

         printf("(%d, %d) RETORNOCARRO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case comillaSimple:

         carac = yylex();



         if((token = yylex()) != comillaSimple){

            fprintf(stderr, "¡AVISO! (%d, %d) Falta comilla de fin de caracter. Se inserta automaticamente.\n", fila, columna);

            printf("(%d, %d) CARACTER %c\n", fila, columna, carac);

            procesarToken(token);

         }else{

            printf("(%d, %d) CARACTER %c\n", fila, columna, carac);

         }
         columna += yyleng;

         break;

      case coma:

         printf("(%d, %d) COMA %s\n", fila, columna, yytext);
         columna += yyleng;

         break;



// tipos

      case tipo_car:

         printf("(%d, %d) TIPO_CAR %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_ent:

         printf("(%d, %d) TIPO_ENT %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_bool:

         printf("(%d, %d) TIPO_BOOL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case valor_bool:

         printf("(%d, %d) VALOR_BOOL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_real:

         printf("(%d, %d) TIPO_REAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_cadena:

         printf("(%d, %d) TIPO_CADENA %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_array:

         printf("(%d, %d) TIPO_ARRAY %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case rango:

         printf("(%d, %d) RANGO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case de:

         printf("(%d, %d) DE %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case tipo_estructura:

         printf("(%d, %d) TIPO_ESTRUCTURA %s\n", fila, columna, yytext);
         columna += yyleng;

         break;



// estructuras de control

      case si:

         printf("(%d, %d) SI %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case sino:

         printf("(%d, %d) SINO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case elige:

         printf("(%d, %d) ELIGE %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case caso:

         printf("(%d, %d) CASO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case defecto:

         printf("(%d, %d) DEFECTO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case desde:

         printf("(%d, %d) DESDE %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case mientras:

         printf("(%d, %d) MIENTRAS %s\n", fila, columna, yytext);
         columna += yyleng;

         break;



// operadores aritmeticos

      case suma:

         printf("(%d, %d) OPERADOR ARITMETICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case resta:

         printf("(%d, %d) OPERADOR ARITMETICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case multiplicacion:

         printf("(%d, %d) OPERADOR ARITMETICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case division:

         printf("(%d, %d) OPERADOR ARITMETICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case modulo:

         printf("(%d, %d) OPERADOR ARITMETICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;


      case menor:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case mayor:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case menorOigual:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case mayorOigual:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case igualigual:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case distinto:

         printf("(%d, %d) OPERADOR RELACIONAL %s\n", fila, columna, yytext);
         columna += yyleng;

         break;



      case y:

         printf("(%d, %d) OPERADOR LOGICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case o:

         printf("(%d, %d) OPERADOR LOGICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case no:

         printf("(%d, %d) OPERADOR LOGICO %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case igual:
         printf("(%d, %d) OPERADOR ASIGNACION %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case masIgual:

         printf("(%d, %d) OPERADOR ARITMETICO-ASIGNACION %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case menosIgual:

         printf("(%d, %d) OPERADOR ARITMETICO-ASIGNACION %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case porIgual:

         printf("(%d, %d) OPERADOR ARITMETICO-ASIGNACION %s\n", fila, columna, yytext);
         columna += yyleng;

         break;

      case entreIgual:

         printf("(%d, %d) OPERADOR ARITMETICO-ASIGNACION %s\n", fila, columna, yytext);
         columna += yyleng;

         break;



// anyadidos posteriormente

      case inicio_comentario:
         printf("(%d, %d) COMENTARIO\n", fila, columna);


         while(token=yylex() != finLinea){}


         columna = 0;
         fila++;

         break;
      case finLinea:
         columna = 0;
         fila ++;
         break;
      case espacio:
         columna += yyleng;
         break;

      default:

         fprintf(stderr,"(%d, %d) ¡ERROR! Caracter extranyo %s\n", fila, columna, yytext);
         columna += yyleng;

   }

}



int main(int argc, char * argv){
   int token;
   /*
   if (argc!=2){

      fprintf(stderr,"¡ERROR FATAL! Introduzca como parametro el fichero de entrada\n");

      return -1;
   }

   if((yyin = fopen (argv[1], "r")) == NULL){
      fprintf(stderr,"¡ERROR FATAL! Error abriendo el fichero de entrada\n");

      return -1;
   }*/
   argv++;
   yyin = fopen(argv, "r");

   token=yylex();

   while(token){
      procesarToken(token);
      token = yylex();
   }      

   if(fclose(yyin)!=0){
      fprintf(stderr,"¡ERROR FATAL! Error cerrando el fichero de entrada\n");

      return -1;
   }

   return 0;
}


[pablo@pablerkas carpeta sin título]$ make
flex AL_miLenguaje_3.l
gcc -c lex.yy.c
gcc -o AL_miLenguaje_3 lex.yy.o -lfl
#-L/opt/flex/lib -lfl para Merlin
[pablo@pablerkas carpeta sin título]$


... es que encima me llamará mentiroso... Saber C está muy bien, pero en su día preferí aprender modales.

-Wall (--pedantic para mas info aún) :).

Un saludo
Slurp escribió:Un día más que se va en una chorrada, cómo odio la programación.

¿Y si no te gusta para qué la estudias?
Para acabar la carrera.
Me refería a la carrera.
Porque programar es a un ingeñero como poner ladrillos a un arquitecto.

Pareces nuevo :)

- ferdy
a mi me enseñaban a poner ladrillos (con dibujitos bonitos xDD).... si, es verdad, "necesitaba" saber como pueden hacer los albañiles un tabique xD

y un amplio elenco de ladrillos... que ya he olvidado todos, por supuesto, igual que los distintos aparejos para el tabique xD

(mola el offtopic, perdon :P)
bastian escribió:Me refería a la carrera.

Sinceramente, me equivoqué de carrera... Pero ya es tarde...
Ferdy escribió:Porque programar es a un ingeñero como poner ladrillos a un arquitecto.

Juas, qué bueno Ferdy, ingeñero, no sé puede decir más en una sola palabra. Si es que Spain is different...

Slurp escribió:Sinceramente, me equivoqué de carrera... Pero ya es tarde...

Tío, me da un poco de pena leer esto. ¿Que ya es tarde? ¿Cuántos años tienes? ¿Prefieres pasar el resto de tu vida trabajando en algo que no te gusta a perder unos años en encontrar algo que te motive más?
bastian escribió:
Ferdy escribió:Porque programar es a un ingeñero como poner ladrillos a un arquitecto.

Juas, qué bueno Ferdy, ingeñero, no sé puede decir más en una sola palabra. Si es que Spain is different...

Slurp escribió:Sinceramente, me equivoqué de carrera... Pero ya es tarde...

Tío, me da un poco de pena leer esto. ¿Que ya es tarde? ¿Cuántos años tienes? ¿Prefieres pasar el resto de tu vida trabajando en algo que no te gusta a perder unos años en encontrar algo que te motive más?

Tengo 25, pero no es tan grave, la parte de la informática que implica relaciones humanas sí me gusta. Tengo en mente hacer algún master de negocios o algo que me aleje de los picateclas...
29 respuestas