Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la...

30
Dr. Oscar BRUNO 1 Autómata Finito ER ab 0 - 1 2 + a b ER ab + aab 0 - 1 2 + a b 3 a 4 + b ER a +ab + aab 3 4 + 0 - 2 + a b a b 1 + ER a* 0 + - a

Transcript of Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la...

Page 1: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

1

Autómata Finito

ER ab

0 - 1 2

+a b

ER ab + aab

0 - 1 2 +a b

3

a

4 +b

ER a +ab + aab

3 4 +

0 -

2 +

a b

a

b

1 +

ER a*

0 +-a

Page 2: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

2

ER a*b

0 -

a

1 +b

Autómata 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 aceptación 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 autómata, – 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.

INTRODUCCIÓN AL DISEÑO DE AUTÓMATAS FINITOS Los LRs se reconocen mediante AUTÓMATAS FINITOS (AF).

¿QUÉ ES UN AUTÓMATA FINITO? Un Autómata 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 carácter 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 Aceptación,

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 característica 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

supraíndice “menos” (), y cada estado final un supraíndice “más” ().

Ejemplo 1

Page 3: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

3

0 - 1 2

+a b

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 Autómata Finito reconoce un único Lenguaje Regular.

AFs QUE RECONOCEN LRs FINITOS Los Lenguajes Regulares finitos usan solo tres operadores: concatenación, unión y potencia.

Ejemplo 2

Sea la ER ab + aab, que también puede escribirse así: a (b + ab). El DT del AF que reconoce a este LR es:

0 - 1 2 +a b

3

a

4 +b

Ejemplo 3

Sea la ER a + ab + aab.

3 4 +

0 -

2 +

a b

a

b

1 +

Ejemplo 4

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

B C +

1

A -

0

D

1 0

AFs QUE RECONOCEN LRs INFINITOS Las ERs que representan LRs infinitos requieren la utilización del operador “estrella de Kleene”.

El término finito que se agrega a la palabra autómata no significa que estas herramientas solo pueden reconocer lenguajes finitos, sino que el número de estados es finito. Cada transición tiene un estado de partida y un estado de llegada. En un ciclo, el estado de partida coincide con el estado de llegada.

Page 4: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

4

Ejemplo 5

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

0 +-a

Ejemplo 6

Supongamos el LR representado por la ER a*b;

:

0 -

a

1 +b

Ejemplo 7

Sea la ER a3b+, forma abreviada de la expresión aaabb*. :

0 - 2 3 4 +1

a a a b b

Ejemplo 8

Sea la Expresión Regular Universal (0 + 1)*. El AF más simple que reconoce a esta expresión es:

A -0,1

Ejemplo 9

Sea la ER a(a+b)*c

0 - 1 2

+a c

a,b

Ejemplo 10

Sea la ER (ab)*.

2 +1

a b

a

0 ±

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

Page 5: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

5

1a

0 ±

b

Ejemplo 12

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

A - B C

1 1

D +

0

0

Un Autómata 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 Autómata Finito del Ejemplo 1. Describa la actividad del autómata cuando lee la

cadena abb.

(2) Sea el Autómata Finito del Ejemplo 2. Describa sus actividades cuando lee las cadenas: (i)

aab; (ii) aaa.

(3) Sea el Autómata Finito del Ejemplo 3. Describa su actividad cuando lee la cadena a.

(4) Sea el Autómata Finito del Ejemplo 4. Escriba la Expresión Regular del lenguaje

reconocido.

(5) Sea el Autómata Finito del Ejemplo 6. Describa su actividad cuando lee la cadena aaba.

(6) Dibuje el Diagrama de Transiciones de un Autómata Finito que reconoce al lenguaje a*bb.

(7) Sea el Autómata Finito del Ejemplo 7. Describa sus actividades cuando lee las cadenas:

aaab; aaabbb.

(8) Sea el Autómata Finito del Ejemplo 7. Describa sus actividades cuando lee las cadenas:

aaaba; aab; .

(9) Dibuje el Diagrama de Transiciones de un Autómata Finito que reconoce al lenguaje bba*.

(10) Dibuje el Diagrama de Transiciones de un Autómata Finito que reconoce al lenguaje a (a + b)*.

(11) Sea el Autómata Finito del Ejemplo 10. Describa su actividad cuando lee la cadena abb.

(12) Dibuje el Diagrama de Transiciones de un Autómata Finito que reconoce al lenguaje

a(ab)*.

(13) Sea el Autómata Finito del Ejemplo 11. Describa sus actividades cuando lee las cadenas:

abab; aba; .

(14) Sea el Autómata Finito del Ejemplo 12. Describa su actividad cuando lee la cadena 1101.

Page 6: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

6

Page 7: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

7

AFDs Y AFNs

Autómatas Finitos Determinísticos (AFDs), cuya característica funcional es que para cualquier

estado en que se encuentre el autómata en un momento dado, la lectura de un carácter determina,

sin ambigüedades, cual será el estado de llegada en la próxima transición.

Existe otro grupo de AFs, el de los Autómatas Finitos No Determinísticos

AUTÓMATAS FINITOS DETERMINÍSTICOS Un AFD es una colección de tres conjuntos:

(1) Un conjunto finito de estados, uno de los cuales se designa como el estado inicial (único) y

otros (uno o más) son designados como estados finales o estados de aceptación;

(2) Un alfabeto de caracteres con los que se forman las cadenas que serán procesadas por el

AFD;

(3) Un conjunto finito de transiciones que indican, para cada estado y para cada carácter del

alfabeto, a qué estado debe “moverse” el AFD.

Ejemplo 1

0 - 1 2

+

3 +

a a

b

a

DEFINICIÓN 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 autómata,

q0 Q es el estado inicial,

F Q es el conjunto de estados finales, y

T: Q x -> Q es la función de transiciones, es decir: T (q, x) es el estado al cual transita el

autómata desde el estado q, al leer el carácter x, transición que también 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 función de transiciones T es representada mediante una TT, obtenemos el siguiente resultado: T a b

0- 1 -

1 2 3

2+ - -

3+ 3 -

Page 8: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

8

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:

0 - 1 2 +a,b a,b a,b

La definición 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 transición por cada carácter del alfabeto.

Otra definición 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 aceptación; (2) Se reemplaza cada hueco por una transición a este

nuevo estado; y (3) Se incorpora una nueva entrada en la tabla para el estado de rechazo en la que se

representarán ciclos para todos los caracteres del alfabeto, con lo que se informa que, una vez que el

autómata se sitúa 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

Page 9: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

9

AUTÓMATA FINITO NO DETERMINÍSTICO

Autómata Finito No Determinístico (AFN), si por lo menos hay un estado y un carácter para los

que el autómata deberá elegir, entre dos o más transiciones, cuál es el camino a seguir.

Ejemplo 5

0 - 1 2

+a b

a,b

DEFINICIÓN FORMAL DE UN AFN

La definición formal de un AFN es similar a la definición formal de un AFD, pero cambia la

función de transiciones T;: Q x -> 2Q, donde 2Q

representa el conjunto en el que cada elemento

es un conjunto de estados. Ejemplo 6

La definición 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 AUTÓMATA FINITO CON TRANSICIONES-

El Autómata Finito con transiciones- es un segundo modelo de AFN y se caracteriza por la

existencia de una o más transiciones que ocurren sin que el autómata lea el próximo carácter de la

cadena que está analizando.

La definición 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:

A - B +

1

T 1 A- {A} {B}

B+ - -

0 -

1 2

4 5

3 +

6 +

a b

b a

a

Page 10: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

10

La definición 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 Expresión Regular del lenguaje reconocido por el Autómata Finito del Ejemplo 1.

(2) Sea el lenguaje “Todos los números binarios que contienen el grupo 00 por lo menos una vez”.

