1.1. Entrada / Salida <stdio.h>

Documentos relacionados
OPERACIONES SOBRE LENGUAJES REGULARES LA UNIÓN DE LENGUAJES REGULARES

No todos los LRs finitos se representan mejor con ERs. Observe el siguiente ejemplo:

EJERCICIOS. Algo de C CADENAS

SSL Guia de Ejercicios

Caracter a caracter los datos pueden ser escritos o leidos carácter a carácter, con las funciones fputc() y fgetc().

Entrada/Salida. Entrada/Salida. Flujos de texto. Flujos de datos. Flujos binarios. Flujos estándares ANSI

LENGUAJE. Tema 8 Ficheros

Tema 13: Manejo de archivos en lenguaje C

6. Archivos. Programación II, FCFM, BUAP

Tema 6. Gestión de ficheros en C. Programación en Lenguajes Estructurados

Archivos. Programación en C 1

Tema 5. Entrada y Salida

Para C un chero no es más que una porción de almacenamiento

Fundamentos de Informática 7. Introducción al manejo de archivos

Archivos. Conceptos SESION 13

1.1. Gramática Léxica

Informática Ingeniería en Electrónica y Automática Industrial

CAPITULO 2: LENGUAJES

UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO

Tema 3: Entrada/Salida de Ficheros

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

Programación I Teoría : Entrada/Salida - Archivos.

Prof. Dr. Oscar Bruno SSL CLASE 2

Tema 07: Tipos de datos en C & entrada y salida estándar

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

DEFINICIONES BÁSICAS E INTRODUCCIÓN A LENGUAJES FORMALES

08 Análisis léxico IV

Concepto Concept s Los L nom res re d e e los h c eros: exter te n r os o o fí s fí ico nom re ú nico i del del ar chiv chiv o o o ficher ficher en

Informática Ingeniería en Electrónica y Automática Industrial

MIS. Lizbeth Alejandra Hernández González

1. Cadenas EJERCICIO 1

FILE *nombre_puntero_fichero; fopen(char_nombre_archivo,char_modo_apertura ); MODOS DE APERTURA. Abre un archivo de texto para lectura.

Por ejemplo, para declarar un arreglo de enteros llamado a con diez elementos se hace de la siguiente forma:

LEER RECUPERAR EXTRAER DATOS DE FICHEROS O ARCHIVOS EN C. FGETC, GETC, FGETS, FSCANF. EJERCICIOS (CU00538F)

Operaciones de E/S en ANSI C

U.A.B.C. Facultad de Ingeniería Programación Estructurada UNIDAD VI. UNIDAD VI Archivos.

Alfabetos, cadenas y lenguajes

Expresiones regulares, gramáticas regulares

Ficheros. Archivo, o fichero: Características:

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior ARCHIVOS. (File Management)

ENTRADA/SALIDA. Relación Programa - Sistema Operativo - Hardware

Bloque 9. Ficheros de texto

7. Manejo de Archivos en C.

Autómata finito y Expresiones regulares A* C. B

Expresiones regulares, gramáticas regulares

Objetivos. El alumno conocerá y aplicará el concepto de archivo para el almacenamiento y recuperación de datos persistentes.

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

Elementos de un programa en C

DEL AUTÓMATA FINITO A LA EXPRESIÓN REGULAR

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

El operador contenido ( ) permite acceder al contenido de

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Entrada y Salida de Datos. Lectura de archivos.

Informática I para Bachillerato

Lenguaje C Entrada y Salida de Datos. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

UNIDAD 2 Descripción de un programa

ESPECIFICACIÓN DE SÍMBOLOS

Tipos de datos y Operadores Básicos

07 Análisis léxico III

Capítulo 9. Lectura y escritura de ficheros

Algoritmos y estructuras de datos

INTRODUCCIÓN A COMPILADORES Y LENGUAJES FORMALES LENGUAJES FORMALES

Tema 1. Ficheros FUNDAMENTOS DE PROGRAMACIÓN II. Profesor: Fernando Pereñíguez García. Escuela Politécnica

