#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include <windows.h>
#include <math.h>
#include <dos.h>
int Sigue,Tamano,Cont,PosIni,i,PosVec,j,PosParen,Error,CanTonk,Tamano2,k,Opcion;
char string[150],CadenaLeida[150],Bloques[50][150],SiFor[150],Tokens[50][150],NuevaCadena[150];
int pIni;
int EsOperador(char QueAnalizar)
{if (QueAnalizar=='+')
{return(1);}
else if (QueAnalizar=='-')
{return(1);}
else if (QueAnalizar=='*')
{return(1);}
else if (QueAnalizar=='/')
{return(1);}
else if (QueAnalizar=='(')
{return(2);}
else if (QueAnalizar==')')
{return(2);}
else if (QueAnalizar=='[')
{return(2);}
else if (QueAnalizar==']')
{return(2);}
else if (QueAnalizar=='<')
{return(3);}
else if (QueAnalizar=='>')
{return(3);}
else if (QueAnalizar=='=')
{return(3);}
else if (QueAnalizar=='!')
{return(3);}
else
{return(0);}
}
void EsFor()
{printf("nntDigite la sentencia que desea evaluar: ");
//Leer la cadena de caracteres que se va a evaluar.
// scanf("%s",CadenaLeida);
gets(string);
printf("nCadena leida Completa: %s",string);
int i;
int j;
for (i = j = 0; string[i] != ' '; i++)
if (string[i] != ' ')
string[j++] = string[i];
string[j] = ' ';
printf("nCadena sin Espacios: %s", string);
strcpy(CadenaLeida, string);
//printf("n Cadena Final : %s ",CadenaLeida);
//getche();
//Tomar el tama¤o de la cadena.
Tamano=strlen(CadenaLeida);
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Recorrer los caracteres de la cadena le¡da para reconocer si es una sentencia.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PosParen=0;
for(i=0;i<=Tamano-1;i++)
{//Si el caracter es un '('.
if(CadenaLeida[i]=='(')
{PosVec=0;
for(j=0;j<=i-1;j++)
{SiFor[PosVec]=CadenaLeida[j];
PosVec=PosVec+1;
}
PosParen=i;
break;
}
}
//-------------------------------------------------------------------------------
//Si se han producido errores.
if(PosParen!=3)
{printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");
printf("ntError: %s", SiFor);
}
else if (strcmp(SiFor,"for")!=0)
{printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");
printf("ntError: %s", SiFor);
}
else if (CadenaLeida[Tamano-1]!=')')
{printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n FOR");
printf("ntError: %c falta par‚ntesis de cierre final", CadenaLeida[Tamano-1]);
}
else
{Cont=0;
PosIni=4;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Recorrer los car cteres de la cadena le¡da para reconocer los bloques del for.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for(i=4;i<=Tamano-2;i++)
{//Si el caracter es un ';'
if(CadenaLeida[i]==';')
{PosVec=0;
//Guardar parte de la cadena en otra variable.
for(j=PosIni;j<=i;j++)
{Bloques[Cont][PosVec]=CadenaLeida[j];
PosVec=PosVec+1;
}
Cont=Cont+1;
PosIni=i+1;
}
}
//Guardar parte de la cadena en otra variable.
PosVec=0;
for(j=PosIni;j<=Tamano-2;j++)
{Bloques[Cont][PosVec]=CadenaLeida[j];
PosVec=PosVec+1;
}
//---------------------------------------------------------------------------
//Si se han producido errores.
if (Cont<2)
{printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n for");
printf("ntError: faltan bloques del for 'for([init-expr];[cond-expr];[loop-expr])'");
}
else if (Cont!=2)
{printf("ntLa cadena digitada no cumple con la s¡ntaxis de la intrucci¢n for");
printf("ntError: hay mas de 3 bloques para el for 'for([init-expr];[cond-expr];[loop-expr])'");
}
else
{//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//Identificar los tokens existentes dentro de los bloques del for.
//Almacenar los primero Tokens.
strcpy(Tokens[0],SiFor);
Tokens[1][0]=CadenaLeida[3];
CanTonk=1;
//Recorrer todos los Bloques.
for(i=0;i<=Cont;i++)
{//Limpiar la variable NuevaCadena.
PosVec=0;
for(k=0;k<=149;k++)
{NuevaCadena[k]=0;}
//Tomar el tamano del bloque actual.
Tamano2=strlen(Bloques[i])-1;
//Buscar los Tokens del Bloque Actual.
for(j=0;j<=Tamano2;j++)
{if(EsOperador(Bloques[i][j])==0 && Bloques[i][j]!=';')
{NuevaCadena[PosVec]=Bloques[i][j];
PosVec=PosVec+1;
}
else
{if (strlen(NuevaCadena)!=0)
{CanTonk=CanTonk+1;
for(k=0;k<=PosVec;k++)
{Tokens[CanTonk][k]=NuevaCadena[k];}
//Limpiar la variable NuevaCadena.
PosVec=0;
for(k=0;k<=149;k++)
{NuevaCadena[k]=0;}
}
CanTonk=CanTonk+1;
Tokens[CanTonk][0]=Bloques[i][j];
}
}
}
if (strlen(NuevaCadena)!=0)
{CanTonk=CanTonk+1;
for(k=0;k<=PosVec;k++)
{Tokens[CanTonk][k]=NuevaCadena[k];}
//Limpiar la variable NuevaCadena.
PosVec=0;
for(k=0;k<=149;k++)
{NuevaCadena[k]=0;}
}
CanTonk=CanTonk+1;
Tokens[CanTonk][0]=41; //Ascii=')'
//---------------------------------------------------------------
printf("nntNUMERO IDENTIFICADOS");
for(i=0;i<=CanTonk;i++)
{if (strlen(Tokens[i])>0)
{printf("nt%dt%s",i+1,Tokens[i]);}
else
{printf("nt%dt%c",i+1,Tokens[i]);}
{printf("ttOK VALIDADO..!!!");}
}
}
}
}
main()
{Sigue=0;
do
{
system("cls");
// clrscr();
printf("nntttPROGRAMA QUE VALIDA");
printf("nntttCICLO FORnn");
printf("nnttt1.ANALIZAR CICLO FORnnn");
printf("nntttDIGITE OPCION: ");
scanf("%d", &Opcion);
// flushall();
fflush(stdin);
for(i=0;i<=149;i++)
{CadenaLeida[i]=0;
SiFor[i]=0;
}
// for(i=0;i<=49;i++)
// {for(j=0;j<=149;j++)
// {Bloques[i][j]=0;
// Tokens[i][j]=0;
// }
// }
if(Opcion==1)
{EsFor();
printf("nnntEJECUTA EL PROGRAMA NUEVAMENTE?? [SI=1][NO=0]: ");
scanf("%d",&Sigue);
}
else
{printf("nnError digite una opci¢n valida.");}
}while(Sigue!=0);
}