Dibuje el DT de

(1) un AFN que lo reconozca.

(2) Escriba la descripción formal del AFN diseñado 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 descripción formal del AFN diseñado en el ejercicio anterior.

(6) Describa formalmente los AFDs diseñados en los ejemplos del capítulo 4.

(7) Dibuje el diagrama de transiciones de un AFN que acepte el lenguaje 101* + 1*00.

(8) Escriba la descripción formal del AFN diseñado 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 descríbalos formalmente.

(13) Encuentre un Lenguaje Regular que no contenga la palabra vacía, que no pueda ser aceptado

por un AFD con

(14) un solo estado final. Escriba la Expresión Regular del lenguaje hallado.

Page 11: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

11

Métodos de diseño de AFDs Debe controlarse Que “sobren palabras” 2. Que “falten palabras” Una forma simple de diseño es determinar manera explıcita, que condicion “recuerda” cada estado. Diseñar un AFD que acepte las palabras en el alfabeto {a, b} en que la cantidad de a’s es impar. Las condiciones relevantes para este problema -que deben ser “recordadas” por los estados correspondientes- son: El numero de a’s recibidas hasta el momento es par (estado P); El numero de a’s recibidas hasta el momento es impar (estado I);

Diseñar un AFD que acepte exactamente el lenguaje en el alfabeto {0, 1} en que las palabras no comienzan con 00. Estado Condición 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

Diseño por conjunto de estados Diseñar 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.

Page 12: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

12

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

Page 13: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

13

Arbol de comparación de autómatas 1. Inicialmente la raız 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 añaden 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 (método 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

Page 14: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

14

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 carácter '\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 carácter 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; atención: no agrega automáticamente el carácter nulo. Retorna (s).

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

Copia la cadena t en s (es la asignación entre cadenas). Retorna (s).

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

Ubica la 1ra. aparición de c (convertido a char) en la cadena s; el '\0' es

considerado como parte de la cadena. Retorna (ok ? puntero al carácter localizado :

NULL)

Page 15: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

15

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 "lexicográficamente" 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. carácter del "token" detectado : NULL).

Macros

NULL

Ver Definiciones Comunes.

EOF

Expresión 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 leídos desde un flujo, esta situación puede ser porque se llegó al fin

del archivo o porque ocurrió algún error. Contrastar con feof y ferror.

SEEK_CUR SEEK_END SEEK_SET

Argumentos para la función fseek.

stderr stdin stdout

Expresiones del tipo FILE* que apuntan a objetos asociados con los flujos estándar

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 según el modo de apertura. Retorna (ok ? puntero al objeto que

controla el flujo : NULL).

int fclose (FILE* flujo);

Vacía el buffer del flujo apuntado por flujo y cierra el archivo asociado. Retorna

(ok ? 0 : EOF)

Page 16: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

16

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 carácter (de un archivo ASCII) o un byte (de un archivo binario). Retorna (ok

? carácter/byte leído : EOF).

int getchar (void);

Lectura por carácter desde stdin. Retorna (ok ? próximo carácter del buffer : EOF).

int fputc (int c, FILE* f); ó

int putc (int c, FILE* f);

Escribe un carácter (en un archivo ASCII) o un byte (en un archivo binario). Retorna

(ok ? c : EOF).

int putchar (int);

Eescritura por carácter sobre stdout. Retorna (ok ? carácter transmitido : EOF).

int ungetc (int c, FILE* f);

"Devuelve" el carácter o byte c para una próxima 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 más caracteres luego del carácter

nueva línea o del fin del archivo. Un carácter nulo es escrito inmediatamente

después del último carácter almacenado; de esta forma, s queda apuntando a una

cadena. Importante su uso con stdin. Si leyó correctamente, s apunta a los

caracteres leídos y retorna s. Sí leyó sólo 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 carácter escrito

: EOF).

Entrada / Salida de a Bloques

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