Repaso Clase Anterior

Lenguaje de programación C. Introducción

El lenguaje C. 1. Identificadores, constantes y variables

Lenguajes y Gramáticas

Introducción a la Programación en C Gestión de Ficheros

Temas. Objetivo. Símbolo, alfabeto. Hileras y operaciones con hileras. Operaciones con lenguajes

06 Introducción al procesamiento de imágenes BMP con ANSI C

Lenguajes y Compiladores Aspectos Formales (Parte 2) Compiladores

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Tipos de Datos en C. Palabras reservadas en C

Tema 3. Estructuras de control

Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado.

Expresiones regulares, gramáticas regulares Unidad 3

7.1.1) archivos ) jerarquía de los datos

Lenguaje de Programación: C++ ARCHIVOS I/O

Archivos & Cadenas CURSO DE PROGRAMACIÓN EN C. Centro de Investigación y de Estudios Avanzados del IPN. CINVESTAV - Tamaulipas.

Instituto Técnico Jesús Obrero 4to año Programación Profesor: Luis Vallenilla

Lección 2 Introducción al lenguaje C

Programación I Ficheros de texto

Máquinas de estado finito y expresiones regulares

Sea G = (V N, V T, S, P) una gramática libre de contexto, un árbol es un árbol de derivación para G si:

Curso Básico de Computación Preliminares

Tema 2: Lenguajes Formales. Informática Teórica I

Fundamentos de Informática 5. Operadores, expresiones (y su aplicación)

Laboratorio de Arquitectura de Redes. Entrada y salida por archivos en lenguaje C

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

LENGUAJE. Tema 2 Elementos de un programa

o Archivos secuenciales: imitan el modo de acceso de los antiguos ficheros secuenciales almacenados en cintas magnéticas y

El alumno podrá : Manejar el acceso a memoria Manejar y manipular Archivos Programar estructuras y apuntadores de forma mas eficiente y avanzada

Curso Básico de Computación

Introducción a la Programación

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

Prácticas de Lenguajes, Gramáticas y Autómatas

Informática Ingeniería en Electrónica y Automática Industrial

Informática Ingeniería en Electrónica y Automática Industrial

Transcripción:

1 1.1. Entrada / Salida <stdio.h> 1.1.1. Tipos FILE Registra toda la información necesitada para controlar un flujo, incluyendo su indicador de posición en el archivo, puntero asociado a un buffer (si se utiliza), un indicador de error que registra sin un error de lectura/escritura ha ocurrido, y un indicador de fin de archivo que registra si el fin del archivo ha sido alcanzado. fpos_t Posibilita registrar la información que especifica unívocamente cada posición dentro de un archivo. 1.1.2. 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. 1.1.3. Operaciones sobre Archivos int remove(const char* nombrearchivo); Elimina al archivo cuyo nombre es el apuntado por nombrearchivo. Retorna (ok? 0 : 0) int rename(const char* viejo, const char* nuevo); Renombra al archivo cuyo nombre es la cadena apuntada por viejo con el nombre dado por la cadena apuntada por nuevo. Retorna (ok? 0 : 0). 1.1.4. Acceso FILE* fopen (

2 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). FILE* freopen( const char* nombrearchivo, const char* modo, FILE* flujo ); Abre el archivo cuyo nombre es la cadena apuntada por nombrearchivo y lo asocia con el flujo apuntado por flujo. La cadena apuntada por modo cumple la misma función que en fopen. Uso más común es para el redireccionamiento de stderr, stdin y stdout ya que estos son del tipo FILE* pero no necesariamente lvalues utilizables junto con fopen. Retorna (ok? flujo : NULL). int fflush (FILE* flujo); Escribe todos los datos que aún se encuentran en el buffer del flujo apuntado por flujo. Su uso es imprescindible si se mezcla scanf con gets o scanf con getchar, si se usan varios fgets, etc. Retorna (ok? 0 : EOF). int fclose (FILE* flujo); Vacía el buffer del flujo apuntado por flujo y cierra el archivo asociado. Retorna (ok? 0 : EOF) 1.1.5. 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). Flujos stdin y stdout Cadenas int scanf (const char*,...); Lectura formateada desde stdin. Retorna (ok? cantidad de ítems almacenados : EOF). int printf (const char*,...); Escritura formateada sobre stdout. Retorna (ok? cantidad de caracteres transmitidos : < 0). int sprintf (char* s, const char*,...); Escritura formateada en memoria, construyendo la cadena s. Retorna (cantidad de caracteres escritos).

