You are on page 1of 30

Dr.

Oscar BRUNO

Autmata Finito

ER ab

a b
0- 1 2+

ER ab + aab

a b
0- 1 2+

b
3 4+

ER a +ab + aab
a b
0- 1+ 2+
a

b
3 4+

ER a*

a
0+
-

1
Dr. Oscar BRUNO

ER a*b
a

b
0- 1+

Autmata Finito
Herramienta abstracta que se utiliza para reconocer un determinado LR.
RECONOCER un LR significa aceptar cada cadena que es una palabra del LR y rechazar cada cadena
que no pertenece al lenguaje.
Cada AF reconoce un NICO LR. Para un LR pueden existir muchos AFs que lo reconozcan
Estado inicial, estados intermedios, estados de aceptacin estados de rechazo.
LR Finitos ab+aab; a+ab+aab; 01+10
LR Infinitos a*; a*b; a*bb*a; a3 b+; (0+1)*; a(a+b)*c; (a+b+c+d)*; (ab)*;
AFD
Formalmente, un AFD es una 5-upla (Q, , T, q0, F), donde:
Q es un conjunto finito de estados,
es el alfabeto de caracteres reconocidos por el autmata,
q0 Q es el estado inicial (nico, no es un conjunto),
F es el conjunto de estados finales, y
T: Q x Q
Ejemplo (aa+aba*)
AFD incompleto / completo
Todas las palabras de aes y/o bes que tienen por lo menos dos letras.
Todas las palabras sobre el alfabeto {a,b,c} que tienen por lo menos tres letras.

INTRODUCCIN AL DISEO DE AUTMATAS FINITOS


Los LRs se reconocen mediante AUTMATAS FINITOS (AF).
QU ES UN AUTMATA FINITO?
Un Autmata Finito (AF) es una herramienta abstracta que se utiliza para reconocer un determinado
LR.
Reconocer un Lenguaje Regular significa aceptar cada cadena que es una palabra del LR
y rechazar cada cadena que no pertenece al lenguaje.
El AF recorre, uno por uno, los caracteres de la cadena con la que ha sido alimentado.
Cada carcter procesado produce un cambio de estado en el AF.
Si al terminar de analizar todos los caracteres se encuentra en Estado Final o Estado de Aceptacin,
entonces el AF ha reconocido a la cadena y, por lo tanto, sta es una palabra del lenguaje; caso
contrario, la cadena es rechazada porque no pertenece al LR tratado. Un AF puede tener varios
estados finales.
Existe otro estado especial el Estado Inicial y tiene la caracterstica de ser nico.
Todo AF tiene asociado un digrafo, llamado Diagrama de Transiciones (DT)
Cada estado del AF tiene un nombre. El estado inicial se distingue porque se le agrega un
suprandice menos (), y cada estado final un suprandice ms ().
Ejemplo 1

2
Dr. Oscar BRUNO

a b
0- 1 2+

La ACTIVIDAD desarrollada por el AF al analizar la cadena ab puede ser descripta de la siguiente


manera:
0 => a => 1 => b => 2+ => RECONOCE.
Cada Autmata Finito reconoce un nico Lenguaje Regular.
AFs QUE RECONOCEN LRs FINITOS
Los Lenguajes Regulares finitos usan solo tres operadores: concatenacin, unin y potencia.
Ejemplo 2
Sea la ER ab + aab, que tambin puede escribirse as: a (b + ab).
El DT del AF que reconoce a este LR es:

a b
0- 1 2+

b
3 4+

Ejemplo 3
Sea la ER a + ab + aab.
a b
0- 1+ 2+
a

b
3 4+

Ejemplo 4
Se construye el siguiente AF sobre el alfabeto {0, 1} que reconoce un LR que tiene dos palabras.

0 1
-
A B C+
1 0

AFs QUE RECONOCEN LRs INFINITOS


Las ERs que representan LRs infinitos requieren la utilizacin del operador estrella de Kleene.
El trmino finito que se agrega a la palabra autmata no significa que estas herramientas
solo pueden reconocer lenguajes finitos, sino que el nmero de estados es finito.
Cada transicin tiene un estado de partida y un estado de llegada. En un ciclo, el estado
de partida coincide con el estado de llegada.

3
Dr. Oscar BRUNO

Ejemplo 5
La ER a*, que representa al lenguaje {an / n 0}, es reconocida por el siguiente AF:

a
0+
-

Ejemplo 6
Supongamos el LR representado por la ER a*b;
:
a

b
0- 1+

Ejemplo 7
Sea la ER a3b+, forma abreviada de la expresin aaabb*. :
a a a b b
0- 1 2 3 4+

Ejemplo 8
Sea la Expresin Regular Universal (0 + 1)*. El AF ms simple que reconoce a esta expresin es:

0,1
A -

Ejemplo 9
Sea la ER a(a+b)*c
a,b

a c
-
0 1 2+

Ejemplo 10
Sea la ER (ab)*.

a b
0 1 2+

Otro AF que reconoce a la misma ER (ab)* tiene el siguiente DT:

4
Dr. Oscar BRUNO

a
0 1

Ejemplo 12
Sea la ER 1(10)*0. Un AF que la reconoce tiene el siguiente DT:

D+

1 1
- B C
A

Un Autmata Finito reconoce a un Lenguaje Regular cuando acepta cada palabra del
lenguaje y rechaza toda cadena que no es una palabra del lenguaje.

