Clases 5 6 7 Sintaxis ProgramaEjemplo

Anuncio
Dr. Oscar BRUNO
/* Ejemplo a - PruebaEsPalabra.C
Prueba la función EsPalabra.*/
#include <stdio.h> /* printf */
#include <ctype.h> /* isdigit */
void Titulo (void);
/* funcion auxiliar */
int Verifica (char *); /* que los caracteres pertenezcan al alfabeto */
int Columna (int);
/* dado un caracter, determina la columna */
int EsPalabra (const char *);
int main () {
char s1[] = “12345”;
Titulo();
if (! Verifica(s1))
printf("La cadena s1 tiene caracteres invalidos\n");
else
if (EsPalabra(s1))
printf("La cadena s1 pertenece al lenguaje\n");
else
printf("La cadena s1 no pertenece al lenguaje\n");
return 0;
} /* fin main */
void Titulo (void) {
printf("Este programa prueba un AFD que determina\n");
printf("si una cadena dada corresponde a un numero entero\n\n");
} /* fin Titulo */
int Verifica (char *s) {
unsigned i;
for (i=0; s[i] != ‘\0’; i++)
if (! (isdigit(s[i]) || s[i] == '+' || s[i] == '-')) return 0;
return 1;
} /* fin Verifica */
int Columna (int c) {
switch (c) {
case '+': return 1;
case '-': return 2;
default /* es digito */: return 0;
}
} /* fin Columna */
int EsPalabra (const char *cadena) {
static int tt [4][3] = {{2,1,1},
/* Tabla de Transiciones */
{2,3,3},
/* 2 es el estado final */
{2,3,3},
/* 3 es el estado de rechazo */
{3,3,3}};
int e;
/* estado actual del automata */
unsigned int i;
/* recorre la cadena */
for (e=0,i=0; s[i]!=‘\0’ && e!=3; i++)
e = tt [e][Columna(s[i])];
return e==2;
/* estado final? retorna 1 */
} /* fin EsPalabra2 */
EL AUTÓMATA FINITO COMO RECONOCEDOR Y ACCIONADOR
1
Dr. Oscar BRUNO
……………………………………………………………………………………
while (c != '\0') {
e = tt [e][Columna(c)];
switch (e) {
case 1: if (c=='-') s = -1;
break;
case 2: a = 10 * a + Valor(c);
break;
default /* error */: break;
}
c = cadena[++i];
}
if (e == 2) { /* estado final */
*p_numero = s * a;
return 1;
}
else return 0;
} /* fin ObtieneValor */
int Valor (int c) {
return (c - '0');
} /* fin Valor */
Dada la gramática de las constantes enteras en C implementar el autómata y probarlo
<constante entera> ->
<constante decimal> <sufijo entero>? |
<constante octal> <sufijo entero>? |
<constante hexadecimal> <sufijo entero>?
<constante decimal> ->
<dígito no cero> | <constante decimal> <dígito>
<dígito no cero> -> uno de
1 2 3 4 5 6 7 8 9
<dígito> -> uno de
0 1 2 3 4 5 6 7 8 9
<constante octal> ->
0 |
<constante octal> <dígito octal>
<dígito octal> -> uno de
0 1 2 3 4 5 6 7
<constante hexadecimal> ->
0x <dígito hexadecimal> |
0X <dígito hexadecimal> |
<constante hexadecimal> <dígito hexadecimal>
<dígito hexadecimal> -> uno de
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
<sufijo entero> ->
<sufijo "unsigned"> <sufijo "long">? |
<sufijo "long"> <sufijo "unsigned">?
<sufijo "unsigned"> -> uno de
u U
<sufijo "long"> -> uno de
l L
2
Descargar