› Foros › PC › Software libre
%{
#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
[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
#include <stdio.h>
int main(){
fclose(stdin);
stdin = fopen("test.c", "r");
while (!feof(stdin)){
fprintf(stdout, "%c", fgetc(stdin));
}
return 1;
}
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();
}
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...
(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$
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.
%{
#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]$
Saber C está muy bien, pero en su día preferí aprender modales.
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.
Slurp escribió:Un día más que se va en una chorrada, cómo odio la programación.
bastian escribió:Me refería a la carrera.
Ferdy escribió:Porque programar es a un ingeñero como poner ladrillos a un arquitecto.
Slurp escribió:Sinceramente, me equivoqué de carrera... Pero ya es tarde...
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?