EJERCICIOS
(1) Sea el Autmata Finito del Ejemplo 1. Describa la actividad del autmata cuando lee la
cadena abb.
(2) Sea el Autmata Finito del Ejemplo 2. Describa sus actividades cuando lee las cadenas: (i)
aab; (ii) aaa.
(3) Sea el Autmata Finito del Ejemplo 3. Describa su actividad cuando lee la cadena a.
(4) Sea el Autmata Finito del Ejemplo 4. Escriba la Expresin Regular del lenguaje
reconocido.
(5) Sea el Autmata Finito del Ejemplo 6. Describa su actividad cuando lee la cadena aaba.
(6) Dibuje el Diagrama de Transiciones de un Autmata Finito que reconoce al lenguaje a*bb.
(7) Sea el Autmata Finito del Ejemplo 7. Describa sus actividades cuando lee las cadenas:
aaab; aaabbb.
(8) Sea el Autmata Finito del Ejemplo 7. Describa sus actividades cuando lee las cadenas:
aaaba; aab; .
(9) Dibuje el Diagrama de Transiciones de un Autmata Finito que reconoce al lenguaje bba*.
(10)Dibuje el Diagrama de Transiciones de un Autmata Finito que reconoce al lenguaje a (a +
b)*.
(11)Sea el Autmata Finito del Ejemplo 10. Describa su actividad cuando lee la cadena abb.
(12)Dibuje el Diagrama de Transiciones de un Autmata Finito que reconoce al lenguaje
a(ab)*.
(13)Sea el Autmata Finito del Ejemplo 11. Describa sus actividades cuando lee las cadenas:
abab; aba; .
(14)Sea el Autmata Finito del Ejemplo 12. Describa su actividad cuando lee la cadena 1101.

5
Dr. Oscar BRUNO

6
Dr. Oscar BRUNO

AFDs Y AFNs
Autmatas Finitos Determinsticos (AFDs), cuya caracterstica funcional es que para cualquier
estado en que se encuentre el autmata en un momento dado, la lectura de un carcter determina,
sin ambigedades, cual ser el estado de llegada en la prxima transicin.

Existe otro grupo de AFs, el de los Autmatas Finitos No Determinsticos


AUTMATAS FINITOS DETERMINSTICOS
Un AFD es una coleccin de tres conjuntos:
(1) Un conjunto finito de estados, uno de los cuales se designa como el estado inicial (nico) y
otros (uno o ms) son designados como estados finales o estados de aceptacin;
(2) Un alfabeto de caracteres con los que se forman las cadenas que sern procesadas por el
AFD;
(3) Un conjunto finito de transiciones que indican, para cada estado y para cada carcter del
alfabeto, a qu estado debe moverse el AFD.

Ejemplo 1

a a
0- 1 2+

a
3+

DEFINICIN FORMAL DE UN AFD


Formalmente, un AFD es una 5-upla (Q, , T, q0, F), donde:
Q es un conjunto finito de estados,
es el alfabeto de caracteres reconocidos por el autmata,
q0 Q es el estado inicial,
F Q es el conjunto de estados finales, y
T: Q x -> Q es la funcin de transiciones, es decir: T (q, x) es el estado al cual transita el
autmata desde el estado q, al leer el carcter x, transicin que tambin podemos simbolizar as:
q => x => T (q, x).
Tabla de Transiciones (TT) es la forma de representar las transiciones.
Ejemplo 2
El AFD del ejemplo anterior se define formalmente como: M = (Q, , T, q0, F), donde:
Q = {0, 1, 2, 3}; = {a, b}; q0 = 0; F = {2, 3}; T = {0 => a => 1, 1 => a => 2, 1 => b => 3, 3
=> a => 3}.
Si la funcin de transiciones T es representada mediante una TT, obtenemos el siguiente resultado:
T a b
0- 1 -
1 2 3
2+ - -
3+ 3 -

7
Dr. Oscar BRUNO

Ejemplo 3
Todas las palabras de aes y/o bes que tienen por lo menos dos letras. El diagrama de transiciones
de un AFD que reconoce este lenguaje es:

a,b a,b a,b


0- 1 2+

La definicin formal de un AFD que reconoce a este lenguaje es M = (Q, , T, q0, F), donde:
Q = {0, 1, 2}; = {a, b}; q0 = 0; F = {2}; T representada por la siguiente tabla de transiciones:

T a b
0- 1 1
1 2 2
2+ 2 2

AFD COMPLETO

Un AFD es completo si cada estado tiene exactamente una transicin por cada carcter
del alfabeto.
Otra definicin es:
Un AFD es completo cuando su tabla de transiciones no tiene huecos; si los tiene, el
AFD es incompleto.

Completar un AFD es eliminar los huecos de su TT. Para ello: (1) Se agrega un estado, llamado
estado de rechazo o estado de no aceptacin; (2) Se reemplaza cada hueco por una transicin a este
nuevo estado; y (3) Se incorpora una nueva entrada en la tabla para el estado de rechazo en la que se
representarn ciclos para todos los caracteres del alfabeto, con lo que se informa que, una vez que el
autmata se sita en el estado de rechazo, de l no puede salir.
Ejemplo 4
Se desea completar el AFD del Ejemplo 2:
M = (Q, , T, q0, F), donde: Q = {0, 1, 2, 3}; = {a, b}; q0 = 0; F = {2, 3}; y T representada por
la TT:
T a b
0- 1 -
1 2 3
2+ - -
3+ 3 -
Para completar el AFD, agregamos un estado de rechazo. Entonces, el nuevo AFD es:
M2 = (Q, , T, q0, F), con Q = {0, 1, 2, 3, 4}; = {a, b}; q0 = 0; F = {2, 3}; y T representada por
la tabla:

T a b
0- 1 4
1 2 3
2+ 4 4
3+ 3 4
4 4 4

8
Dr. Oscar BRUNO

AUTMATA FINITO NO DETERMINSTICO


Autmata Finito No Determinstico (AFN), si por lo menos hay un estado y un carcter para los
que el autmata deber elegir, entre dos o ms transiciones, cul es el camino a seguir.