Page 17: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

17

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 posición de archivo del flujo binario apuntado por flujo,

desplazamiento caracteres a partir de desde. desde puede ser SEEK_SET,

SEEK_CUR ó SEEK_END, comienzo, posición 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 próxima

operación puede ser de lectura o escritura. Retorna (ok ? 0 : 0).

long ftell (FILE* flujo);

Obtiene el valor actual del indicador de posición de archivo para el flujo apuntado

por flujo. Para flujos binarios es el número de caracteres (bytes ó posición) desde

el comienzo del archivo. Para flujos de texto la valor retornado es sólo útil como

argumento de fseek para reubicar el indicador al momento del llamado a ftell.

Retorna (ok ? indicador de posición de archivo : 1L).

Page 18: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

18

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

1.1. Gramática Léxica

1.1.1. Elementos Léxicos

<token> -> <palabra reservada> | <identificador> | <constante> | <literal de cadena> | <punctuator>

<token de preprocesamiento> -> <nombre de encabezado> | <identificador> | <número de preprocesador>| <constante carácter> | <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

Page 19: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

19

1.1.3. Identificadores

<identificador> -> <no dígito> | <identificador> <no dígito> | <identificador> <dígito>

<no dígito> -> 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

<dígito> -> uno de 0 1 2 3 4 5 6 7 8 9

Dado que los identificadores constituyen un Lenguaje Regular,

podemos describirlos mediante la definición regular.

<letra> = [a-zA-Z] (cualquier letra minúscula o mayúscula del alfabeto reducido)

<dígito> = [0-9] <subrayado> = _ <primer carácter> = <letra> | <subrayado> <otro carácter> = <letra> | <dígito> | <subrayado> GRAMATICA <identificador> = <primer carácter> <otro carácter>* EXPRESION REGULAR (letra + subrayado)(letra + subrayado + digito) AUTOMATA FINITO Letra Subrayado Digito Letra subrayado -

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;

0 - 1+ E L _ D O 0 1 1 -- -- 1 1 1 1 --

Page 20: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

20

1.1.4. Constantes

<constante> -> <constante entera> | <constante real> | <constante carácter> | <constante enumeración>

En general, en computación 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> -> <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

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

representada como primero corresponda, según la siguiente lista:

int, unsigned int, long, unsigned long.

Page 21: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

21

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

lo tanto, podemos describirlo a través de una definición regular

<sufijo U> = u | U <sufijo L> = l | L <sufijo entero> =

<sufijo U> | <sufijo L> | <sufijo U> <sufijo L> | <sufijo L> <sufijo U>

<dígito decimal> = [0-9] <dígito decimal no nulo> = [1-9] <dígito hexadecimal> = [0-9a-fA-F] <dígito octal> = [0-7] <prefijo hexadecimal> = 0x | 0X <constante decimal> = <dígito decimal no nulo> <dígito

decimal>

<constante hexadecimal> = <prefijo hexadecimal> <dígito hexadecimal>+

<constante octal> = 0 <dígito octal>

<constante incompleta> = <constante decimal> | <constante hexadecimal> | <constante octal>

<constante entera> = <constante incompleta> <sufijo entero>?

Constante Real

<constante real> -> <constante fracción> <parte exponente>? <sufijo real>? | <secuencia dígitos> <parte exponente> <sufijo real>?

<constante fracción> -> <secuencia dígitos>? . <secuencia dígitos> | <secuencia dígitos> .

<parte exponente> -> e <signo>? <secuencia dígitos> | E <signo>? <secuencia dígitos>

<signo> -> uno de + - <secuencia dígitos> ->

<dígito> | <secuencia dígitos> <dígito>

<dígito> -> 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 inglés esta constante es conocida como <floating-point-

constant>, <constante de punto flotante>.

Constante Carácter

<constante carácter> ->

Page 22: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

22

'<carácter-c>' | '<secuencia de escape>'