3 int sscanf (const char* s, const char*,...); Lectura formateada desde una cadena s. Retorna (ok? cantidad de datos almacenados : EOF). 1.1.6. 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). 1.1.7. 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). char* gets (char* s); Lectura por cadena desde stdin; es mejor usar fgets() con stdin. 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). int puts (const char* s); Escribe la cadena apuntada por s en stdout. Retorna (ok? 0 : EOF). 1.1.8. Entrada / Salida de a Bloques unsigned fread (void* p, unsigned t, unsigned n, FILE* f);

4 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). 1.1.9. 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). int fsetpos (FILE* flujo, const fpos_t* posicion); Ubica el indicador de posición de archivo (y otros estados) del flujo apuntado por flujo según el valor del objeto apuntado por posicion, el cual debe ser un valor obtenido por una llamada exitosa a fgetpos. 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). int fgetpos (FILE* flujo, fpos_t* posicion); Almacena el indicador de posición de archivo (y otros estados) del flujo apuntado por flujo en el objeto apuntado por posicion, cuyo valor tiene significado sólo para la función fsetpos para el restablecimiento del indicador de posición de archivo al momento de la llamada a fgetpos. 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). void rewind(file *stream); Establece el indicador de posición de archivo del flujo apuntado por flujo al principio del archivo. Semánticamente equivalente a (void)fseek(stream, 0L, SEEK_SET), salvo que el indicador de error del flujo es desactivado. No retorna valor. 1.1.10. Manejo de Errores int feof (FILE* flujo);

5 Chequea el indicador de fin de archivo del flujo apuntado por flujo. Contrastar con la macro EOF (Contrastar con la macro EOF retornada por algunas funciones). Retorna (indicador de fin de archivo activado? 0 : 0). int ferror (FILE* flujo); Chequea el indicador de error del flujo apuntado por flujo (Contrastar con la macro EOF retornada por algunas funciones). Retorna (indicador de error activado? 0 : 0). void clearerr(file* flujo); Desactiva los indicadores de fin de archivo y error del flujo apuntado por flujo. No retorna valor. void perror(const char* s); Escribe en el flujo estándar de error (stderr) la cadena apuntada por s, seguida de dos puntos (:), un espacio, un mensaje de error apropiado y por último un carácter nueva línea (\n). El mensaje de error está en función a la expresión errno. No retorna valor.

