Anda di halaman 1dari 8

#include<stdio.

h>
#include<string.h>
#include<alloc.h>
#include<process.h>
#include<ctype.h>
/* Constantes de nmeros de tokens */
#define NUMERO_DOCUMENTO 15
#define NUMERO_CARACTERISTICAS 3
#define NUMERO_FORMATO 1
#define NUMERO_PRESENTACION 4
/* Tokens */
#define COMA 1
#define CONJUNCION 2
#define PREPOSICION 3
#define SALTO_LINEA 4
#define FIN 5
#define PRESENTACION 6
#define FORMATO 7
#define DOCUMENTO 8
#define CARACTERISTICAS 9
char *entrada; /* Apuntador que contiene el tramite */
int numero_linea = 1;
/* Contador de lneas */
/* Variables de lxico */
unsigned int token;
/* Nmero econmico de token */
unsigned char cadena_token[50];
/* Cadena actual del token */
/* Variables de semntica */
int indice_presentacion, indice_formato, indice_documento,
indice_caracteristicas;
/* Prototipos de funciones */
void cargar_archivo_memoria(int a, char *b);
void error(int a);
void lexico();
void semantica_presentacion_formato();
void semantica_documento_caracteristicas();
void sintaxis();
/*****************************************************************************/
void main(int argc, char *argv[])
{
cargar_archivo_memoria(argc, argv[1]);
do
{

sintaxis();
}while(token!=FIN);
printf("TRAMITE CORRECTO");
}
void cargar_archivo_memoria(int a, char *b)
{
FILE *fp;
char *auxiliar;
entrada=(char *) malloc(2000);
/* El tramite no puede contener ms de
2000 caracteres */
auxiliar=entrada;
/* Auxiliar copia el archivo a memoria */
if(entrada==0) error(1);
/* Memoria no asignada */
if(a!=2) error(2); /* Validacin para archivo que contiene el tramite */
fp=fopen(b,"rb");
/* Apertura del archivo que contiene el tramite */
if(fp==NULL) error(0);
while(!feof(fp)) /* Transferencia del archivo a la memoria */
{
*auxiliar=getc(fp);
auxiliar++;
}
*(auxiliar-1)=0; /* Cierre del buffer */
fclose(fp);
}
void error(int a)
{
unsigned char errores[7][70] =
{
"Apertura del archivo erronea, AMBIENTE",
"Asignacin de memoria no realizada, AMBIENTE",
"Archivo con el tramite no enviado, AMBIENTE",
"Documento no definido, USUARIO",
"Palabra no definida, USUARIO",
"Relacion no valida entre presentacion y formato, USUARIO",
"Relacion no valida entre documento y caracteristicas, USUARIO"
};
printf("Linea %d: %s", numero_linea, errores[a]);
exit(1);
}
void lexico()
{

static unsigned char documento[NUMERO_DOCUMENTO][100] =


{
"acta_de_nacimiento","identificacion_escolar","CURP",
"documento_que_acredite_la_nacionalidad_mexicana",
"pasaporte","comprobante_de_domicilio","solicitud_DS-160",
"identificacion_oficial","fotografias",
"numero_de_folio_del_acuse_de_confirmacion_de_cita",
"recibo_de_pago_del_tramite","acta_de_matrimonio",
"documento_con_fotografia_del_solicitante",
"documento_probatorio_de_identidad_del_interesado",
"formato_llenado_por_2_testigos_que_debern_ser_vecinos_del_lugar"
};
static unsigned char caracteristicas[NUMERO_CARACTERISTICAS][50] =
{
"por_naturalizacion","vigente","confirmacion"
};
static unsigned char formato[NUMERO_FORMATO][50] =
{
"certificada"
};
static unsigned char presentacion[NUMERO_PRESENTACION][50] =
{
"Copia","Original","Copia_fotostatica","Hoja_impresa"
};
char *auxiliar;
int i;
auxiliar=cadena_token; /* Auxiliar va almacenando la cadena del token */
while(*entrada == ' ' || *entrada == '\t')
entrada++;

/* Consume blancos */

if(*entrada == '\r')
{
token=SALTO_LINEA;
entrada=entrada+2; /* Hasta la siguientes lnea */
numero_linea++;
return;
}
if(*entrada == NULL)
{
token=FIN;
return;
}

while(!isspace(*entrada)&&*entrada!=0)

/* Agrupa la cadena de la entrada

*/
{
*auxiliar=*entrada;
entrada++;
auxiliar++;
}
*auxiliar=NULL; /* Cierra la cadena del token */
if((strcmp(cadena_token,"y")&&strcmp(cadena_token,"o")) == 0)
{
token=CONJUNCION;
return;
}
if((strcmp(cadena_token,"de")&&strcmp(cadena_token,"del")) == 0)
{
token=PREPOSICION;
return;
}
if(strcmp(cadena_token,",") == 0)
{
token=COMA;
return;
}
for(i=0; i<NUMERO_DOCUMENTO; i++)
/* Bsqueda de documentos */
if(strcmp(cadena_token,documento[i])==0)
{
token=DOCUMENTO;
indice_documento=i;
/* Para la fila de la matriz semntica */
return;
}
for(i=0; i<NUMERO_CARACTERISTICAS; i++)
/* Bsqueda de
caracteristicas */
if(strcmp(cadena_token,caracteristicas[i])==0)
{
token=CARACTERISTICAS;
indice_caracteristicas=i; /* Para la fila de la matriz semntica */
return;
}
for(i=0; i<NUMERO_FORMATO; i++) /* Bsqueda de formato */
if(strcmp(cadena_token,formato[i]) == 0)
{
token=FORMATO;
indice_formato=i;
return;

}
for(i=0; i<NUMERO_PRESENTACION; i++) /* Bsqueda de presentaciones */
if(strcmp(cadena_token,presentacion[i]) == 0)
{
token=PRESENTACION;
indice_presentacion=i;
return;
}
error(4);
}
/*****************************************************************************/
void semantica_presentacion_formato()
{
static unsigned int relacion_presentacion_formato[4]
[NUMERO_FORMATO] =
{
/*
certificada*/
/* Copia
*/
1,
/* Original
*/
0,
/* Copia_fotostatica */
0,
/* Hoja_impresa
*/
0
};
if(relacion_presentacion_formato[indice_presentacion][indice_formato] != 1)
error(5);
}
/*****************************************************************************/
void semantica_documento_caracteristicas()
{
static unsigned int
relacion_documento_caracteristicas[NUMERO_DOCUMENTO]
[NUMERO_CARACTERISTICAS] =
{
/*
por_naturalizacion vigente
confirmacion*/
/* acta_de_nacimiento
*/
0,
0,
0,
/* identificacion_escolar
*/
0,
1,
0,
/* CURP
*/
0,
0,
/* nacionalidad_mexicana */
1,
0,
0,

0,

/* comprobante_de_domicilio*/
1,
0,
/* identificacion_oficial
*/
1,
0,
/* acuse_confirmacion_cita */
0,
0,
/* pasaporte
1,
/* solicitud_DS-160
0,
/* recibo_pago_del_tramite */
0,
0,
/* fotografias
0,
/* documento_con_fotografia*/
0,
0,
/* probatorio_de_identidad */
0,
0,
/* acta_de_matrimonio
0,
/*formato_llenado_2testigos*/
0,
0
};

0,
0,
0,
*/
0,

0,

*/
1,

0,
0,
*/
0,

0,
0,
0,

*/
0,

0,
0,

if(relacion_documento_caracteristicas[indice_documento]
[indice_caracteristicas] != 1)
error(6);
}
/*****************************************************************************/
void sintaxis()
{
unsigned char semantica_presentacion[50], semantica_documento[100];
lexico();

/* Se toma el primer token */

switch(token)
/* Camino opcional */
{
case PRESENTACION: lexico();
/* Presentacion-Formato */

/* Toma el siguiente token */


if(token==FORMATO)

{
semantica_presentacion_formato();
lexico();
/* Presentacion-Formato- */
if(token==CARACTERISTICAS)
/* Caracteristicas */
/* Presentacion-Formato- */
/* Caracteristicas-Preposicin */

lexico();
if(token==PREPOSICION)
lexico();

}
else if(token==CONJUNCION)
{
lexico();
if(token==PRESENTACION)
lexico();
if(token==PREPOSICION)
lexico();
}
else if(token==PREPOSICION)
{
lexico();
if(token==CARACTERISTICAS)
{
lexico();
if(token==PREPOSICION)
lexico();
}
else
{
if(token==PREPOSICION)
lexico();
}
}
break;
case CARACTERISTICAS:

lexico();

if(token==PREPOSICION)

{
lexico();
}
break;
case SALTO_LINEA:
/* Realiza la siguiente iteracin */
case FIN:
return;

/* No hace nada */

}
/* Cualquier camino previo lleva a documento, inclusive ninguno */
if(token!=DOCUMENTO)
/* Se exige documento */

return;

error(3);
lexico();
if(token==SALTO_LINEA || token==FIN) return;

/* Concluye lnea */

if(token==COMA)
{
while(token==COMA)
{
lexico();
if(token!=DOCUMENTO)
error(3);
lexico();
}
if(token==CONJUNCION)
{
lexico();
if(token!=DOCUMENTO)
error(3);
lexico();
}
}
else
if(token==CONJUNCION)
{
lexico();
if(token!=DOCUMENTO)
error(3);
lexico();
}
if(token==SALTO_LINEA || token==FIN) return;

/* Concluye lnea */

/* Cualquier camino lleva a caracteristicas, inclusive ninguno */


if(token==CARACTERISTICAS)
{
semantica_documento_caracteristicas();
lexico();
}
}

Anda mungkin juga menyukai