Ejemplo 5

a,b

a b
-
0 1 2+

DEFINICIN FORMAL DE UN AFN


La definicin formal de un AFN es similar a la definicin formal de un AFD, pero cambia la
funcin de transiciones T;: Q x -> 2Q, donde 2Q representa el conjunto en el que cada elemento
es un conjunto de estados.
Ejemplo 6
La definicin formal del AFN cuyo DT fuera dibujado en el ejemplo anterior es:
M = (Q, , T, q0, F), donde Q = {0, 1, 2}; = {a, b}; q0 = 0; F = {2}; y T representada por la TT:
T a b
0- {1} -
1 {1} {1,2}
2+ - -
6.2.2 AUTMATA FINITO CON TRANSICIONES-
El Autmata Finito con transiciones- es un segundo modelo de AFN y se caracteriza por la
existencia de una o ms transiciones que ocurren sin que el autmata lea el prximo carcter de la
cadena que est analizando.
La definicin formal de un AF con transiciones- es igual a la de un AFN T: Q x ( {}) -> 2Q.
Ejemplo 7
Sea el AFN con el siguiente Diagrama de Transiciones:
1


A- B+

T 1
A- {A} {B}
B+ - -

a b
1 2 3+

0-

b a
4 5 6+

9
Dr. Oscar BRUNO

La definicin formal de este AFN es:


M = (Q, , T, q0, F), donde Q = {0, 1, 2, 3, 4, 5, 6}; = {a, b}; q0 = 0; F = {3, 6}; y T
representada por la TT
T a b
0- - - {1,4}
1 {2} - -
2 - {3} -
3+ - - -
4 {4} {5} -
5 {6} - -
6+ - - -

EJERCICIOS
(1) Escriba la Expresin Regular del lenguaje reconocido por el Autmata Finito del Ejemplo 1.
(2) Sea el lenguaje Todos los nmeros binarios que contienen el grupo 00 por lo menos una vez.
Dibuje el DT de
(1) un AFN que lo reconozca.
(2) Escriba la descripcin formal del AFN diseado en el ejercicio anterior.
(3) Sea el lenguaje Todas las palabras sobre el alfabeto {a, b, c} que terminan con b. Dibuje el
DT de un AFN
(4) que lo reconozca.
(5) Escriba la descripcin formal del AFN diseado en el ejercicio anterior.
(6) Describa formalmente los AFDs diseados en los ejemplos del captulo 4.
(7) Dibuje el diagrama de transiciones de un AFN que acepte el lenguaje 101* + 1*00.
(8) Escriba la descripcin formal del AFN diseado en el ejercicio anterior.
(9) Describa formalmente a los AFDs de un solo estado sobre el alfabeto {a, b}, completos y no
completos.
(10)Describa formalmente a los AFDs de un solo estado sobre el alfabeto {a, b, c}, completos y no
completos.
(11)Describa formalmente a los AFDs de dos estados sobre el alfabeto {a, b}, completos y no
completos.
(12)Elija tres AFNs de dos estados de cada uno, sobre el alfabeto {a, b}, y descrbalos formalmente.
(13)Encuentre un Lenguaje Regular que no contenga la palabra vaca, que no pueda ser aceptado
por un AFD con
(14)un solo estado final. Escriba la Expresin Regular del lenguaje hallado.

10
Dr. Oscar BRUNO

Mtodos de diseo de AFDs


Debe controlarse
Que sobren palabras
2. Que falten palabras

Una forma simple de diseo es determinar manera explcita, que condicion recuerda cada
estado.
Disear un AFD que acepte las palabras en el alfabeto {a, b} en que la cantidad de as es impar.
Las condiciones relevantes para este problema -que deben ser recordadas por los estados
correspondientes- son:
El numero de as recibidas hasta el momento es par (estado P);
El numero de as recibidas hasta el momento es impar (estado I);

Disear un AFD que acepte exactamente el lenguaje en el alfabeto {0, 1} en que las palabras no
comienzan con 00.
Estado Condicin
q0 No se han recibido caracteres
q1 Se ha recibido un cero al inicio
q2 Se han recibido dos ceros iniciales
q3 Se recibi algo que no son dos ceros iniciales

Diseo por conjunto de estados


Disear un AFD que acepte las palabras del lenguaje en {0, 1} donde las palabras no contienen la
subcadena 11 pero s 00.
Se identifican las siguientes situaciones:
Las letras consumidas hasta el momento no contienen ni 00 ni 11.
Contienen 00 pero no 11
Contienen 11.

11
Dr. Oscar BRUNO

Equivalencia de automatas finitos. Dos automatas que aceptan el mismo lenguaje son quivalentes.

12
Dr. Oscar BRUNO

Arbol de comparacin de autmatas


1. Inicialmente la raz del arbol es el par ordenado (s, s0) que contiene los estados inicialesde
M y M0 respectivamente;
2. Si en el arbol hay un par (r, r0), para cada caracter aaden como hijos suyos los pares (r,
r0)
3. Si aparece en el arbol un par de estados incompatibles, se interrumpe la construccion .
Definicion. Dos estados q y q0 son compatibles si ambos son finales o ninguno de los dos es final.
En caso contrario, son estados incompatibles.

Simplificacion de Automatas finitos (mtodo mecanico):

1. Estados
a. Compatibles
i. si ambos son finales o ninguno lo es y tienen igual comportamiento
b. Distinguibles
i. Si son incompatibles
ii. Si siendo compatibles no tienen el mismo comportamiento.
c. Equivalentes o redundantes (se pueden eliminar)
i. Si son indistinguibles
Una vez que se sabe que dos estados son equivalentes, se puede pensar en eliminar uno de ellos,
para evitar redundancias y hacer mas eficiente al AFD.
1. Las flechas que salen del estado eliminado son eliminadas;
2. Las flechas que llegan al estado eliminado son redirigidas hacia su estado equivalente.