6 LAS EXPRESIONES REGULARES (ERs) La forma más precisa y más útil de REPRESENTAR a los Lenguajes Regulares. EXPRESIONES REGULARES PARA LENGUAJES REGULARES FINITOS Utiliza caracteres del alfabeto, el símbolo, y los operadores: concatenación ( ), que ordena la ubicación de ciertos caracteres, y unión (+), ó, que representa una elección entre caracteres o grupos de caracteres. El operador concatenación tiene mayor prioridad que el operador unión. a representa L = {a}. representa L = { }. a b L = {ab}. a+ba, que se lee a unión ba o a ó ba LRs {a} {ba} o, {a, ba}. ab, que también se puede escribir ab +, representa L = {, ab}. La ER aa+b (aa unión b) es diferente a la ER a(a+b) La factorización en el ámbito de las ERs tiene alguna diferencia con la que se puede hacer entre las expresiones aritméticas. Ello se debe a que, como ya se informó, la concatenación no es conmutativa. En consecuencia, debemos hablar de factorización a izquierda, si se realiza porque se detectó un prefijo común a dos o más palabras, o de factorización a derecha, si lo que se detectó es un sufijo común. La ER abb+aab a(b+a)b. abbaac+abac+abacccac. ab(ba+ +accc)ac. La ER ba + ab no se puede factorizar a izquierda ni tampoco a derecha. Dos Expresiones Regulares son EQUIVALENTES si representan el mismo Lenguaje Regular. Las ERs a+b y b+a son equivalentes porque ambas representan al LR {a, b}. En cambio, las ERs a(a+b) y (a+b)a no son equivalentes El lenguaje Todas las palabras con dos caracteres sobre el alfabeto {a, b} puede ser representado por las siguientes Expresiones Regulares equivalentes: aa+ab+ba+bb = a(a+b)+b(a+b) = (a+b)(a+b). EL OPERADOR POTENCIA La ER +(a+b) 3 representa al LR: La palabra vacía y todas las palabras de tres caracteres sobre el alfabeto {a, b}. El lenguaje Todas las palabras de longitud 27 sobre el alfabeto {a, b} y que comienzan con 25 aes se puede representar mediante la siguiente ER: a 25 (a+b) 2. El lenguaje Todas las palabras de longitud 27 sobre el alfabeto {a, b} se representa fácilmente mediante la siguiente ER: (a + b) 27. EJERCICIOS (1) Escriba una ER que represente al LR Todas las palabras que comienzan con una a, seguida de dos o tres bes.

7 (2) Escriba una ER que represente al LR Todas las palabras de longitud 5 que comienzan con una a y terminan con una b. (3) Escriba una ER que represente al LR La palabra vacía y todas las palabras de longitud 5 que comienzan con aa o con bb, y que terminan con aa o con bb. (4) Compruebe que las ERs 1(0+1)(0+1)1 y 1001+1011+1101+1111 son equivalentes. (5) Describa, mediante una frase sin ambigüedades, al LR del ejercicio anterior. (6) Escriba, por enumeración, el LR +(a+b) 3. (7) Sea la ER 101101+1001101+1001. Obtenga una ER más compacta, que sea equivalente a esta expresión. Ayuda: utilice las factorizaciones que crea conveniente. EXPRESIONES REGULARES PARA LENGUAJES REGULARES INFINITOS Para representar repeticiones indeterminadas, incorporamos el operador estrella de Kleene o clausura de Kleene, o, más simplemente, operador estrella. El operador estrella de Kleene o clausura de Kleene genera la cadena vacía y todas las cadenas que se forman con la repetición, de su operando, un número de veces a elección. La ER a*, L = {a n / n 0}, La ER aa* L = {a n / n 1}, a +. El operador clausura positiva se utiliza para simplificar la escritura de ERs como la del Ejemplo 18: la ER aa* se puede escribir a +, por lo que a + = aa* = a*a. Las siguientes ERs son equivalentes: = * = +. Volviendo a las ERs a* y a +, se pueden comprobar las siguientes equivalencias: (1) a*a* = a*, ya que a*a* = ( + a + aa +...) ( + a + aa +...) = + a + aa +... = a*; (2) a + = aa* = a*a = aa*a* = a + a* = a*a + = a*a*aa*, entre otras. ( + a)* = ( + a) + = a*, porque la palabra vacía pertenece al lenguaje original. Nota 3: En los ejemplos que siguen se presentarán ERs acompañadas, cada una, por una frase que describe al LR que esta expresión representa. Se podrá apreciar que, muchas veces, resulta difícil elaborar una frase que sea clara, corta y sin ambigüedades. Esto se debe a que, cualquiera sea el Lenguaje Natural que utilicemos para describir un determinado Lenguaje Formal (en nuestro caso empleamos el castellano), la frase será, muchas veces, ambigua. Conclusión: cuando nos referimos a LRs, debemos preferir a las ERs por sobre las frases que describen a estos lenguajes. Consideremos la Expresión Regular ab*. ab +. ab + a, a*b* Las ER (ab)* y ER a*b* son equivalentes? La ER a* + b* es un subconjunto del LR representado por la ER a*b*. ER b*ab*ab* representa al lenguaje Todas las palabras sobre el alfabeto {a, b} con exactamente dos aes. Algunas palabras de este lenguaje son: aa, babba, bbaabbb, aba. Ejemplo 29 Consideremos ahora la ER (b*ab*ab*)*,

