/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problemas con un Programa...

 
      Índice del Foro elrincondelc.com -> General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
anicom



Registrado: 21 Jun 2008
Mensajes: 1

MensajePublicado: 21/06/2008 9:28 pm
Título: Problemas con un Programa...

Vengo a molestarlos, aver si me pueden ayudar...
En la uni, me pidieron un programa en c, con lo siguiente
1) Que el programa lea un archivo en txt
2) Lo que esta en ese archivo es codigo en ruby
3) Este programa debe leer esto, y analizarlo
4) Ese analisis debe ver si las palabras son reservadas, variables
5) en una tabla, agregar esas palabras, y si son variables agregar el valor
6) Pues, tiene que analizarlo y ver si estan bien escritos cada palabra
7) Despues, debe ver si esta escrito todo en conjunto bien...

Seria mas o menos asi...}

Ahora, lo que llevo no es mucho, ya que me dio problema la tabla...

Código:
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int val(char ca[10]);
int tipo(int p,char c[10]);

char cadena[50];
char Linea[200][30];
char Palabra[100][30];

int estados[34][21]={
    {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},
    {1,2,10,0,3,0,0,0,4,5,0,0,0,0,26,0,0,0,6,0,0},
    {2,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {3,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {4,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {5,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0},
    {6,0,0,0,0,0,0,0,0,0,0,0,32,7,0,0,0,6,0,15},
    {7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,0},
    {8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0},
    {9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,13,0,0,0},
    {10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0},

    {11,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16},
    {16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,0},
    {17,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0},
    {18,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0},
    {19,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

    {21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {22,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {23,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {24,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {26,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {28,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {29,0,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},

    {31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,0},
    {33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    };

struct Aceptadas{
    char palabra[30];
    int tipo;
    int ac;
}palabras[100];

void a_lex();
void a_sin();
void separar();


void main()
{
    separar();
    int n=0,j=0;
    for(int x=0;x<100;x++)
    {
       
        /*Tipo:
        1.-While
        2.-Puts
        3.-If
        4.-Def
        5.-Operacion
        6.-Gets
        7.-End
        8.-Asignacion
        9.-Error
        AC:
        1.-Aceptada
        2.-Rechazada*/
        val(Palabra[x]);
            /*
        switch(val(Palabra[x]))
        {
        case 12:
            strcpy(palabras[n].palabra,Palabra[x]);
            palabras[n].tipo=7;
            palabras[n].ac=1;
            n++;
            break;
        case 13:
            strcpy(palabras[n].palabra,Palabra[x]);
            palabras[n].tipo=8;
            palabras[n].ac=1;
            n++;
            break;
        case 14:
            strcpy(palabras[n].palabra,Palabra[x]);
            palabras[n].tipo=8;
            palabras[n].ac=1;
            n++;
            break;
        case 20:
        strcpy(palabras[n].palabra,Palabra[x]);
            palabras[n].tipo=1;
            palabras[n].ac=1;
            n++;
            break;
        case 21:
            strcpy(palabras[n].palabra,Palabra[x]);
            palabras[n].tipo=2;
            palabras[n].ac=1;
            n++;
            break;
        case 31:
            strcpy(palabras[n].palabra,Palabra[x]);
            palabras[n].tipo=3;
            palabras[n].ac=1;
            n++;
            break;
        case 25:
            strcpy(palabras[n].palabra,Palabra[x]);
            palabras[n].tipo=4;
            palabras[n].ac=1;
            n++;
            break;
        case 33:
            strcpy(palabras[n].palabra,Palabra[x]);
            palabras[n].tipo=5;
            palabras[n].ac=1;
            n++;
            break;
        case 30:
            strcpy(palabras[n].palabra,Palabra[x]);
            palabras[n].tipo=6;
            palabras[n].ac=1;
            n++;
            break;
        default:
            strcpy(palabras[n].palabra,Palabra[x]);
            palabras[n].tipo=9;
            palabras[n].ac=0;
            n++;
            break;
        }
    }
        /*cout<<"+-------------------------------------------------------------------------+"<<endl;

        for(x=0;x<100;x++)
        {
            cout<<palabras[x].palabra<<" || ";
            switch(palabras[x].tipo)
            {
            case 1:
                cout<<"WHILE";
                break;
            case 2:
                cout<<"PUTS";
               
                break;
            case 3:
                cout<<"IF";
               
                break;
            case 4:
                cout<<"DEF";
               
                break;
            case 5:
                cout<<"+|-|*";
               
                break;
            case 6:
                cout<<"GETS";
               
                break;
            case 7:
                cout<<"END";
               
                break;
            case 8:
                cout<<":=Asignacion";
               
                break;
            case 9:
                cout<<"Error";
                break;
            default:
                cout<<" ";
            }

            cout<<" || "<<palabras[x].ac<<endl;
        }*/
}
}



int val(char ca[30])
{
 char temporal;
 int estado=1;
 int p=0;
 cout<<"+------------------------+"<<endl;
 do{
  if(estados[estado][tipo(p,ca)]==0)
   return estado;
  else
   estado=estados[estado][tipo(p,ca)];
  temporal=ca[p];
  p++;
  cout<<ca[p]<<"|||"<<estado<<"|||"<<tipo(p,ca)<<endl;
 }while(temporal!=0);
 cout<<"+------------------------+"<<endl;
 return estado;
}

//----------------------------------------------------------------------------------------------
 
int tipo(int p,char c[10])
{
 int tipo=14;
 switch(c[p])
 {
 case'D':tipo=1;break;
 case'E':tipo=2;break;
 case'F':tipo=3;break;
 case'P':tipo=4;break;
 case'U':tipo=5;break;
 case'T':tipo=6;break;
 case'S':tipo=7;break;
 case'I':tipo=8;break;
 case'W':tipo=9;break;
 case'H':tipo=10;break;
 case'L':tipo=11;break;
 case'+':tipo=12;break;
 case'-':tipo=13;break;
 case'G':tipo=14;break;
 case'=':tipo=16;break;
 case':':tipo=17;break;
 case'A':case'B':case'C':
 case'J':case'K':case'M':
 case'O':case'Q':case'R':
 case'V':case'X':case'Y':
 case'Z':tipo=18;break;
 case'N':tipo=19;break;
 case'*':tipo=20;break;
 default:tipo=15;break;
 }
 return tipo;
}
//----------------------------------------------------------------------------------------------

void separar()
{
    char token[30];
    int n=0,j=0;
    fstream A("texto.txt",ios::in);
   
    while (!A.eof())
    {
        A.getline(token,30,'\n');
        strcpy(Linea[n],token);
        cout<<Linea[n]<<endl;
        n++;
    }
    A.close();
    for(n=0;n<100;n++)
    {
        if(Linea[n]!=NULL)
            cout<<Linea[n]<<endl;
    }
    int x=n;
    int i = 0;
    for(n=0;n<100;n++)
    {
        if(Linea[n]!=NULL)
        {
            char *result = strtok(Linea[n], " ");
            while( result != NULL )
            {
                strcpy(Palabra[i],(char *)malloc( strlen(result) + 1 ));
                strcpy(Palabra[i], result);
                result = strtok( NULL, " " );
                i++;
            }
        }
    }
}


*Ese es el codigo, el problema que tengo ahorita, es que pues, al ir caminando por la tabla, pues, la funcion var, cuando se topa con un While, solo analiza la WHL, entonces, dice que esta mal, y necesito que analice el while...

Este programa divide 1ero por filas, y las agrega al arreglo Linea, y despues divide por espacios, y cada palabra la agrega al arreglo Palabra, despues, de que se separa, se analiza palabra por palabra...si esta bien, o esta mal, la agrega, lo que hace la diferencia es que si es aceptada, pues, en la estructura con variable ac es =1, osea, que es aceptado y en tipo, te agrega cada una de las variables...Despues de todo el cuento este...va el problema, que ia lo dije arriba, pero ahy les va de nuevo...

Al estar analizando la tabla en el AFD, no realiza la operacion con ciertos palabras...

Las palabras aceptadas deben ser:

1.-While

2.-Puts

3.-If

4.-Def

5.-Operacion

6.-Gets

7.-End

8.-Asignacion

9.-Error
entonces, despues, quisiera si se puede, io se que pido mucho, que me den un empujon, para empezar a programar el analizador sintactico...Eso no lo se hacer, y entonces, si me ayudaran con eso...pues estaria agradecido...

Aqui esta el diagrama:


GRACIAS
Volver arriba
      Índice del Foro elrincondelc.com -> General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com