¡Ayúdame a modificar mi analizador léxico escrito en C!
#includelt; string.hgt;
void Retract(FILE *fp, char ch)
{/* Regresar cursor una posición y dejar ch vacío**
fseek( fp, -1, 1
ch = ' ';
int Isletter(char ch)
{
if(chlt;='z'amp;amp;chgt;='a'||chlt; ='Z'amp;amp;chgt;='A') gt;='A') /* ------ Agregue el signo igual aquí*/
return
p>return 0;
}
int IsDigit(char ch)
{/* Determina si es un número, si es así, devuelve 1, de lo contrario, devuelve 0 */
if(ch gt;='0'amp;amp;chlt;='9') devuelve 1 /* ------ Agregue el signo igual aquí*; /
return 0;
}
clave nula (char strToken[])
{
si (strcmp (strToken, "break")==0)
printf("(break, 1)/n");
else if(strcmp(strToken, "char"); )==0)
printf("(char, 2)\n");
else if(strcmp(strToken, "continue")==0)
printf("(continuar, 3)/n");
else if(strcmp(strToken, "do")==0)
printf("( hacer, 4) \n");
else if(strcmp(strToken, "double")==0)
printf("(double, 5)\n")
else if(strcmp(strToken, "else")==0)
printf("(else, 6)/n"); else if(strcmp(strToken, "extern")==0)
printf("(extern, 7)/n"); else if(strcmp(strToken, " float ")==0)
printf("(float, 8)\n");
else if(strcmp(strToken, "for")==0)
printf("(for, 9)\n");
else if(strcmp( strToken, "int")==0)
printf( "(int, 10)\n");
else if(strcmp( strToken, "if")==0)
printf("(if, 11)/n ");
else if( strcmp(strToken, "long")==0)
printf("(long, 12)\n");
else if( strcmp(strToken, "short")==0)
printf("(short, 13)/n"); , "estático"
)==0)
printf("(static, 14)\n");
else if(strcmp(strToken, "switch")==0)
printf(" (cambiar, 15)/n");
else if(strcmp(strToken, "void")==0)
printf(" ( void, 16)/n");
else if(strcmp(strToken, "mientras")==0)
printf("(mientras, 17)/n")
else if(strcmp("main", strToken)==0)
printf("(main, 18)\n"); else if(strcmp(strToken, "printf")==0)
printf("(printf, 19)/n");
else printf("(identificar, 70) )/n");
}
void My(FILE *fp, char ch)
{
int i=1;
char strToken[120];
do{
i = 0; /*------ inicializado aquí */
ch =fgetc(fp);
if(Isletter(ch)||ch=='_')
{
//strToken[0]= ch; /*------ No puedes usarlo*
//ch=fgetc(fp);
while(Isletter(ch)||IsDigit(ch) )|ch=='_')
{
strToken[i]=ch
i ; fgetc( fp);
}
if (ch != EOF) /*------ Elimina los caracteres innecesarios y devuélvelos*/
Retract(fp, ch);
strToken[i] = 0; /*------ Agregue '\0' por cierto */
key(strToken) ; /*------ El identificador de impresión debe agregarse aquí*/<
}
else
{
/ /key(strToken); /*------No imprima aquí, encontrará datos no válidos*/
i=0
if(IsDigit( ch) )) /*------ ¿No es necesario hacer un bucle aquí para obtener los datos? */
printf("(dígito, 80)\n");
else if(ch=='lt;')
{ p>
p>
ch=fgetc(fp);
if(ch=='=')
printf("(lt;=,31) \n ");
else if(ch=='gt;')
printf("(lt;gt;,32)\n");
else / * ------ Esto es después del juicio
Ejecutar, en lugar de ejecutar directamente */
{
Retract(fp, ch
printf("(lt;, 30)\n") ;
}
}
}
si no (ch=='gt;')
{
ch=fgetc(fp);
if(ch=='=')
printf("( gt;=, 34)\n ");
else /*------ ejecutar después del juicio en lugar de ejecutar directamente*/
{
Retract(fp, ch );
printf("(gt;, 33)\n");
}
}
}
else if(ch=='=')
printf("(=,35)\n");
else if(ch=='(' )
printf("(((gt;, 36)\n"));
else if(ch==')\n");
else if(ch==')\n");
printf("(( ),37)\n");
else if(ch==' *' )
{
ch=fgetc(fp);
if(ch=='*')
printf( "( **, 38)\n");
else /*------ Este es un juicio después de la ejecución, no directamente*/
{ p>
Retraer(fp, ch);
printf("(*, 39)\n");
}
} p>
}
else if(ch==' ')
printf("( ,41)\n"
else if (ch=); ='-')
printf("(-,42)\n");
else if(ch=='?')
printf ("(?, 43)\n");
else if(ch==',')
printf("(,, 44)\n" ); /p>
else if(ch==';')
printf("(;,45)\n");
else if(ch ==' {')
printf("({, 46)\n");
else if(ch=='}')
printf(" (}, 47)\n");
}
}} while(ch!=EOF); /*------ No leer casualmente Carácter */
}
void main()
{
char ch
ARCHIVO *fp1 ;
fp1=fopen("mi.txt", "r");
if(((fp1=fopen("mi.txt", "r"))= = NULL)
{
printf("error de apertura de archivo.\n");
((ch=fgetc(fp1))! =EOF)
putchar(ch);
fseek(fp1, 0, SEEK_SET /* Podría ser ----); -- ¿No debería al menos volver al encabezado del archivo? */
printf("\n");
ch = 0;
Mi(fp1, ch
fclose); (fp1);
}