8 La ER (1+0)1* representa el LR Todos los números binarios que comienzan con un 1 o con un 0, el cual puede estar seguido por una secuencia de 1s. Los cuatro números binarios de menor longitud y que pertenecen a este lenguaje son: 1, 0, 11 y 01. LA EXPRESIÓN REGULAR UNIVERSAL Y SU APLICACIÓN Denominamos EXPRESIÓN REGULAR UNIVERSAL (ERU) a la ER que representa al Lenguaje Universal sobre un alfabeto Si el alfabeto es {a, b}, la ERU es (a+b)*. Algunas palabras son:, a, bbbabaa. Si el alfabeto es {0, 1}, la ERU es (0+1)*. Algunas palabras son: 000110101, 00000. Si el alfabeto es {a, b, c}, la ERU es (a+b+c)*. Algunas palabras son: cbaabbcca, bbbbbb. Las ERUs tienen una aplicación muy importante en la construcción de ERs que representan a un gran número de LRs infinitos, como apreciaremos en los ejemplos que siguen. El LR Todas las palabras sobre el alfabeto {a, b} que comienzan con a, se representa fácilmente mediante la siguiente ER: a (a + b)*. Si el LR fuera Todas las palabras que comienzan con a, sobre el alfabeto {a, b, c}, la ER que lo representa sería: a (a + b + c)*. ER a (a + b)* a. Ejemplos Dado el alfabeto = {a, b}, el LR Todas las palabras que terminan con aa o con bb se representa mediante la ER (a + b)* (aa + bb). Dado el alfabeto = {a, b}, el LR Todas las palabras que contienen como mínimo dos aes se representa mediante la ER (a + b)* a (a + b)* a (a + b)*. Otra ER que representa el mismo lenguaje del ejemplo anterior es b*ab*a (a + b)*. Afirmamos, entonces, que estas dos ERs son equivalentes porque representan el mismo lenguaje; en consecuencia: (a + b)* a (a + b)* a (a + b)* = b*ab*a (a + b)*. A cada ER le corresponde un único LR. Sin embargo, un LR puede ser representado por varias ERs, como sucede en el ejemplo anterior. Afirmamos entonces: dos ERs son equivalentes si representan el mismo LR. El LR Todas las palabras sobre el alfabeto {a, b} que tienen por lo menos una a y por lo menos una b puede ser representado por la siguiente ER: (a + b)* a (a + b)* b (a + b)* + (a + b)* b (a + b)* a (a + b)*. O por esta otra: (a + b)* (a (a + b)* b + b (a + b)* a) (a + b)*. El LR Todos los números binarios que comienzan con un número impar de 1s se puede representar mediante la ER 1 (11)* (0 + 1)*, o mediante esta otra: (1 + 111) (0 + 1)* + 111 (11) + (0 + 1)*. EXPRESIONES REGULARES Y LENGUAJES DE PROGRAMACIÓN

