/* ANALIZADOR SINTACTICO DE CONTEXTO LIBRE RECURSIVO DESCENDENTE PROCESAMIENTO DE LENGUAJE NATURAL ------------------------------------------------------------- PN = predicado nominal Pv = predicado verbal _____________________________________________________ FRASE ----> PN + PV PN ---> articulo + sustantivo PN ---> articulo + sustantivo + adjetivo PN ---> preposicion + PN PV ---> verbo + PN PV ---> verbo + adverbio + PN PV ---> verbo + adverbio PV ---> verbo _____________________________________________________ */ //============================================= // ALGO ASI ESPERO COMO CODIGO //============================================= #include <stdio.h> #include <string.h> #include <stdlib.h> int Analiza( ); int EsPredicadoNominal(); int EsPredicadoVerbal(); int EsArticulo(char*); int EPN_1(); int EPN_2(); struct Pila { int pos; struct Pila *sig; }; struct Pila *pila = NULL; char *sustantivo[] = {"puerta", "ventana", "casa", "ninio", ""}; char *verbo[] = {"tiene", "corre", "juega", ""}; char *adverbio[] = {"rapidamente", ""}; char *articulo[] = {"el", "la", "un", ""}; char *preposicion[] = {"hacia", ""}; char *adjetivo[] = {"rojo", "verde", "feo", "alto", ""}; char *Frases[] = { "la puerta"};/* "el alto ninio corre rapidamente hacia la ventana", "el ninio rapidamente corre hacia la casa" };*/ char *Frase = NULL, *Palabra = NULL; char *LONG_LEIDA = 0; // Nos guarda la posiciOn anterior en la cadena en caso de falla // recuperar la frase original void RecuperaFrase(char *Frase) { free(pila); // borrar lo que hay pila = (struct Pila*)malloc(sizeof(struct Pila)); pila->pos=0; pila->sig=NULL; strcpy(Frase, Frases[0]); } void LeePalabra(char *Frase) { int i = 0; strcpy(Palabra,""); while ( Frase[i]!='\0' ) { if ( Frase[i]==' ' ) return; else sprintf(Palabra, "%s%c", Palabra, Frase[i] ); i++; } } void MuestraPalabras(char *Frase) { int k=0; while ( Frase[0] != '\0' ) { LeePalabra(Frase); printf("%s ==> %i\n", Palabra, (int)strlen(Palabra)); Frase = Frase + strlen(Palabra) + 1; // el 1 es por el espacio } } int RevisaSiSiEs( char *VECTOR[] ) { int k = 0; while ( VECTOR[k] ) { if ( ((int)strlen(VECTOR[k]) != 0) && strcmp(VECTOR[k], Palabra) == 0 ) return 1; k++; } return 0; } int EsArticulo( char *Frase ) { LeePalabra(Frase); return RevisaSiSiEs(articulo); } int EsSustantivo( char *Frase ) { LeePalabra(Frase); return RevisaSiSiEs(sustantivo); } int EsAdjetivo( char *Frase ) { LeePalabra(Frase); return RevisaSiSiEs(adjetivo); } int EsPreposicion( char *Frase ) { LeePalabra(Frase); return RevisaSiSiEs(preposicion); } int EsVerbo( char *Frase ) { LeePalabra(Frase); return RevisaSiSiEs(verbo); } int EsAdverbio( char *Frase ) { LeePalabra(Frase); return RevisaSiSiEs(adverbio); } // actualiza el apuntador en la frase // 1=push // 0=pop void ActPosicion(int opc) { struct Pila *new = (struct Pila*)malloc(sizeof(struct Pila)); if ( opc ) // vale 1 { new->sig=pila; new->pos=strlen(Palabra) + 1; pila=new; Frase = Frase + new->pos; } else // vale -1 { Frase = Frase - pila->pos; pila = pila->sig; } } int EsPredicadoNominal( ) { if ( EPN_2() ) return 1; if ( EPN_1() ) return 1; return 0; } int EPN_2( ) { //_________________PN ---> articulo + sustantivo + adjetivo if ( EsArticulo(Frase) ) { ActPosicion(1); printf(" articulo "); if ( EsSustantivo(Frase) ) { ActPosicion(1); printf(" sustantivo "); if ( EsAdjetivo(Frase) ) { ActPosicion(1); printf(" adejtivo "); return 1; } ActPosicion(-1); } ActPosicion(-1); } return 0; } int EPN_1( ) { //_________________PN ---> articulo + sustantivo if ( EsArticulo(Frase) ) { ActPosicion(1); printf(" articulo "); if ( EsSustantivo(Frase) ) { ActPosicion(1); printf(" sustantivo "); return 1; } ActPosicion(-1); } return 0; } /* int EsPredicadoNominal(char *Frase) { //_________________PN ---> articulo + sustantivo if ( EsArticulo(Frase) && EsSustantivo(Frase) ) return 1; RecuperaFrase(Frase); //___No fue el caso anterior. Se recupera lo leIdo //_________________PN ---> articulo + sustantivo + adjetivo if ( EsArticulo(Frase) && EsSustantivo(Frase) && EsAdjetivo(Frase) ) return 1; RecuperaFrase(Frase); //___No fue el caso anterior. Se recupera lo leIdo //_________________PN ---> preposicion + PN if ( EsPreposicion(Frase) && EsPredicadoNominal(Frase) ) return 1; RecuperaFrase(Frase); //___No fue el caso anterior. Se recupera lo leIdo return 0; // No fuE ningUna de las anteriores } int EsPredicadoVerbal(char *Frase) { //_________________PV ---> verbo + PN if ( EsVerbo(Frase) && EsPredicadoNominal(Frase) ) return 1; RecuperaFrase(Frase); //___No fue el caso anterior. Se recupera lo leIdo //_________________PV ---> verbo + adverbio + PN if ( EsVerbo(Frase) && EsAdverbio(Frase) && EsPredicadoNominal(Frase) ) return 1; RecuperaFrase(Frase); //___No fue el caso anterior. Se recupera lo leIdo //_________________PV ---> verbo + adverbio if ( EsVerbo(Frase) && EsAdverbio(Frase) ) return 1; RecuperaFrase(Frase); //___No fue el caso anterior. Se recupera lo leIdo //_________________PV ---> verbo if ( EsVerbo(Frase) ) return 1; RecuperaFrase(Frase); //___No fue el caso anterior. Se recupera lo leIdo return 0; // No fuE ningUna de las anteriores } */ int Analiza( ) { // FRASE ----> PN + PV //if ( EsPredicadoNominal(Frase) && EsPredicadoVerbal(Frase) ) return 1; return EsPredicadoNominal( ); } char *LeeFrase( ) { // fgets(Frase, 100, stdin); // leE lInea del teclado return Frases[0]; } int main() { Frase = (char*)malloc(sizeof(char)*100); Palabra = (char*)malloc(sizeof(char)*20); pila = (struct Pila*)malloc(sizeof(struct Pila)); pila->pos=0; pila->sig=NULL; // se inicializa la pila de posiciones int ok = 0; Frase = LeeFrase( ); // EsArticulo(Frase); ok = Analiza( ); if (ok) printf("\nFrase correcta ...\n"); else printf("\nFrase incorrecta ...\n"); }