<carácter-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> -> \<dígito octal> | \<dígito octal> <dígito octal> | \<dígito octal> <dígito octal> <dígito octal>

<dígito octal> -> uno de 0 1 2 3 4 5 6 7

<secuencia de escape hexadecimal> -> \x<dígito hexadecimal> | \x <dígito hexadecimal> <dígito hexadecimal>

\x admite únicamente la x minúscula. <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

Constante Enumeración

<constante enumeración> -> <identificador>

1.1.5. Constantes Cadena

<constante cadena> -> "<secuencia caracteres-s>"

<secuencia caracteres-s> -> <carácter-s> | <secuencia caracteres-s> <carácter-s>

<carácter-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> -> \ <dígito octal> | \ <dígito octal> <dígito octal> | \ <dígito octal> <dígito octal> <dígito octal>

<dígito octal> -> uno de 0 1 2 3 4 5 6 7

<secuencia de escape hexadecimal> -> \x <dígito hexadecimal> | \x <dígito hexadecimal> <dígito hexadecimal

\x admite únicamente la x minúscula.

Page 23: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

23

<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

En inglés, estas constantes son referidas como <string

literals>, <literales de cadena>.

Notar que no están agrupadas con el resto de las constantes.

1.1.6. Punctuators – Caracteres de Puntuación

punctuator -> uno de [ ] ( ) { } . -> ++ -- & * + - ˜ ! / % << >> < > <= >= == != ˆ | && || = *= /= %= += -= <<= >>= &= ˆ= |= ? : ; ... , # ##

La mayoría cumple el papel de operador, ver sección "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> -> <carácter h> | <secuencia de caracteres h> <carácter h>

<carácter h> -> cualquier miembro del conjunto de caracteres fuente excepto el carácter nueva-línea y el carácter >

<secuencia de caracteres q> -> <carácter q> | <secuencia de caracteres q> <carácter q>

<carácter q> -> cualquier miembro del conjunto de caracteres fuente excepto el carácter nueva-línea y el carácter "

1.1.8. Números de Preprocesador

<número de preprocesador> -> <dígito> | . <dígito> | <número de preprocesador> <dígito> | <número de preprocesador> <identificador no dígito> | <número de preprocesador> e <sign> | <número de preprocesador> E <sign>| <número de preprocesador> p <sign>| <número de preprocesador> P <sign>| <número de preprocesador> .

Page 24: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

24

1.2. Gramática de Estructura de Frases

1.2.1. Expresiones

<expresión> -> <expresión de asignación> | <expresión> , <expresión de asignación>

<expresión de asignación> -> <expresión condicional> | <expresión unaria> <operador asignación> <expresión de asignación>

<expresión condicional> -> <expresión O lógico> | <expresión O lógico> ? <expresión> : <expresión condicional>

<operador asignación> -> uno de

= = /= %= += = <<= >>= &= ^= |=

<expresión O lógico> -> <expresión Y lógico> | <expresión O lógico> || <expresión Y lógico>

<expresión Y lógico> -> <expresión O inclusivo> | <expresión Y lógico> && <expresión O inclusivo>

<expresión O inclusivo> -> <expresión O excluyente> | <expresión O inclusivo> | <expresión O excluyente>

<expresión O excluyente> -> <expresión Y> | <expresión O excluyente> ^ <expresión Y>

<expresión Y> -> <expresión de igualdad> | <expresión Y> & <expresión de igualdad>

<expresión de igualdad> -> <expresión relacional> | <expresión de igualdad> == <expresión relacional> | <expresión de igualdad> != <expresión relacional>

<expresión relacional> -> <expresión de corrimiento> | <expresión relacional> < <expresión de corrimiento> | <expresión relacional> > <expresión de corrimiento> | <expresión relacional> <= <expresión de corrimiento> | <expresión relacional> >= <expresión de corrimiento>