9 Los componentes básicos de un LP los identificadores, las palabras reservadas, las constantes, los operadores, los símbolos de puntuación constituyen diferentes LRs. Como tales, los podremos representar mediante ERs. Ejemplo 48 Sea un LP 1 en el que IDENTIFICADOR es una secuencia de letras y dígitos que comienza con letra. Supongamos que L representa a cualquiera de las letras y D representa a cualquiera de los dígitos. Entonces, el LR infinito IDENTIFICADOR puede representarse mediante la ER L (L+D)*. Ejemplo 49 Sea un LP 2 en el que CONSTANTE REAL es una secuencia de dígitos (por lo menos uno), seguido de un punto, seguido, no obligatoriamente, de una secuencia de dígitos. Entonces, el LR infinito CONSTANTE REAL puede representarse mediante la ER D +. D*. Ejemplo 50 Sea un LP 3 que solo tiene tres PALABRAS RESERVADAS: if, else y while. Entonces, este LR finito puede representarse mediante la ER if + else + while. 4.6 DEFINICIÓN FORMAL DE LAS EXPRESIONES REGULARES Las ERs se construyen utilizando los operadores básicos unión (+), concatenación ( ) y clausura de Kleene (*), y se definen formalmente de la siguiente manera recursiva: (1) ø es una ER que representa al LR vacío (sin palabras). (2) es una ER que representa al LR que solo contiene la palabra vacía: { }. (3) Todo símbolo x de un alfabeto corresponde a una ER x que representa a un LR que solo tiene una palabra con ese símbolo x. Ejemplo: Si = {a, b}, entonces a es una ER que representa al LR {a} y b es una ER que representa al LR {b}. (4) Una cadena s es una ER s que representa a un LR que solo contiene la palabra s. Ejemplo: dada la cadena abc, la ER abc representa al LR {abc}. (5) Si R 1 y R 2 son ERs, entonces R 1 + R 2 es una ER. Ejemplo: si R 1 = a y R 2 =, entonces a+ es una ER. (6) Si R 1 y R 2 son ERs, entonces R 1 R 2 (o, simplemente, R 1 R 2 ) es una ER. Ejemplo: si R 1 = a y R 2 = b, entonces ab es una ER. (7) Si R 1 es una ER, entonces R 1 * es una ER. Ejemplo: si R 1 = a, entonces a* es una ER. (8) Si R 1 es una ER, entonces (R 1 ) es una ER. Ejemplo: si R 1 = a, entonces (a) es una ER. A los tres operadores básicos descriptos para construir ERs, agregamos, como ya hemos visto, dos operadores que simplifican sensiblemente la escritura de algunas ERs. Ellos son: el operador clausura positiva y el operador potencia, los cuales ya hemos definido oportunamente. En consecuencia: (9) Si R 1 es una ER, entonces R 1 + es una ER. Ejemplo: si R 1 = a, entonces a + es una ER. (10) Si R 1 es una ER, entonces R 1 n (con n 0 y entero) es una ER. Ejemplo: si R 1 = a, entonces a 216 es una ER. Con respecto a la precedencia de los operadores, ya se ha informado que: (1) Los operadores clausura de Kleene, clausura positiva y potencia tienen prioridad máxima;

10 (2) El operador concatenación tiene prioridad media; y (3) El operador unión tiene prioridad mínima. 4.7 EQUIVALENCIAS ÚTILES ENTRE EXPRESIONES REGULARES En esta sección se conocerán algunas equivalencias que existen entre diferentes ERs y que pueden ser empleadas para simplificar la escritura de ciertas expresiones complejas. Esta es una sección ardua de leer, pero puede resultar de mucha utilidad en más de una ocasión. Sugerencia: recorra las equivalencias presentadas, siguiendo su lectura con algunos ejemplos propios y sencillos, y luego utilice esta sección como material de referencia. Sean R 1, R 2 y R 3 Expresiones Regulares; entonces: R 1 + R 2 = R 2 + R 1, porque el operador unión es conmutativo (R 1 + R 2 ) + R 3 = R 1 + (R 2 + R 3 ) = R 1 + R 2 + R 3 (R 1 R 2 ) R 3 = R 1 (R 2 R 3 ) = R 1 R 2 R 3 R 1 R 2 + R 1 R 3 = R 1 (R 2 + R 3 ) (simplificación por concatenación a izquierda) R 1 R 3 + R 2 R 3 = (R 1 + R 2 ) R 3 (simplificación por concatenación a derecha) (R 1 *)* = R 1 * ( + R 1 )* = R 1 * (R 1 * R 2 *)* = (R 1 + R 2 )* [por ejemplo: (a*b*)* = (a + b)* ] R 1 R 1 * = R 1 * R 1 = R 1 + + R 1 + = R 1 * R 1 + + R 1 * = R 1 * (R 1 + )* = R 1 * (R 1 *) + = R 1 * R 1 * R 1 * = R 1 * A continuación se agregan algunas equivalencias que corresponden a las ERUs, las que serán ejemplificadas sobre un alfabeto particular. Sea el alfabeto = {a, b}; entonces, el LU sobre este alfabeto está representado por la ER (a+b)*, y se verifican las siguientes equivalencias: (a + b)* + (a + b)* = (a + b)* (a + b)* (a + b)* = (a + b)* (a + b*)* = (a + b)* (a*b*)* = (a + b)* EXPRESIONES REGULARES EXTENDIDAS Las Expresiones Regulares también se emplean para representar datos que serán procesados por herramientas de software como Lex y Awk. Lex es una herramienta diseñada para ayudar a la escritura de compiladores e intérpretes, si bien también resulta útil para otras aplicaciones no tan complejas como, por ejemplo, aquellas que requieren algún tipo de búsqueda de patrones en su texto de entrada. En todos los casos, Lex utiliza las ERs para describir los patrones que debe encontrar y procesar.

