Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problemas con un Programa...

Estas en el tema de Problemas con un Programa... en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 21/06/2008, 23:41
 
Fecha de Ingreso: agosto-2005
Mensajes: 13
Antigüedad: 18 años, 9 meses
Puntos: 0
Sonrisa 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:

*Lo siento por el dibujo tan grande, pero pues, el foro no me permite agregar links...

GRACIAS
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:43.