Vous êtes sur la page 1sur 8

/* programa 02_01.c lenguaje para recetas de cocina */ #include<stdio.

h> #includ
e<string.h> #include<alloc.h> #include<process.h> #include<ctype.h> /* constante
s de nmeros de tokens */ #define NUMERO_INGREDIENTE 32 #define NUMERO_MEDIDA 8 #d
efine NUMERO_PRESENTACION 14 /* tokens */ #define ADEREZO #define CANTIDAD_1 #de
fine CANTIDAD_2_O_MAS #define CANTIDAD_FRACCION #define COMA #define CONJUNCION
#define FIN #define INGREDIENTE #define MEDIDA #define PREPOSICION #define PRESE
NTACION #define SALTO_LINEA 0 1 /* se definen 3 constantes para cantidad */ 2 /*
por cuestiones sem nticas */ 3 4 5 6 7 8 9 10 11
char *entrada; /* apuntador que contiene la receta */ int numero_linea = 1; /* c
ontador de lneas */ /* variables de l xico */ unsigned int token; /* nmero econmico
de token */ unsigned char cadena_token[50]; /* cadena actual del token */ /* va
riables de sem ntica */ int indice_cantidad, indice_medida, indice_ingrediente, in
dice_presentacion; /* prototipos de funciones */ void cargar_archivo_memoria(int
a, char *b); void error(int a); void lexico(); void semantica_cantidad_medida()
; void semantica_ingrediente_presentacion(); void sintaxis(); /*****************
*****************************************/ void main(int argc, char *argv[]) { c
argar_archivo_memoria(argc, argv[1]); do { sintaxis(); }while (token!=FIN); prin
tf("Receta correcta"); }

/**********************************************************/ void cargar_archivo


