Download codigo en c++

Document related concepts
no text concepts found
Transcript
COMPILADORES
ANALIZADOR SINTÁCTICO
Ing. EMIRO MUÑOZ JEREZ
EJERCICIO PRÁCTICO
Hacer un programa en Visual C++, que permita
implementar la siguiente gramática.
<oracion> ::= <sujeto> <predicado>
<sujeto> ::= <frase sustantiva>
<frase sustantiva> ::= <articulo> <nombre>
<predicado> ::= <verbo> <complemento>
<complemento> ::= <frase sustantiva>
<articulo> ::= EL | LA | UN | UNA
<nombre> ::= MONO | OSO | PLATANO | MIEL | HOMBRE | CERVEZA
<verbo> ::= COME | TRAGA | BEBE
Ing. EMIRO MUÑOZ JEREZ
EJERCICIO PRÁCTICO
El programa solo deberá aceptar frases como:
EL MONO COME UN PLATANO
UN OSO TRAGA LA MIEL
EL HOMBRE BEBE CERVEZA
EL HOMBRE BEBE UNA CERVEZA
UN HOMBRE BEBE LA CERVEZA
Etc..
Ing. EMIRO MUÑOZ JEREZ
CODIGO EN C++
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_CADENA 80
#define MAX_TOKEN 30
#define TRUE 1
#define FALSE 0
#define islower(c) ((c) >= 'a' && (c) <= 'z')
#define toupper(c) ((c) - 'a' + 'A')
typedef unsigned char BYTE;
enum genero_t{ GEN_MASCULINO , GEN_FEMENINO, GEN_INDETERMINADO };
enum genero_t gen_art, gen_nom;
char cadena_ing[ MAX_CADENA ], car;
char token[ MAX_TOKEN + 1 ] = "\0";
char *punt_car;
char ant_token[ MAX_TOKEN + 1 ] = "\0"; /* Para poder regresar al */
char *ant_punt_car;
/* punto anterior
*/
BYTE indicador;
Ing. EMIRO MUÑOZ JEREZ
CODIGO EN C++
// Prototipos
void imprime( char * );
void oracion();
void sujeto();
void frase_sustantiva();
void predicado();
void complemento();
void articulo();
void nombre();
void verbo();
int Compare( char *cadena );
void get_token( void );
void back_token( void );
int EsBlanco(char i);
void aMayuscula( char *s );
Ing. EMIRO MUÑOZ JEREZ
CODIGO EN C++
int main() {
while( 1 ) {
printf( "\n");
printf( "
<oracion> ::= <sujeto> <predicado>\n");
printf( "
<sujeto> ::= <frase sustantiva>\n");
printf( "<frase sustantiva> ::= [<articulo>] <nombre>\n");
printf( "
<predicado> ::= <verbo> <complemento>\n");
printf( " <complemento> ::= <frase sustantiva>\n");
printf( "
<articulo> ::= EL | UN | LA\n");
printf( " <nombre> ::= MONO | OSO | PLATANO | MIEL | HOMBRE | NINA |CERVEZA\n");
printf( " <verbo> ::= COME | TRAGA | BEBE\n");
printf( "\nIngrese Cadena : " );
gets( cadena_ing );
//strcpy( cadena_ing, "EL MONO COME UN PLATANO" );
if ( strlen(cadena_ing) ) {
aMayuscula( cadena_ing );
punt_car = cadena_ing;
indicador = TRUE;
oracion();
if ( indicador == TRUE )
printf( "\n\n-Oracion Correcta!\n\n" );
else
printf( "\n\n-Oracion Incorrecta!\n\n" );
} else
break;
} return 0 }
Ing. EMIRO MUÑOZ JEREZ
CODIGO EN C++
/*------------------------------------------------*/
/* Transforma a letra mayuscula */
void aMayuscula( char *s ) {
char c;
for (c = *s; c = *s; ++s)
if (islower(c))
*s = toupper(c);
}
// ----------------------------------------------void imprime( char *cadena ) {
char *punt_car = cadena;
while ( *punt_car ) {
putchar( (int)*punt_car++ );
}}
// ----------------------------------------------void oracion() {
sujeto();
if ( indicador == FALSE ) {
return;
}
predicado();
}
Ing. EMIRO MUÑOZ JEREZ
CODIGO EN C++
// ----------------------------------------------void sujeto() {
frase_sustantiva();
return;
}
// ----------------------------------------------void frase_sustantiva() {
articulo();
if ( indicador == FALSE )
back_token();
nombre();
if ( gen_art != GEN_INDETERMINADO ) {
if ( gen_art != gen_nom ) {
indicador = FALSE;
}
}
}
// ----------------------------------------------void predicado() {
verbo();
if ( indicador == FALSE ) {
return;
}
complemento();
}
Ing. EMIRO MUÑOZ JEREZ
CODIGO EN C++
// ----------------------------------------------void complemento() {
frase_sustantiva();
return;
}
// ----------------------------------------------void articulo() {
get_token();
if ( Compare( "EL" ) == TRUE ) {
indicador = TRUE;
gen_art = GEN_MASCULINO;
return;
}
if ( Compare( "UN" ) == TRUE ) {
indicador = TRUE;
gen_art = GEN_MASCULINO;
return;
}
if ( Compare( "LA" ) == TRUE ) {
indicador = TRUE;
gen_art = GEN_FEMENINO;
return;
}
indicador = FALSE;
gen_art = GEN_INDETERMINADO;
return;
}
Ing. EMIRO MUÑOZ JEREZ
CODIGO EN C++
// ----------------------------------------------void nombre() {
get_token();
if ( Compare( "MONO" ) == TRUE ) {
indicador = TRUE;
gen_nom = GEN_MASCULINO;
return;
}
if ( Compare( "PLATANO" ) == TRUE ) {
indicador = TRUE;
gen_nom = GEN_MASCULINO;
return;
}
if ( Compare( "OSO" ) == TRUE ) {
indicador = TRUE;
gen_nom = GEN_MASCULINO;
return;
}
if ( Compare( "MIEL" ) == TRUE ) {
indicador = TRUE;
gen_nom = GEN_FEMENINO;
return;
}
if ( Compare( "HOMBRE" ) == TRUE ) {
indicador = TRUE;
gen_nom = GEN_MASCULINO;
return;
}
if ( Compare( "CERVEZA" ) == TRUE ) {
indicador = TRUE;
gen_nom = GEN_FEMENINO;
return;
}
indicador = FALSE;
gen_nom = GEN_INDETERMINADO;
return;
}
Ing. EMIRO MUÑOZ JEREZ
CODIGO EN C++
// ----------------------------------------------void verbo() {
get_token();
if ( Compare( "COME" ) == TRUE ) {
indicador = TRUE;
return;
}
if ( Compare( "TRAGA" ) == TRUE ) {
indicador = TRUE;
return;
}
if ( Compare( "BEBE" ) == TRUE ) {
indicador = TRUE;
return;
}
indicador = FALSE;
return;
}
// ----------------------------------------------int Compare( char *cadena ) {
if ( strcmp( cadena, token ) )
return( FALSE );
else
return( TRUE );
}
Ing. EMIRO MUÑOZ JEREZ
CODIGO EN C++
// ----------------------------------------------void get_token( void ) {
char *punt_token;
/* Recuerda el punto donde estaba */
ant_punt_car = punt_car;
strcpy( ant_token, token );
/* Se salta los blancos */
while( (EsBlanco( (char)*punt_car )) && (*punt_car) ) {
punt_car++;
}
/* Obtiene token y avanza punt_car */
punt_token = token;
while( (!EsBlanco( (char)*punt_car )) && (*punt_car) ) {
*punt_token++ = *punt_car++;
}
*punt_token = '\0';
}
Ing. EMIRO MUÑOZ JEREZ
CODIGO EN C++
// ----------------------------------------------void back_token( void ) {
/* Repone el punto donde estaban */
punt_car = ant_punt_car;
strcpy( token, ant_token );
}
// ----------------------------------------------int EsBlanco(char i)
{
return (i=='\n')||(i==' ')||(i=='\t');
}
Ing. EMIRO MUÑOZ JEREZ
EJECUTAMOS CON F5
Ing. EMIRO MUÑOZ JEREZ
Fin de la Clase
Ing. EMIRO MUÑOZ JEREZ
Related documents