11 Awk es un lenguaje de programación que posibilita resolver tareas en las que existe la manipulación habitual de datos, mayormente en forma de texto, como, por ejemplo: modificar el formato de los datos, controlar su validez, buscar patrones con cierta propiedad, etc. 4.8.1 UN METALENGUAJE PARA EXPRESIONES REGULARES Lex, Awk y cualquier otra herramienta que necesite representar ERs para su posterior procesamiento, considera a estas expresiones como un lenguaje. Este lenguaje de las ERs está formado por: (1) operandos, que son los caracteres del alfabeto; (2) operadores: clausura de Kleene, clausura positiva, concatenación, unión, y otros que serán incorporados a continuación, todos los cuales deben ser representados en la misma línea (no se permiten supraíndices ni subíndices); y (3) ciertos caracteres especiales, llamados metacaracteres, que colaboran en la descripción, sin ambigüedades, de la Expresión Regular en cuestión. Un metalenguaje es un lenguaje que se usa para describir otro lenguaje. El que queremos describir es el lenguaje de las ERs, y el metalenguaje que utilizaremos tiene símbolos que no son ni operandos ni operadores que agregamos para describir, de forma inequívoca, a las ERs; a estos símbolos los llamamos metacaracteres. Estos metalenguajes no están estandarizados, es decir: existen diferentes metalenguajes para describir el lenguaje de las ERs. Pero lo fundamental, en este momento, es definir y aprender a trabajar con cierto metalenguaje; esto servirá, luego, para comprender y trabajar con cualquier metalenguaje. A continuación se presenta un subconjunto del metalenguaje utilizado por Lex, Awk y otras herramientas, para describir a las ERs. Observe que los metacaracteres utilizados no solo describen las operaciones conocidas, sino que también ayudan a representar nuevos operadores: operador unión de expresiones (ejemplo: ab b representa la ER ab+b) [ ] clase de caracteres, simplifica la unión de caracteres (ejemplo: [abx] representa la ER a+b+x) [ ] clase de caracteres en un intervalo (ejemplo: [a d] representa la ER a+b+c+d) { } operador potencia, repetición determinada (ejemplo: a{3} representa la ER aaa) {,} operador potencia extendido a un intervalo (ejemplo: a{1,3} representa la ER a+aa+aaa)? cero o una ocurrencia de la expresión que lo precede (ejemplo: a? representa la ER a+ ) operador clausura de Kleene, cero o más copias de quien lo precede (ejemplo: a representa la ER a*) + operador clausura positiva, una o más copias de quien lo precede (ejemplo: a+ representa la ER a + ) ( ) agrupa una ER (ejemplo: ((ab)? b)+ representa (ab+ +b) + ) Nota 8: Observe que no existe un operador explícito para la concatenación. La aparición de un carácter o de una clase de caracteres inmediatamente a continuación de otro representa la concatenación de estos caracteres o clases de caracteres. Ejemplo 51 [ab][cd] equivale a (a+b)(c+d) = ac + ad + bc + bd.

