a ++) printf ("% c", A [a]); printf ("\ t \ t");
origen = 'G'; g1.array [0] = '^';
C [4] [0] = f1; C [4] [3] = f;
printf ("Sugerencia: este programa solo puede analizar cadenas que terminan con '#' compuesto de 'i', '+', '*', '(', ')', \ n");
printf ( "Ingrese la cadena de caracteres a analizar:");
lea / * lea la cadena de análisis * /
{
scanf ("% c", & ch);
if ((ch! = 'I') && (ch! = '+' ) && (ch! = '*') && (ch! = '(') && (ch! = ')') && (ch! = '#'))
{
printf ("Hay caracteres ilegales en la cadena de entrada \ n ");
salir (1);
} B [j] = ch;
j ++;
} while (ch! = '#');
l = j; / * Longitud de la cadena de análisis * /
ch = B [0]; / * Actual Analizar caracteres * /
A [top] = '#';
A [++ top] = 'E'; / * '#', 'E' en la pila * /
printf (" Paso \ t \ tAnalizar la pila \ t \ tCaracteres restantes \ t \ tLa producción utilizada \ n ");
do {
x = A [top-]; / * x es el carácter superior actual de la pila * /
printf ("% d ", k ++);
printf (" \ t \ t ");
for (j = 0; j <= 5; j ++) / * juzga si es un terminador * /
if (x == v1 [j])
{
flag = 1;
break;}
if (flag == 1) / * if es un terminador * /
{
if (x == '#')
{
finish = 1; / * Etiqueta final * /
printf ("acc! \ N"); / * ¿Aceptar? * /
Getchar ();
getchar ();
exit (1);
} / * if * /
if (x == ch)
{
print () ;
print1 ();
printf ("% c coincide con \ n", ch);
ch = B [++ b]; / * Siguiente carácter de entrada * /
flag = 0; / * Recovery flag * /} / * if * /
else / * Manejo de errores * /
{print (); print1 ();
printf ("% c error \ n", ch); / * Terminador de error de salida * /
exit (1);} / * else * / } / * if * / else / * procesamiento no terminal * / {
for (j = 0; j <= 4; j ++)
if (x == v2 [j])
{
m = j; / * número de línea * /
break;
}
for (j = 0; j <= 5; j ++)
if (ch == v1 [j])
{n = j; / * número de columna * / break;
}
cha = C [m] [n];
if (cha.origin! = 'N') / * juzga si es Vacío * /
{print ();
print1 ();
printf ("% c->", cha.origin); / * producción de salida * /
for (j = 0; j <cha.length; j ++)
printf (" % c ", cha.array [j]);
printf (" \ n ");
for (j = (cha.length-1); j> = 0; j-) / * Invierte la producción en la pila * /
A [++ top] = cha.array [j];
if (A [top] == '^') / * Si está vacío, no será
empujado a la pila * / top--;
} / * if * /
else / * Procesamiento * / {print ();
print1 ();
printf ("% c error \ n", x); / * Error de salida no terminal * / exit (1); } / * else * / } / * else * /
origen = 'G'; g1.array [0] = '^';
C [4] [0] = f1; C [4] [3] = f;
printf ("Sugerencia: este programa solo puede analizar cadenas que terminan con '#' compuesto de 'i', '+', '*', '(', ')', \ n");
printf ( "Ingrese la cadena de caracteres a analizar:");
lea / * lea la cadena de análisis * /
{
scanf ("% c", & ch);
if ((ch! = 'I') && (ch! = '+' ) && (ch! = '*') && (ch! = '(') && (ch! = ')') && (ch! = '#'))
{
printf ("Hay caracteres ilegales en la cadena de entrada \ n ");
salir (1);
} B [j] = ch;
j ++;
} while (ch! = '#');
l = j; / * Longitud de la cadena de análisis * /
ch = B [0]; / * Actual Analizar caracteres * /
A [top] = '#';
A [++ top] = 'E'; / * '#', 'E' en la pila * /
printf (" Paso \ t \ tAnalizar la pila \ t \ tCaracteres restantes \ t \ tLa producción utilizada \ n ");
do {
x = A [top-]; / * x es el carácter superior actual de la pila * /
printf ("% d ", k ++);
printf (" \ t \ t ");
for (j = 0; j <= 5; j ++) / * juzga si es un terminador * /
if (x == v1 [j])
{
flag = 1;
break;}
if (flag == 1) / * if es un terminador * /
{
if (x == '#')
{
finish = 1; / * Etiqueta final * /
printf ("acc! \ N"); / * ¿Aceptar? * /
Getchar ();
getchar ();
exit (1);
} / * if * /
if (x == ch)
{
print () ;
print1 ();
printf ("% c coincide con \ n", ch);
ch = B [++ b]; / * Siguiente carácter de entrada * /
flag = 0; / * Recovery flag * /} / * if * /
else / * Manejo de errores * /
{print (); print1 ();
printf ("% c error \ n", ch); / * Terminador de error de salida * /
exit (1);} / * else * / } / * if * / else / * procesamiento no terminal * / {
for (j = 0; j <= 4; j ++)
if (x == v2 [j])
{
m = j; / * número de línea * /
break;
}
for (j = 0; j <= 5; j ++)
if (ch == v1 [j])
{n = j; / * número de columna * / break;
}
cha = C [m] [n];
if (cha.origin! = 'N') / * juzga si es Vacío * /
{print ();
print1 ();
printf ("% c->", cha.origin); / * producción de salida * /
for (j = 0; j <cha.length; j ++)
printf (" % c ", cha.array [j]);
printf (" \ n ");
for (j = (cha.length-1); j> = 0; j-) / * Invierte la producción en la pila * /
A [++ top] = cha.array [j];
if (A [top] == '^') / * Si está vacío, no será
empujado a la pila * / top--;
} / * if * /
else / * Procesamiento * / {print ();
print1 ();
printf ("% c error \ n", x); / * Error de salida no terminal * / exit (1); } / * else * / } / * else * /
} while (terminar == 0); }/*principal*/