Simplificacion mecanica por tabla de estados distinguibles


Simplificacion mecanica por clases de equivalencia

13
Dr. Oscar BRUNO

Clases de equivalencia organizadas en rbol.

Algo de C

CADENAS

unsigned strlen (const char*);


Cuenta los caracteres que forman la cadena dada hasta el 1er carcter '\0',
excluido. Retorna (longitud de la cadena).

char* strcat (char* s, const char* t);


Concatena la cadena t a la cadena s sobre s. Retorna (s).

char* strncat (char* s, const char* t, size_t n);


Concatena hasta n caracteres de t, previos al carcter nulo, a la cadena s; agrega
siempre un '\0'. Retorna (s).

char* strncpy (char* s, const char* t, size_t n);


Copia hasta n caracteres de t en s; si la longitud de la cadena t es < n, agrega
caracteres nulos en s hasta completar n caracteres en total; atencin: no agrega
automticamente el carcter nulo. Retorna (s).

char* strcpy (char* s, const char* t);


Copia la cadena t en s (es la asignacin entre cadenas). Retorna (s).

char* strchr (const char* s, int c);


Ubica la 1ra. aparicin de c (convertido a char) en la cadena s; el '\0' es
considerado como parte de la cadena. Retorna (ok ? puntero al carcter localizado :
NULL)

14
Dr. Oscar BRUNO

char* strstr (const char* s, const char* t);


Ubica la 1ra. ocurrencia de la cadena t (excluyendo al '\0') en la cadena s. Retorna
(ok ? puntero a la subcadena localizada : NULL).

int strcmp (const char*, const char*);


Compara "lexicogrficamente" ambas cadenas. Retorna (0 si las cadenas son
iguales; < 0 si la 1ra. es "menor" que la 2da.; > 0 si la 1ra. es "mayor" que la 2da.)

int strncmp (const char* s, const char* t, size_t n);


Compara hasta n caracteres de s y de t. Retorna (como strcmp).

char* strtok (char*, const char*);


Separa en "tokens" a la cadena dada como 1er. argumento; altera la cadena
original; el 1er. argumento es la cadena que contiene a los "tokens"; el 2do.
argumento es una cadena con caracteres separadores de "tokens". Retorna (ok ?
puntero al 1er. carcter del "token" detectado : NULL).

Macros
NULL
Ver Definiciones Comunes.

EOF
Expresin constante entera con tipo int y valor negativo que es retornada por
varias funciones para indicar fin de archivo; es decir, no hay mas datos entrantes
que puedan ser ledos desde un flujo, esta situacin puede ser porque se lleg al fin
del archivo o porque ocurri algn error. Contrastar con feof y ferror.

SEEK_CUR
SEEK_END
SEEK_SET
Argumentos para la funcin fseek.

stderr
stdin
stdout
Expresiones del tipo FILE* que apuntan a objetos asociados con los flujos estndar
de error, entrada y salida respectivamente.

Acceso
FILE* fopen (
const char* nombrearchivo,
const char* modo
);
Abre el archivo cuyo nombre es la cadena apuntada por nombrearchivo asociando
un flujo con este segn el modo de apertura. Retorna (ok ? puntero al objeto que
controla el flujo : NULL).

int fclose (FILE* flujo);


Vaca el buffer del flujo apuntado por flujo y cierra el archivo asociado. Retorna
(ok ? 0 : EOF)

15
Dr. Oscar BRUNO

Entrada / Salida Formateada


Flujos en General
int fprintf (FILE* f, const char* s, ...);
Escritura formateada en un archivo ASCII. Retorna (ok ? cantidad de caracteres
escritos : < 0).

int fscanf (FILE* f, const char*, ...);


Lectura formateada desde un archivo ASCII. Retorna (cantidad de campos
almacenados) o retorna (EOF si detecta fin de archivo).

Entrada / Salida de a Caracteres


int fgetc (FILE*);
int getc (FILE*);
Lee un carcter (de un archivo ASCII) o un byte (de un archivo binario). Retorna (ok
? carcter/byte ledo : EOF).

int getchar (void);


Lectura por carcter desde stdin. Retorna (ok ? prximo carcter del buffer : EOF).

int fputc (int c, FILE* f);


int putc (int c, FILE* f);
Escribe un carcter (en un archivo ASCII) o un byte (en un archivo binario). Retorna
(ok ? c : EOF).

int putchar (int);


Eescritura por carcter sobre stdout. Retorna (ok ? carcter transmitido : EOF).

int ungetc (int c, FILE* f);


"Devuelve" el carcter o byte c para una prxima lectura. Retorna (ok ? c : EOF).

Entrada / Salida de a Cadenas


char* fgets (char* s, int n, FILE* f);
Lee, desde el flujo apuntado f, una secuencia de a lo sumo n-1 caracteres y la
almacena en el objeto apuntado por s. No se leen ms caracteres luego del carcter
nueva lnea o del fin del archivo. Un carcter nulo es escrito inmediatamente
despus del ltimo carcter almacenado; de esta forma, s queda apuntando a una
cadena. Importante su uso con stdin. Si ley correctamente, s apunta a los
caracteres ledos y retorna s. S ley slo el fin del archivo, el objeto apuntado por s
no es modificado y retorna NULL. Si hubo un error, contenido del objeto es
indeterminado y retorna NULL. Retorna ( ok ? s : NULL).

int fputs (const char* s, FILE* f);


Escribe la cadena apuntada por s en el flujo f. Retorna (ok ? ltimo carcter escrito
: EOF).

Entrada / Salida de a Bloques


