9 sept 2007

/* Analizador lexico primitivo (basico)
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;
}

}
else
if(caracter != ' ' && caracter != 'n' && caracter != ';' && flag_com == 0)
{
token[posicion++] = caracter;
}
else {
if(posicion>0)
{
token[posicion] = '0';
printf("%s ", token);
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");
}
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");
}

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}
};

int estado = 0;
int ciclo;


for(ciclo = 0; ciclo < longitud; ciclo++)
{
if(estado == -9)
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((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;
}

2 comentarios:

Anónimo dijo...

Que bien que exista gente en Panama que le guste el C..!!

no se porque todo el mundo le tiene miedo... :S

Saludos!!!

mira esto: http://mayeco.org/2007.08.24/plasma_moodbar/

DineroRapido dijo...

Que tal amigo primero muchas gracias por los codigos estan de lujo.
Segundo sabes que en el primer analizador no existen las librerias in.h stock.h y me sale error, y el el analizador primitivo en que lenguje c lo programaste en borland c en c++ o te agradesco.
Ya que me da error igual en el analizador primitivo.
Gracias por la ayuda