<expresión de corrimiento> -> <expresión aditiva> | <expresión de corrimiento> << <expresión aditiva> | <expresión de corrimiento> >> <expresión aditiva>

<expresión aditiva> -> <expresión multiplicativa> | <expresión aditiva> + <expresión multiplicativa> | <expresión aditiva> - <expresión multiplicativa>

<expresión multiplicativa> -> <expresión de conversión> |

<expresión multiplicativa> <expresión de conversión> |

Page 25: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

25

<expresión multiplicativa> / <expresión de conversión> | <expresión multiplicativa> % <expresión de conversión>

<expresión de conversión> -> <expresión unaria> | (<nombre de tipo>) <expresión de conversión>

<expresión unaria> -> <expresión sufijo> | ++ <expresión unaria> | -- <expresión unaria> | <operador unario> <expresión de conversión> | sizeof <expresión unaria> | sizeof (<nombre de tipo>)

<nombre de tipo> está descripto más adelante, en la sección Declaraciones.

<operador unario> -> uno de & + - ~ ! <expresión sufijo> ->

<expresión primaria> | <expresión sufijo> [<expresión>] | /* arreglo */ <expresión sufijo> (<lista de argumentos>?) | /* invocación */ <expresión sufijo> . <identificador> | <expresión sufijo> -> <identificador> | <expresión sufijo> ++ | <expresión sufijo> --

<lista de argumentos> -> <expresión de asignación> | <lista de argumentos> , <expresión de asignación>

<expresión primaria> -> <identificador> | <constante> | <constante cadena> | (<expresión>)

Expresiones Constantes

<expresión constante> -> <expresión condicional>

Las expresiones constantes pueden ser evaluadas durante la traducción en lugar

de durante la ejecución.

1.2.2. Declaraciones

Una declaración especifica la interpretación y los atributos de un

conjunto de identificadores.

Si una declaración provoca reserva de memoria, se la llama

definición.

<declaración> -> <especificadores de declaración> <lista de declaradores>?

<especificadores de declaración> -> <especificador de clase de almacenamiento> <especificadores de declaración>? | <especificador de tipo> <especificadores de declaración>? |

Page 26: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

26

<calificador de tipo> <especificadores de declaración>? <lista de declaradores> ->

<declarador> | <lista de declaradores> , <declarador>

<declarador> -> <decla> | <decla> = <inicializador>

<inicializador> -> <expresión de asignación> | /* Inicialización de tipos escalares */ {<lista de inicializadores>} | /* Inicialización 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 más de un especificador de clase de almacenamiento> puede

haber en una declaración

<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"> ->

<declaración "struct"> | <lista de declaraciones "struct"> <declaración "struct">

<declaración "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>? : <expresión 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>

Page 27: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

27

<declarador directo> -> <identificador> | ( <decla> ) | <declarador directo> [ <expresión constante>? ] | <declarador directo> ( <lista tipos parámetros> ) /* Declarador nuevo estilo */ <declarador directo> ( <lista de identificadores>? ) /* Declarador estilo obsoleto */

<lista tipos parámetros> -> <lista de parámetros> | <lista de parámetros> , . . .

<lista de parámetros> -> <declaración de parámetro> | <lista de parámetros> , <declaración de parámetro>

<declaración de parámetro> -> <especificadores de declaración> <decla> | /* Parámetros "nombrados" */ <especificadores de declaración> <declarador abstracto>? /* Parámetros "anónimos" */

<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 enumeración> | <constante de enumeración> = <expresión constante>

<constante de enumeración> -> <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>? [ <expresión constante>? ] | <declarador abstracto directo>? ( <lista tipos parámetros>? )

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 función sin parámetros y

que retorna un int */

int ( [ ] ) ( unsigned, . . . ) /* vector de un número no

especificado de punteros a funciones, cada una de las cuales tiene un parámetro unsigned int más un número no especificado de otros parámetros, y retorna un int */

Page 28: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

28

1.2.3. Sentencias

