Palabras reservadas: begin, end, do, while, if
Tipo de elementos/tokens: palabras reservadas, numeros enteros, identificadores, operadores aritmeticos(+,-), comentarios
Fecha: Agosto 2007
Coded by Yuan G. Ho
*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
void uso_programa();
int identif_token(char token[128], int);
int main(int argc, char **argv)
{
FILE *archivo;
char caracter;
char token[128];
int posicion=0;
int flag_com = 0; //bandera para comentarios
if(argc != 2) uso_programa();
archivo = fopen(argv[1], "r");
while ((caracter = fgetc(archivo)) != EOF)
{
if(caracter == '"' || flag_com == 1)
{
token[posicion++] = caracter;
if(flag_com == 0)
flag_com = 1;
else
if(flag_com == 1 && caracter == '"')
{
flag_com = 0;
token[posicion] = '0';
printf("%s ", token);
printf("ttttComentarion");
posicion = 0;
token[posicion] = '0';
printf("%s ", token);
printf("ttttComentarion");
posicion = 0;
}
}
else
return 0;
} if(caracter != ' ' && caracter != 'n' && caracter != ';' && flag_com == 0)
{
else {
}{
token[posicion++] = caracter;
}else {
if(posicion>0)
{
}{
token[posicion] = '0';
printf("%s ", token);
switch(identif_token(token, posicion))
{
posicion = 0;
}switch(identif_token(token, posicion))
{
case 0: printf("ttttpalabra reservadan");
break;
case 1: printf("ttttIdentificadorn");
break;
case 2: printf("ttttOperador aritmeticon");
break;
case 3: printf("ttttNumeron");
break;
default: printf("ttttErrorn");
}break;
case 1: printf("ttttIdentificadorn");
break;
case 2: printf("ttttOperador aritmeticon");
break;
case 3: printf("ttttNumeron");
break;
default: printf("ttttErrorn");
posicion = 0;
return 0;
void uso_programa()
{
puts("Uso: analizador archivo_fuente");
puts("Se debe ejecutar el programa pasando como parametro el nombre del archivo fuente que contiene el codigo a ser analizado");
}puts("Se debe ejecutar el programa pasando como parametro el nombre del archivo fuente que contiene el codigo a ser analizado");
int identif_token(char token[128], int longitud)
{
// -9 representa error
int trans_estado[8][7] = { {0,1,5,3,4,6,-1},
{-9, 1, 2, -9, -9, -9, -1},
{-9, 1, 2, -9, -9, -9, -1},
{-9, -9, 5, -9, -9, -9, -9},
{-9, -9, 5, -9, -9, -9, -9},
{-9, -9, 5, -9, -9, -9, -1},
{6, 6, 6, 6, 6, 7, -9},
{-9, -9, -9, -9, -9, -9, -1}
};
{-9, 1, 2, -9, -9, -9, -1},
{-9, -9, 5, -9, -9, -9, -9},
{-9, -9, 5, -9, -9, -9, -9},
{-9, -9, 5, -9, -9, -9, -1},
{6, 6, 6, 6, 6, 7, -9},
{-9, -9, -9, -9, -9, -9, -1}
};
int estado = 0;
int ciclo;
for(ciclo = 0; ciclo < longitud; ciclo++)
{
if(estado == -9)
return -9;
if(isdigit(token[ciclo]))
return -9;
if(isdigit(token[ciclo]))
estado = trans_estado[estado][2];
else if(isalpha(token[ciclo])) estado = trans_estado[estado][1];
else if(isspace(token[ciclo])) estado = trans_estado[estado][0];
else if(token[ciclo] == '+') estado = trans_estado[estado][3];
else if(token[ciclo] == '-') estado = trans_estado[estado][4];
else if(token[ciclo] == '"') estado = trans_estado[estado][5];
else estado = -9;
}
if(estado == 1)
if(estado == 5)
if(estado == 3)
if(estado == 4)
if(estado == 2)
if(estado == -9)
}if(estado == 1)
if((strcmp(token, "begin") == 0) || (strcmp(token, "end") == 0) || (strcmp(token, "if") == 0) || (strcmp(token, "do") == 0) || (strcmp(token, "while") == 0))
return 0;
else return 1;
if(estado == 5)
return 3;
if(estado == 3)
return 2;
if(estado == 4)
return 2;
if(estado == 2)
return 1;
if(estado == -9)
return -9;