Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AxelIglesias en 7 Noviembre 2016, 08:22 am



Título: Problema con FILE y Cadenas
Publicado por: AxelIglesias en 7 Noviembre 2016, 08:22 am
Hola que tal a todos!

Antes que nada queria decir que soy nuevo en el foro y que necesito su ayuda, espero estar en el lugar indicado. ;D

Bueno la cosa es que estoy haciendo un analizador Lexico de Cobol 68 como proyecto de una clase, en resumen el programa abre un archivo de texto con el lenguaje en cuestion y lo que hace es separar el programa en tokens e identificar cada una de ellas (sin usar strtok) y guardar el resultado en otro archivo de texto.

La verdad tengo varios problemas en cuanto a mi codigo, no son de sintaxis ya que compila mi codigo mas bien son logicos, primero que nada ya intente resolverlo con el Debuger y al parecer tengo error en la funcion llamada EsPalabraReservada al parecer esta comparando todo el archivo de texto y realmente no se porque esta pasando eso, agradeceria mucho si me pudieran ayudar a resolver mis dudas y si se puede mi problema  :(.

CODIGO en C

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>

void analizadorLexico(char *cadena);
int EsIdentificador(char ch);
int EsNumero(char ch);
int EsSimbolo(char ch);
int EsPalabraReservada(char * cad);

char *PReservada[]={"BEGIN","END","real","print","read","INT","IN","OUT","CASE","ESAC","EXIT"};
char simbolos[14]={'+','-','/','*','<','>','{','}',';','(',')','[',']',','};
char palabra[20]="";
char constante[20]="";
char asignacion[1]="";

int main()
{
  FILE *fichero;
  char cadena[1000]="";
  int i=0;

  fichero = fopen("codigo.txt","rt");

    if (fichero==NULL)
    {
        printf("No se puede abrir el archivo\n");
        exit(1);
    }
    printf("Contenido del fichero:\n");

    while(feof(fichero)==0)
    {
        //se lee y se guarda en la variable cadena el contenido del archivo
        fscanf (fichero, "%c", &cadena);
        i++;
    }

    if(fclose(fichero)!=0)
    {
        printf("No se cerro el fichero");
    }
    //se muestra en pantalla el contenido del archivo de texto
    puts(cadena);//se muestra el texto del archivo cargado en pantalla
    //ejecutamos el analizador lexico
    analizadorLexico(cadena);
    printf("Proceso completado");
    return 0;
}

void analizadorLexico(char *cade)
{
    //abrimos/creamos el archivo en el que se guardaran las tokens
    FILE *Tokens;
    Tokens = fopen("Tokens.txt", "wt");
    fprintf(Tokens, "Nombre     Tipo de Token");
    int i=0;
    while(cade!='\0')
    {
        if(cade==':')
        {
            int k=0;
            asignacion[k]=cade;
            i++;
            break;
        }
        else
            if(cade=='=' && asignacion[0]==':')
            {
                fprintf(Tokens, ":=    Simbolo(asignacion)");
                asignacion[0] = '\0';
                i++;
                break;
            }
            else
                if(EsSimbolo(cade))
                {
                    fprintf(Tokens, "%c    Simbolo",cade);
                    i++;
                    while(EsSimbolo(cade))
                        fprintf(Tokens, "%c    Simbolo",cade);
                        i++;
                    break;
                }
                else
                {
                    if(EsNumero(cade))
                    {
                        i++;
                        while(EsNumero(cade))
                        {
                            i++;
                        }
                        fprintf(Tokens, "%s    Es una constante",constante);
                        constante[0] = '\0';
                        break;
                    }
                    if(EsIdentificador(cade))
                    {
                       i++;
                       while(EsIdentificador(cade))
                           i++;
                       if(EsPalabraReservada(palabra))
                       {
                           fprintf(Tokens, "%s    Palabra Reservada",palabra);
                           palabra[0] = '\0';
                       }
                       else
                       {
                           fprintf(Tokens, "%s    es un identificador",palabra);
                           palabra[0] = '\0';
                       }
                    }
                }
        i++;
    }
    fclose(Tokens);
}

int EsIdentificador(char ch)
 {
     int j=0;
   if(isalpha(ch)||ch=='_')
   {
       palabra[j]=ch;
       j++;
       return 1;
   }
   else
   {
       return 0;
   }
 }

 int EsNumero(char ch)
 {
     int j=0;
     if(isdigit(ch))
     {
         constante[j]=ch;
         j++;
         return 1;
     }
     else
     {
         return 0;
     }
 }

int EsSimbolo(char ch)
{
    int j;
    for(j=0;j<=14;j++)
    {
       if(ch==simbolos[j])
       {
           return 1;
       }
    }
    return 0;
}

int EsPalabraReservada(char * cad)
{
  int i;
  for(i=0;i<12;i++)
   {
    if(strcmp(PReservada,cad)==0)
      return 1;
    }
  return 0;
}