unsigned fread (void* p, unsigned t, unsigned n, FILE* f);

16
Dr. Oscar BRUNO

Lee hasta n bloques contiguos de t bytes cada uno desde el flujo f y los almacena
en el objeto apuntado por p. Retorna (ok ? n : < n).

unsigned fwrite (void* p, unsigned t, unsigned n, FILE* f);


Escribe n bloques de t bytes cada uno, siendo el primero el apuntado por p y los
siguientes, sus contiguos, en el flujo apuntado por f. Retorna (ok ? n : < n).

Posicionamiento
int fseek (
FILE* flujo,
long desplazamiento,
int desde
);
Ubica el indicador de posicin de archivo del flujo binario apuntado por flujo,
desplazamiento caracteres a partir de desde. desde puede ser SEEK_SET,
SEEK_CUR SEEK_END, comienzo, posicin actual y final del archivo
respectivamente. Para flujos de texto, desplazamiento deber ser cero o un valor
retornado por ftell y desde debe ser SEEK_SET. En caso de xito los efectos de
ungetc son deshechos, el indicador de fin de archivo es desactivado y la prxima
operacin puede ser de lectura o escritura. Retorna (ok ? 0 : 0).

long ftell (FILE* flujo);


Obtiene el valor actual del indicador de posicin de archivo para el flujo apuntado
por flujo. Para flujos binarios es el nmero de caracteres (bytes posicin) desde
el comienzo del archivo. Para flujos de texto la valor retornado es slo til como
argumento de fseek para reubicar el indicador al momento del llamado a ftell.
Retorna (ok ? indicador de posicin de archivo : 1L).

17
Dr. Oscar BRUNO

Sintaxis de C
Ing. Jose Maria Sola Dr. Oscar Ricardo Bruno

1.1. Gramtica Lxica


1.1.1. Elementos Lxicos
<token> ->
<palabra reservada> |
<identificador> |
<constante> |
<literal de cadena> |
<punctuator>
<token de preprocesamiento> ->
<nombre de encabezado> |
<identificador> |
<nmero de preprocesador>|
<constante carcter> |
<literal de cadena> |
<punctuator> |
cada uno de los caracteres no-espacio-blanco que no sea uno de
los anteriores

1.1.2. Palabras Reservadas


<palabra reservada> -> una de
auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while

18
Dr. Oscar BRUNO

1.1.3. Identificadores
<identificador> -> <no dgito> | <identificador> <no dgito> |
<identificador> <dgito>
<no dgito> -> uno de _ a b c d e f g h i j k l m n o p q r s t u v
w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
<dgito> -> uno de 0 1 2 3 4 5 6 7 8 9

Dado que los identificadores constituyen un Lenguaje Regular,


podemos describirlos mediante la definicin regular.

<letra> = [a-zA-Z] (cualquier letra minscula o mayscula


del alfabeto reducido)
<dgito> = [0-9]
<subrayado> = _
<primer carcter> = <letra> | <subrayado>
<otro carcter> = <letra> | <dgito> | <subrayado>
GRAMATICA
<identificador> = <primer carcter> <otro carcter>*
EXPRESION REGULAR
(letra + subrayado)(letra + subrayado + digito)
AUTOMATA FINITO
Letra
Subrayado
Digito
Letra subrayado E L _ D O
0- 1+
0 1 1 -- --
-
1 1 1 1 --
int Columna (int);
int Automata (const char *cadena) {
static tablaT [3][4] = {{1,1,2,2},
{1,1,1,2},
{2,2,2,2}, /* rechazo */
};
int estActual = 0; /* estado inicial */
unsigned int i = 0; /* recorre la cadena */
int caracter = cadena[0]; /* primer caracter */
while (caracter != \0 && estActual != 3) {
estActual=tablaT[estActual][Columna(caracter)];
caracter = cadena[++i];
}
if (estActual == 1) return 1; /* estado final */
return 0;
}