_memoria(int a, char *b) { FILE *fp; char *auxiliar; entrada = (char *) malloc(2
000); /* la receta no puede contener m s de 2000 car acteres */ auxiliar = entrada
; /* auxiliar copia el archivo a memoria */ if (entrada == 0) error(1); /* memor
ia no asignada */ if (a != 2) error(2); /* validacin para archivo que contiene la
receta */ fp=fopen(b,"rb"); /* apertura del archivo que contiene la receta */ i
f (fp == NULL) error(0); while(!feof(fp)) /* transferencia del archivo a la memo
ria */ { *auxiliar = getc(fp); auxiliar++; } *(auxiliar-1) = 0; /* cierre del bu
ffer */ fclose(fp); } /*********************************************************
*/ void error(int a) { unsigned char errores[7][70] = { "Apertura del archivo er
ronea, AMBIENTE", "Asignacin de memoria no realizada, AMBIENTE", "Archivo con la
receta no enviado, AMBIENTE", "Ingrediente no definido, USUARIO", "Palabra no de
finida, USUARIO", "Relacin no v lida entre cantidad y medida, USUARIO", "Relacin no
v lida entre ingrediente y presentacin, USUARIO" }; printf("Lnea %d: %s",numero_line
a,errores[a]); exit(1); } /*****************************************************
*****/ void lexico() { static unsigned char ingrediente[NUMERO_INGREDIENTE][50]
= { "aceite_de_oliva","aguacate","ajo","apio","carne_de_res","cebolla", "champin
ones","chiles_ancho","chiles_chipotles_en_escabeche", "chiles_huajillo","consome
_de_pollo","dientes_de_ajo","falda_de_res", "germinado_de_soya","huevo","jengibr
e","jugo_maggi","lechuga","mayonesa", "mostaza","pimientas","pimientas_gordas","
pimiento_morron","pollo", "queso_panela","salsa_inglesa","tomates","tomillo","tr
ipa_de_puerco", "sal","vinagre","zanahorias" }; static unsigned char medida[NUME
RO_MEDIDA][50] = { "cucharada","cucharadas","gramos","kilo","kilos","lata","rama
s_de","taza" };

static unsigned char presentacion[NUMERO_PRESENTACION][50] = { "al_gusto","corta


da_a_lo_alto","duro","en_tiras","finamente_ralladas", "fresco","la_necesaria","m
olida","molido","picado","picados","rallado", "rebanada","rebanados" }; char *au
xiliar; int i; auxiliar = cadena_token; /* auxiliar va almacenando la cadena del
token */ while(*entrada == ' ' entrada++; *entrada == '\t') /* consume blancos
*/
if (*entrada == '\r') { token = SALTO_LINEA; entrada = entrada + 2; /* hasta la
siguiente lnea */ numero_linea++; return; } if (*entrada == NULL) { token = FIN;
return; } while(!isspace(*entrada) && *entrada != 0) /* agrupa la cadena de la e
ntrada */ { *auxiliar = *entrada; entrada++; auxiliar++; } *auxiliar = NULL; /*
cierra la cadena del token */ if ( (strcmp(cadena_token,"y") && strcmp(cadena_to
ken,"o")) == 0) { token = CONJUNCION; return; } if (strcmp(cadena_token,"de") ==
0) { token = PREPOSICION; return; } if (strcmp(cadena_token,"aderezo:") == 0) {
token = ADEREZO; return; } if (strcmp(cadena_token,"1") == 0) { token = CANTIDA
D_1; indice_cantidad = 0; return;

} if ((strcmp(cadena_token,"2") && strcmp(cadena_token,"3") && strcmp(cadena_tok


en,"4") && strcmp(cadena_token,"5") && strcmp(cadena_token,"6") && strcmp(cadena
_token,"10") && strcmp(cadena_token,"200")) == 0) { token = CANTIDAD_2_O_MAS; in
dice_cantidad = 1; return; } if ((strcmp(cadena_token,"1/2") && strcmp(cadena_to
ken,"1/4")) == 0) { token = CANTIDAD_FRACCION; indice_cantidad = 2; return; } if
(strcmp(cadena_token,",") == 0) { token = COMA; return; } for(i=0;i<NUMERO_INGR
EDIENTE;i++) /* bsqueda de ingredientes */ if (strcmp(cadena_token,ingrediente[i]
) == 0) { token = INGREDIENTE; indice_ingrediente = i; /* para la fila de la mat
riz de sem ntica */ return; } for(i=0;i<NUMERO_MEDIDA;i++) /* bsqueda de medidas */
if (strcmp(cadena_token,medida[i]) == 0) { token = MEDIDA; indice_medida = i; r
eturn; } for(i=0;i<NUMERO_PRESENTACION;i++) /* bsqueda de presentaciones */ if (s
trcmp(cadena_token,presentacion[i]) == 0) { token = PRESENTACION; indice_present
acion = i; return; } error(4); } /**********************************************
************/ void semantica_cantidad_medida() { static unsigned int relacion_ca
ntidad_medida[3][NUMERO_MEDIDA] = { /*cucharada cucharadas gramos kilo kilos lat
a ramasde taza */ /* 1 */ 1, 0, 0, 1, 0, 1, 0, 1, /* >=2 */ 0, 1, 1, 0, 1, 0, 1,
0, /* fraccin */ 1, 0, 0, 1, 0, 1, 1, 1

}; if (relacion_cantidad_medida[indice_cantidad][indice_medida] != 1) error(5);
} /**********************************************************/ void semantica_in
grediente_presentacion() { static unsigned int relacion_ingrediente_presentacion
[NUMERO_INGREDIENTE][NUME RO_PRESENTACION] = { /* gusto duro finrall necesar mol
ido picados rebanada */ /* oliva */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*
aguacate */ 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, /* ajo */ 1, 0, 0, 0, 1,
0, 0, 0, 1, 1, 1, 0, 0, 1, /* apio */ 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0,
/* carne res */ 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, /* cebolla */ 1, 1, 0,
1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, /* championes */ 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,
1, 0, 0, 1, /* chile ancho */ 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, /* chile
s chipo */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, /* chiles huaji */ 1, 0, 0,
0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, /* consome pollo */ 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, /* dientes ajo */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* f
alda res */ 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, /* germ soya */ 0, 0, 0, 0
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* huevo */ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, /* jengibre */ 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, /* jugo maggi */
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* lechuga */ 1, 0, 0, 1, 1, 0, 0, 0,
0, 1, 0, 0, 0, 0, /* mayonesa */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* mo
ztaza */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* pimientas */ 1, 0, 0, 0, 0
, 0, 0, 1, 0, 0, 0, 0, 0, 0, /* pim gordas */ 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0
, 0, 0, /* pim morrn */ 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, /* pollo */ 0,
0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, /* queso panela */ 1, 0, 0, 1, 0, 0, 0, 0
, 0, 0, 0, 0, 0, 0, /* salsa inglesa */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
, /* tomates */ 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, /* tomillo */ 1, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* tripa puerco */ 0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, /* sal */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* vinagre */
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* zanahorias */ 1, 0, 0, 1, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0 }; /* cort alto tiras fresco molida picado rallado rebanado
s */ if (relacion_ingrediente_presentacion[indice_ingrediente][indice_presentaci
on] != 1) error(6); } /*********************************************************
*/ void sintaxis() { unsigned char semantica_cantidad[50], semantica_ingrediente
[50]; lexico(); /* se toma el primer token */ switch (token) /* camino opcional
*/

{ lexico(); /* toma el siguiente token */ if (token == MEDIDA) { semantica_canti


dad_medida(); lexico(); /* cantidad-medida-preposicin */ if (token == PREPOSICION
) lexico(); } else /* cantidad-preposicin */ if (token == PREPOSICION) lexico();
break; case ADEREZO : lexico(); /* alcanza el fin de lnea return; /* puede haber
n aderezos case SALTO_LINEA : return; /* realiza la siguiente iteracin case FIN :
return; /* no hace nada } /* cualquier camino previo lleva a ingrediente, inclu
sive ninguno */ if (token != INGREDIENTE) /* se exige ingrediente */ error(3); l
exico(); if (token == SALTO_LINEA token == FIN) return; /* concluye lnea */ case
CANTIDAD_1 : case CANTIDAD_2_O_MAS : case CANTIDAD_FRACCION : /* cantidad-medida
*/
*/ */ */ */
if (token == COMA) { while (token == COMA) { lexico(); if (token != INGREDIENTE)
error(3); lexico(); } if (token == CONJUNCION) { lexico(); if (token != INGREDI
ENTE) error(3); lexico(); } } else if (token == CONJUNCION) { lexico(); if (toke
n != INGREDIENTE) error(3); lexico(); } if (token == SALTO_LINEA token == FIN) r
eturn; /* concluye lnea */
/* cualquier camino lleva a presentacin, inclusive ninguno */ if (token == PRESEN
TACION) { semantica_ingrediente_presentacion();

lexico(); } }

Vous aimerez peut-être aussi