12 Nota 9: En el metalenguaje, los espacios en blanco son opcionales, aunque no pueden existir en una concatenación. Nota 10: Los operadores unarios (clausura de Kleene, clausura positiva, potencia y?) tienen máxima prioridad. Nota 11: si un símbolo utilizado como metacarácter es un carácter de una ER, se lo debe preceder de una barra invertida (\) para evitar una interpretación errónea (ejemplo: \+). Ejemplo 52 En este metalenguaje, la expresión a? (a b) b representa a la ER (a+ε) (a+b) b. Ejemplo 53 La expresión \? [0-9]+ representa el LR de todos los números enteros en base 10, eventualmente precedidos por el signo negativo. Ejemplo 54 La expresión (\+ \ )? [0-9]+ es muy similar a la del ejemplo anterior, pero, ahora, el número entero en base 10 puede estar precedido por cualquiera de los dos signos. Por caso, los números 204, 204 y +204 pertenecen al lenguaje representado. Ejemplo 55 La expresión [0-9] \.[0-9]+ representa el LR de todas las constantes reales en punto fijo, sin signo, y con dígitos decimales optativos antes del punto decimal. Algunos números que pertenecen a este lenguaje son: 12345.0, 0.18,.024 y 12.3467. EJERCICIOS (1) Describa, mediante una frase, al lenguaje representado por la ER ab 10 (a + b) 6. (2) Explique por qué las ERs a* y a + no son equivalentes. (3) Verifique si el lenguaje asociado a la expresión a + es un subconjunto del lenguaje asociado a la ER a*. (4) Describa, mediante una frase, al LR representado por la ER a + b + y escriba sus tres palabras de menor longitud. (5) Describa, mediante una frase, al LR representado por la ER a + a y escriba sus tres palabras de menor longitud. (6) Compruebe que la ER a* + b* representa un LR que es un subconjunto del LR representado por la ER a*b*. (7) Escriba una ER que represente a Todas las palabras sobre el alfabeto {0,1} que tienen exactamente tres 0s. (8) Compruebe que la ER a* + b* no representa al mismo lenguaje que (a + b)*. (9) Explique la diferencia que existe entre a*b*, (ab*)* y (a*b)*. Escriba las palabras comunes a los tres LRs. (10) Describa, mediante una frase, al lenguaje representado por la ER ab* + (ba)*. (11) Escriba una ER que represente al lenguaje Todas las palabras sobre el alfabeto {0, 1} que comienzan con un 1 y terminan con un 0. (12) Escriba una ER que represente al lenguaje Todos los números binarios que comienzan con una cantidad impar de 1s o que solo tienen 1s.

13 (13) Escriba una ER que represente al lenguaje Todas las palabras sobre el alfabeto {a, b, c} que comienzan con aa y terminan con cc, o que comienzan con un número impar de bes, o que solo tienen ces. (14) Escriba una ER que represente al lenguaje Todas las palabras sobre el alfabeto {a, b, c} que terminan con doble letra, o que comienzan con a y tienen un número impar de aes en total. (15) Escriba una ER que denote el lenguaje Todos los números binarios que terminan con doble 1, o que terminan con un triple 0, o que comienzan con una cantidad de 1s que es múltiplo de cuatro y terminan con 010. (16) Escriba una Definición Regular que represente al lenguaje de comentarios en C. (17) Escriba una Definición Regular que represente al lenguaje de los números reales en C (reales en punto fijo y reales en punto flotante, sin signo). (18) Escriba una Definición Regular que represente al lenguaje Todas las palabras sobre {a, b} que terminan con abb, o que comienzan con ba y terminan con bba.