int Columna (int c){


if (c >= 0 && c <= 9) return 2;
if (c == _) return 1;
if (isalpha(c) )return 0;
return 3;

19
Dr. Oscar BRUNO

1.1.4. Constantes
<constante> ->
<constante entera> |
<constante real> |
<constante carcter> |
<constante enumeracin>
En general, en computacin las constantes enteras no son un
subconjunto de las constantes reales.

Constante Entera
<constante entera> ->
<constante decimal> <sufijo entero>? |
<constante octal> <sufijo entero>? |
<constante hexadecimal> <sufijo entero>?
<constante decimal> ->
<dgito no cero> |
<constante decimal> <dgito>
<dgito no cero> -> uno de
1 2 3 4 5 6 7 8 9
<dgito> -> uno de
0 1 2 3 4 5 6 7 8 9
<constante octal> ->
0 |
<constante octal> <dgito octal>
<dgito octal> -> uno de
0 1 2 3 4 5 6 7
<constante hexadecimal> ->
0x <dgito hexadecimal> |
0X <dgito hexadecimal> |
<constante hexadecimal> <dgito hexadecimal>
<dgito 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

El tipo de una constante entera depende de su valor y ser


representada como primero corresponda, segn la siguiente lista:
int, unsigned int, long, unsigned long.

20
Dr. Oscar BRUNO

El lenguaje de "Las constantes enteras en ANSI C" es regular; por


lo tanto, podemos describirlo a travs de una definicin regular

<sufijo U> = u | U
<sufijo L> = l | L
<sufijo entero> =
<sufijo U> |
<sufijo L> |
<sufijo U> <sufijo L> |
<sufijo L> <sufijo U>
<dgito decimal> = [0-9]
<dgito decimal no nulo> = [1-9]
<dgito hexadecimal> = [0-9a-fA-F]
<dgito octal> = [0-7]
<prefijo hexadecimal> = 0x | 0X
<constante decimal> = <dgito decimal no nulo> <dgito
decimal>
<constante hexadecimal> = <prefijo hexadecimal> <dgito
hexadecimal>+
<constante octal> = 0 <dgito octal>
<constante incompleta> =
<constante decimal> |
<constante hexadecimal> |
<constante octal>
<constante entera> = <constante incompleta> <sufijo
entero>?

Constante Real
<constante real> ->
<constante fraccin> <parte exponente>? <sufijo real>?
|
<secuencia dgitos> <parte exponente> <sufijo real>?
<constante fraccin> ->
<secuencia dgitos>? . <secuencia dgitos> |
<secuencia dgitos> .
<parte exponente> ->
e <signo>? <secuencia dgitos> |
E <signo>? <secuencia dgitos>
<signo> -> uno de + -
<secuencia dgitos> ->
<dgito> |
<secuencia dgitos> <dgito>
<dgito> -> uno de 0 1 2 3 4 5 6 7 8 9
<sufijo real> -> uno de f F l L
Si no tiene sufijo, la constante real es double.

En ingls esta constante es conocida como <floating-point-


constant>, <constante de punto flotante>.

Constante Carcter
<constante carcter> ->

21
Dr. Oscar BRUNO

'<carcter-c>' |
'<secuencia de escape>'
<carcter-c> -> cualquiera excepto
' \
<secuencia de escape> ->
<secuencia de escape simple> |
<secuencia de escape octal> |
<secuencia de escape hexadecimal>
<secuencia de escape simple> -> uno de
\' \" \? \\ \a \b \f \n \r \t \v
<secuencia de escape octal> ->
\<dgito octal> |
\<dgito octal> <dgito octal> |
\<dgito octal> <dgito octal> <dgito octal>
<dgito octal> -> uno de
0 1 2 3 4 5 6 7
<secuencia de escape hexadecimal> ->
\x<dgito hexadecimal> |
\x <dgito hexadecimal> <dgito hexadecimal>
\x admite nicamente la x minscula.
<dgito 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

Constante Enumeracin
<constante enumeracin> ->
<identificador>

1.1.5. Constantes Cadena


<constante cadena> ->
"<secuencia caracteres-s>"
<secuencia caracteres-s> ->
<carcter-s> |
<secuencia caracteres-s> <carcter-s>
<carcter-s> ->
cualquiera excepto " \ |
<secuencia de escape>
<secuencia de escape> ->
<secuencia de escape simple> |
<secuencia de escape octal> |
<secuencia de escape hexadecimal>
<secuencia de escape simple> -> uno de
\' \" \? \\ \a \b \f \n \r \t \v
<secuencia de escape octal> ->
\ <dgito octal> |
\ <dgito octal> <dgito octal> |
\ <dgito octal> <dgito octal> <dgito octal>
<dgito octal> -> uno de
0 1 2 3 4 5 6 7
<secuencia de escape hexadecimal> ->
\x <dgito hexadecimal> |
\x <dgito hexadecimal> <dgito hexadecimal
\x admite nicamente la x minscula.

22
Dr. Oscar BRUNO

<dgito 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
En ingls, estas constantes son referidas como <string
literals>, <literales de cadena>.

Notar que no estn agrupadas con el resto de las constantes.

1.1.6. Punctuators Caracteres de Puntuacin


punctuator -> uno de
[ ] ( ) { } . ->
++ -- & * + - !
/ % << >> < > <= >= == != | && ||
= *= /= %= += -= <<= >>= &= = |=
? : ; ... , # ##
La mayora cumple el papel de operador, ver seccin "Precedencia
y Asociatividad de los 45 Operadores".

1.1.7. Nombre de Encabezados


<nombre de encabezado> ->
< <secuencia de caracteres h> > |
" <secuencia de caracteres q> "
<secuencia de caracteres h> ->
<carcter h> |
<secuencia de caracteres h> <carcter h>
<carcter h> ->
cualquier miembro del conjunto de caracteres fuente excepto el
carcter nueva-lnea y el carcter >
<secuencia de caracteres q> ->
<carcter q> |
<secuencia de caracteres q> <carcter q>
<carcter q> ->
cualquier miembro del conjunto de caracteres fuente excepto el
carcter nueva-lnea y el carcter "

1.1.8. Nmeros de Preprocesador


<nmero de preprocesador> ->
<dgito> |
. <dgito> |
<nmero de preprocesador> <dgito> |
<nmero de preprocesador> <identificador no dgito> |
<nmero de preprocesador> e <sign> |
<nmero de preprocesador> E <sign>|
<nmero de preprocesador> p <sign>|
<nmero de preprocesador> P <sign>|
<nmero de preprocesador> .

23
Dr. Oscar BRUNO

1.2. Gramtica de Estructura de Frases


1.2.1. Expresiones
<expresin> ->
<expresin de asignacin> |
<expresin> , <expresin de asignacin>
<expresin de asignacin> ->
<expresin condicional> |
<expresin unaria> <operador asignacin> <expresin de
asignacin>
<expresin condicional> ->
<expresin O lgico> |
<expresin O lgico> ? <expresin> : <expresin condicional>
<operador asignacin> -> uno de
= = /= %= += = <<= >>= &= ^= |=
<expresin O lgico> ->
<expresin Y lgico> |
<expresin O lgico> || <expresin Y lgico>
<expresin Y lgico> ->
<expresin O inclusivo> |
<expresin Y lgico> && <expresin O inclusivo>
<expresin O inclusivo> ->
<expresin O excluyente> |
<expresin O inclusivo> | <expresin O excluyente>
<expresin O excluyente> ->
<expresin Y> |
<expresin O excluyente> ^ <expresin Y>
<expresin Y> ->
<expresin de igualdad> |
<expresin Y> & <expresin de igualdad>
<expresin de igualdad> ->
<expresin relacional> |
<expresin de igualdad> == <expresin relacional> |
<expresin de igualdad> != <expresin relacional>
<expresin relacional> ->
<expresin de corrimiento> |
<expresin relacional> < <expresin de corrimiento> |
<expresin relacional> > <expresin de corrimiento> |
<expresin relacional> <= <expresin de corrimiento> |
<expresin relacional> >= <expresin de corrimiento>
<expresin de corrimiento> ->
<expresin aditiva> |
<expresin de corrimiento> << <expresin aditiva> |
<expresin de corrimiento> >> <expresin aditiva>
<expresin aditiva> ->
<expresin multiplicativa> |
<expresin aditiva> + <expresin multiplicativa> |
<expresin aditiva> - <expresin multiplicativa>
<expresin multiplicativa> ->
<expresin de conversin> |
<expresin multiplicativa> <expresin de conversin> |

24
Dr. Oscar BRUNO

<expresin multiplicativa> / <expresin de conversin> |


<expresin multiplicativa> % <expresin de conversin>
<expresin de conversin> ->
<expresin unaria> |
(<nombre de tipo>) <expresin de conversin>
<expresin unaria> ->
<expresin sufijo> |
++ <expresin unaria> |
-- <expresin unaria> |
<operador unario> <expresin de conversin> |
sizeof <expresin unaria> |
sizeof (<nombre de tipo>)
<nombre de tipo> est descripto ms adelante, en la seccin
Declaraciones.
<operador unario> -> uno de & + - ~ !
<expresin sufijo> ->
<expresin primaria> |
<expresin sufijo> [<expresin>] | /* arreglo */
<expresin sufijo> (<lista de argumentos>?) | /* invocacin */
<expresin sufijo> . <identificador> |
<expresin sufijo> -> <identificador> |
<expresin sufijo> ++ |
<expresin sufijo> --
<lista de argumentos> ->
<expresin de asignacin> |
<lista de argumentos> , <expresin de asignacin>
<expresin primaria> ->
<identificador> |
<constante> |
<constante cadena> |
(<expresin>)

Expresiones Constantes
<expresin constante> -> <expresin condicional>
Las expresiones constantes pueden ser evaluadas durante la traduccin en lugar
de durante la ejecucin.

1.2.2. Declaraciones
Una declaracin especifica la interpretacin y los atributos de un
conjunto de identificadores.

Si una declaracin provoca reserva de memoria, se la llama


definicin.

<declaracin> ->
<especificadores de declaracin> <lista de declaradores>?
<especificadores de declaracin> ->
<especificador de clase de almacenamiento> <especificadores de
declaracin>? |
<especificador de tipo> <especificadores de declaracin>? |

25
Dr. Oscar BRUNO

<calificador de tipo> <especificadores de declaracin>?


<lista de declaradores> ->
<declarador> |
<lista de declaradores> , <declarador>
<declarador> ->
<decla> |
<decla> = <inicializador>
<inicializador> ->
<expresin de asignacin> | /* Inicializacin de tipos
escalares */
{<lista de inicializadores>} | /* Inicializacin de tipos
estructurados */
{<lista de inicializadores> , }
<lista de inicializadores> ->
<inicializador> |
<lista de inicializadores> , <inicializador>
<especificador de clase de almacenamiento> -> uno de
typedef static auto register extern
No ms de un especificador de clase de almacenamiento> puede
haber en una declaracin

<especificador de tipo> -> uno de


void char short int long float double signed unsigned
<especificador de "struct" o "union">
<especificador de "enum">
<nombre de "typedef">
<calificador de tipo> -> const | volatile
<especificador de "struct" o "union"> ->
<"struct" o "union"> <identificador>? {<lista de declaraciones
"struct">} |
<"struct" o "union"> <identificador>
<"struct" o "union"> -> struct | union
<lista de declaraciones "struct"> ->
<declaracin "struct"> |
<lista de declaraciones "struct"> <declaracin "struct">
<declaracin "struct"> ->
<lista de calificadores> <declaradores "struct"> ;
<lista de calificadores> ->
<especificador de tipo> <lista de calificadores>? |
<calificador de tipo> <lista de calificadores>?
<declaradores "struct"> ->
<decla "struct"> |
<declaradores "struct"> , <decla "struct">
<decla "struct"> ->
<decla> |
<decla>? : <expresin constante>
<decla> -> <puntero>? <declarador directo>
<puntero> ->
<lista calificadores tipos>? |
<lista calificadores tipos>? <puntero>
<lista calificadores tipos> ->
<calificador de tipo> |
<lista calificadores tipos> <calificador de tipo>

26
Dr. Oscar BRUNO

<declarador directo> ->


<identificador> |
( <decla> ) |
<declarador directo> [ <expresin constante>? ] |
<declarador directo> ( <lista tipos parmetros> ) /* Declarador
nuevo estilo */
<declarador directo> ( <lista de identificadores>? ) /*
Declarador estilo obsoleto */
<lista tipos parmetros> ->
<lista de parmetros> |
<lista de parmetros> , . . .
<lista de parmetros> ->
<declaracin de parmetro> |
<lista de parmetros> , <declaracin de parmetro>
<declaracin de parmetro> ->
<especificadores de declaracin> <decla> | /* Parmetros
"nombrados" */
<especificadores de declaracin> <declarador abstracto>? /*
Parmetros "annimos" */
<lista de identificadores> ->
<identificador> |
<lista de identificadores> , <identificador>
<especificador de "enum"> ->
enum <identificador>? { <lista de enumeradores> } |
enum <identificador>
<lista de enumeradores> ->
<enumerador> | <lista de enumeradores> , <enumerador>
<enumerador> ->
<constante de enumeracin> |
<constante de enumeracin> = <expresin constante>
<constante de enumeracin> -> <identificador>
<nombre de "typedef"> -> <identificador>
<nombre de tipo> -> <lista de calificadores> <declarador abstracto>?
<declarador abstracto> ->
<puntero> |
<puntero>? <declarador abstracto directo>
<declarador abstracto directo> ->
( <declarador abstracto> ) |
<declarador abstracto directo>? [ <expresin constante>? ] |
<declarador abstracto directo>? ( <lista tipos parmetros>? )

Ejemplos de <nombre de tipo>:

int [3] /* vector de 3 punteros a int */


int () [3] /* puntero a un vector de 3 ints */
int () ( void ) /* puntero a una funcin sin parmetros y
que retorna un int */
int ( [ ] ) ( unsigned, . . . ) /* vector de un nmero no
especificado de punteros a funciones, cada una de las
cuales tiene un parmetro unsigned int ms un nmero
no especificado de otros parmetros, y retorna un int
*/

27
Dr. Oscar BRUNO

1.2.3. Sentencias
<sentencia> ->
<sentencia expresin> |
<sentencia compuesta> |
<sentencia de seleccin> |
<sentencia de iteracin> |
<sentencia etiquetada> |
<sentencia de salto>
<sentencia expresin> ->
<expresin>? ;
<sentencia compuesta> ->
{<lista de declaraciones>? <lista de sentencias>?}
<lista de declaraciones> ->
<declaracin> |
<lista de declaraciones> <declaracin>
<lista de sentencias> ->
<sentencia> |
<lista de sentencias> <sentencia>
La sentencia compuesta tambin se denomina bloque.

<sentencia de seleccin> ->


if (<expresin>) <sentencia> |
if (<expresin>) <sentencia> else <sentencia> |
switch (<expresin>) <sentencia>
La expresin e controla un switch debe ser de tipo entero.
<sentencia de iteracin> ->
while (<expresin>) <sentencia> |
do <sentencia> while (<expresin>) ; |
for (<expresin>? ; <expresin>? ; <expresin>?) <sentencia>
<sentencia etiquetada> ->
case <expresin constante> : <sentencia> |
default : <sentencia> |
<identificador> : <sentencia>
Las sentencias case y default se utilizan solo dentro de una
sentencia switch.
<sentencia de salto> ->
continue ; |
break ; |
return <expresin>? ; |
goto <identificador> ;
La sentencia continue solo debe aparecer dentro del cuerpo de un
ciclo. La sentencia break solo debe aparecer dentro de un switch
o en el cuerpo de un ciclo. La sentencia return con una expresin
no puede aparecer en una funcin void.

1.2.4. Definiciones Externas


<unidad de traduccin> ->
<declaracin externa> |
<unidad de traduccin> <declaracin externa>
<declaracin externa> ->

28
Dr. Oscar BRUNO

<definicin de funcin> |
<declaracin>
La unidad de texto de programa luego del preprocesamiento es
una unidad de traduccin, la cual consiste en una secuencia de
declaraciones externas.

Las declaraciones externas son llamadas as porque aparece fuera


de cualquier funcin. Los trminos alcance de archivo y alcance
externo son sinnimos.

Si la declaracin de un identificador para un objeto tiene alcance


de archivo y un inicializador, la declaracin es una definicin
externa para el identificador.

<definicin de funcin> ->


<especificadores de declaracin>? <decla> <lista de
declaraciones>? <sentencia compuesta>

1.3. Gramtica del Preprocesador


<archivo de preprocesamiento> ->
<grupo>?
<grupo> ->
<parte de grupo> |
<grupo parte de grupo>
<parte de grupo> ->
<seccin if> |
<lnea de control> |
<lnea de texto> |
# <no directiva>
<seccin if> ->
<grupo if> <grupos elif>? <grupo else>? <lnea endif>
<grupo if> ->
# if <expresin constante> <nueva lnea> <grupo>? |
# ifdef <identificador> <nueva lnea> <grupo>? |
# ifndef <identificador> <nueva lnea>< grupo>?
<grupos elif> ->
<grupo elif> |
<grupos elif> <grupo elif>
<grupo elif> ->
# elif <expresin constante> <nueva lnea> <grupo>?
<grupo else> ->
# else <nueva lnea> grupo>?
<lnea endif> ->
# endif <nueva lnea>
<lnea de control> ->
# include <tokens pp> <nueva lnea> |
# define <identificador> <lista de reemplazos> <nueva lnea> |
# define <identificador> <parizq> <lista de identificadores>? )
<lista de reemplazos> <nueva lnea> |

29
Dr. Oscar BRUNO

# define <identificador> <parizq> ... ) <lista de reemplazos>


<nueva lnea> |
# define <identificador> <parizq> <lista de identificadores> ,
... ) <lista de reemplazos> <nueva lnea> |
# undef <identificador> <nueva lnea> |
# line <tokens pp> <nueva lnea> |
# error <tokens pp>? <nueva lnea> |
# pragma <tokens pp> <nueva lnea> |
# <nueva lnea>
<lnea de texto> ->
<tokens pp>? <nueva lnea>
<no directiva> ->
<tokens pp> <nueva lnea>
<parizq> ->
un carcter ( no inmediatamente precedido por un espacio blanco
<lista de reemplazos> ->
<tokens pp>?
<tokens pp> ->
<token de preprocesamiento> |
<tokens pp> <token de preprocesamiento>
<nueva lnea> -> el carcter nueva lnea
Las expresiones constantes de if y elif pueden estar formadas por
los operadores comunes y/o por los siguientes operadores de
preprocesamiento:

defined ( <identificador> )
defined <identificador>
#
##

30

You might also like