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