<sentencia> -> <sentencia expresión> | <sentencia compuesta> | <sentencia de selección> | <sentencia de iteración> | <sentencia etiquetada> | <sentencia de salto>

<sentencia expresión> -> <expresión>? ;

<sentencia compuesta> -> {<lista de declaraciones>? <lista de sentencias>?}

<lista de declaraciones> -> <declaración> | <lista de declaraciones> <declaración>

<lista de sentencias> -> <sentencia> | <lista de sentencias> <sentencia>

La sentencia compuesta también se denomina bloque.

<sentencia de selección> -> if (<expresión>) <sentencia> | if (<expresión>) <sentencia> else <sentencia> | switch (<expresión>) <sentencia>

La expresión e controla un switch debe ser de tipo entero. <sentencia de iteración> ->

while (<expresión>) <sentencia> | do <sentencia> while (<expresión>) ; | for (<expresión>? ; <expresión>? ; <expresión>?) <sentencia>

<sentencia etiquetada> -> case <expresión 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 <expresión>? ; | 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 expresión

no puede aparecer en una función void.

1.2.4. Definiciones Externas

<unidad de traducción> -> <declaración externa> | <unidad de traducción> <declaración externa>

<declaración externa> ->

Page 29: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

29

<definición de función> | <declaración>

La unidad de texto de programa luego del preprocesamiento es

una unidad de traducción, la cual consiste en una secuencia de

declaraciones externas.

Las declaraciones externas son llamadas así porque aparece fuera

de cualquier función. Los términos alcance de archivo y alcance

externo son sinónimos.

Si la declaración de un identificador para un objeto tiene alcance

de archivo y un inicializador, la declaración es una definición

externa para el identificador.

<definición de función> -> <especificadores de declaración>? <decla> <lista de declaraciones>? <sentencia compuesta>

1.3. Gramática del Preprocesador

<archivo de preprocesamiento> -> <grupo>?

<grupo> -> <parte de grupo> | <grupo parte de grupo>

<parte de grupo> -> <sección if> | <línea de control> | <línea de texto> | # <no directiva>

<sección if> -> <grupo if> <grupos elif>? <grupo else>? <línea endif>

<grupo if> -> # if <expresión constante> <nueva línea> <grupo>? | # ifdef <identificador> <nueva línea> <grupo>? | # ifndef <identificador> <nueva línea>< grupo>?

<grupos elif> -> <grupo elif> | <grupos elif> <grupo elif>

<grupo elif> -> # elif <expresión constante> <nueva línea> <grupo>?

<grupo else> -> # else <nueva línea> grupo>?

<línea endif> -> # endif <nueva línea>

<línea de control> -> # include <tokens pp> <nueva línea> | # define <identificador> <lista de reemplazos> <nueva línea> | # define <identificador> <parizq> <lista de identificadores>? ) <lista de reemplazos> <nueva línea> |

Page 30: Autómata Finito - · PDF fileTodo AF tiene asociado un digrafo, ... Un AF que la reconoce tiene el siguiente DT: A -B C 1 D + 0 0 ... estado en que se encuentre el autómata en un

Dr. Oscar BRUNO

30

# define <identificador> <parizq> ... ) <lista de reemplazos> <nueva línea> | # define <identificador> <parizq> <lista de identificadores> , ... ) <lista de reemplazos> <nueva línea> | # undef <identificador> <nueva línea> | # line <tokens pp> <nueva línea> | # error <tokens pp>? <nueva línea> | # pragma <tokens pp> <nueva línea> | # <nueva línea>

<línea de texto> -> <tokens pp>? <nueva línea>

<no directiva> -> <tokens pp> <nueva línea>

<parizq> -> un carácter ( no inmediatamente precedido por un espacio blanco

<lista de reemplazos> -> <tokens pp>?

<tokens pp> -> <token de preprocesamiento> | <tokens pp> <token de preprocesamiento>

<nueva línea> -> el carácter nueva línea 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> # ##