martes, 24 de marzo de 2009

Automata finito, deterministico, indeterministico

Links con información excelente sobre el tema

http://www.comoustedyasabe.com.ar/2docuatrimestre/ciencias/ClaseAutomatasFinitos.pps


AUTOMATAS FINITOS

Un autómata finito es un modelo matemático de una máquina que acepta cadenas de un
lenguaje definido sobre un alfabeto A. Consiste en un conjunto finito de estados y un conjunto
de transiciones entre esos estados, que dependen de los símbolos de la cadena de entrada. El
autómata finito acepta una cadena x si la secuencia de transiciones correspondientes a los
símbolos de x conduce desde el estado inicial a un estado final.
Si para todo estado del autómata existe como máximo una transición definida para cada
símbolo del alfabeto, se dice que el autómata es determinístico (AFD). Si a partir de algún
estado y para el mismo símbolo de entrada, se definen dos o más transiciones se dice que el
autómata es no determinístico (AFND).
Formalmente un autómata finito se define como una 5-upla
M = donde
E: conjunto finito de estados
A: alfabeto o conjunto finito de símbolos de entrada
d: función de transición de estados, que se define como
- d: E x A ® E si el autómata es determinístico
- d: E x A ® P(E) si el autómata es no determinístico (P(E) es el conjunto potencia
de E, es decir el conjunto de todos los subconjuntos de E)
e0: estado inicial; e0 Î E
F: conjunto de estados finales o estados de aceptación; F Í E
Generalmente se asocia con cada autómata un grafo dirigido, llamado diagrama de transición
de estados. Cada nodo del grafo corresponde a un estado. El estado inicial se indica mediante
una flecha que no tiene nodo origen. Los estados finales se representan con un círculo doble.
Si existe una transición del estado ei al estado ej para un símbolo de entrada a, existe entonces
un arco rotulado a desde el nodo ei al nodo ej; es decir que d(ei, a) = ej, se representa en el
diagrama
Ejemplo 1:
Autómata finito determinístico que acepta el lenguaje
L1 = {ancbm/ n > 0 y m ³ 0 }
M1D = < {e0, e1, e2}, {a, b, c}, d1D, e0, {e2 }>
d1D está definida por el siguiente diagrama de transición de estados
Ejemplo 2:
Autómata finito determinístico que acepta el lenguaje.
Autómatas finitos deterministas

Un AFD o autómata finito determinista es aquel autómata finito cuyo estado de llegada está unívocamente determinado por el estado inicial y el carácter leído por el autómata. Formalmente, un autómata finito determinista (AFD) es similar a un Autómata de estados finitos, representado con una 5-tupla (S,Σ,T,s,A) donde:
• Σ es un alfabeto; • S un conjunto de estados; • T es la función de transición: ; • es el estado inicial; • es un conjunto de estados de aceptación o finales.
Al contrario de la definición de autómata finito, este es un caso particular donde no se permiten transiciones lambda (vacías), el dominio de la función T es S (con lo cual no se permiten transiciones desde un estado de un mismo símbolo a varios estados).
A partir de este autómata finito es posible hallar la expresión regular resolviendo un sistema de ecuaciones. S1 = 1 S1 + 0 S2 + ε
S2 = 1 S2 + 0 S1+
Siendo ε la palabra nula. Resolviendo el sistema y haciendo uso de las reducciones apropiadas se obtiene la siguiente expresión regular: 1*(01*01*)*. Inversamente, dada la expresión regular es posible generar un autómata que reconozca el lenguaje en cuestión utilizando el algoritmo de Thompson, desarrollado por Ken Thompson, uno de los principales creadores de UNIX, junto con Dennis Ritchie. Un tipo de autómatas finitos deterministas interesantes son los tries.
Autómatas finitos no deterministas
Un AFND o autómata finito no determinista es aquel que presenta cero, una o más transiciones por el mismo carácter del alfabeto . Un autómata finito no determinista también puede o no tener más de un nodo inicial. Los AFND también se representan formalmente como tuplas de 5 elementos (S,Σ,T,s,A). La única diferencia respecto al AFD es T.
AFD: AFND: (partes de S)
Debido a que la función de transición lleva a un conjunto de estados, el automáta puede estar en varios estados a la vez (o en ninguno si se trata del conjunto vacío de estados). Autómatas finitos no deterministas con transiciones λ Un AFND-λ o autómata finito no determinista con transiciones λ permite cambiar de estado sin procesar ningún símbolo de entrada. Cuando el autómata llega a un estado, se encuentra en ese estado y en los estados a los que apunte este mediante una transición λ.
Un automata es un AFND: (partes de S) AFND-λ: (partes de S)
Cuando el símbolo de entrada es la palabra vacía (λ), existe una transición λ entre los estados. AFD, AFND y AFND-λ Para todo AFND-λ existe un AFND equivalente y para todo AFND existe un AFD equivalente.
Existen algoritmos para transformar un autómata en otro. Los AFD son los más sencillos de construir, por tanto, puede ser útil diseñar un autómata complejo como AFND-λ o AFND para luego transformarlo en AFD para su implementación.

martes, 17 de febrero de 2009

Análisis léxico



El análilsis léxico es un proceso mediante el cual se realiza un escaneo para leer los diferentes caracteres que contiene el programa fuente. Esto se realiza caracter a caracter despúes se agrupan teniendo en cuenta su significado propio; a este agrupamiento se le denomina componentes léxicos en ingles se conoce como Tokens.




COMPONENTES LEXICOS

Palabras reservadas: if, while, do, else. Identificadores: asociados a variables, nombres de funciones. Por ejemplo: posición, velocidad, tiempo. Operadores: = * + - / == > < & ! = . . . símbolos especiales: ; ( ) [ ] f g ... Constantes numéricas: literales que representan valores enteros, en coma flotante, 982, 0xF678, -83.2E+2,... Constantes de caracteres: literales que representan cadenas concretas de caracteres, \hola mundo".




FUNCIONES DEL ANALISIS LÉXICO

-Eliminación de espacios en blanco, comentarios, tabuladores y saltos de línea
-Asistencia en el informe de errores elaborado por el AS
-Cuenta de números de línea con comentarios, macros
-Convierte los valores literales al tipo que corresponda.
-Inclusion de ficheros: #include









¿Qué es un compilador ?

Un compilador es un programa que permite traducir un lenguaje fuente o lenguaje de programacion a un lenguaje objeto o código ensamblador, el cual es un lenguaje que puede entender la maquina; mediante el proceso de traducción es importante mencionar que se realiza detección de errores en el programa fuente. Los compiladores se utilizan tanto para lenguajes de programación tradicionales, como Fortran, C o Ada, o para aplicaciones especializadas como por ejemplo lenguajes de descripción de hardware, lenguajes de programación de robots, entre otros.


PARTES DE LA COMPILACIÓN

Análisis: Se realiza una division del programa en sus componentes y se crea una representación intermedia del programa fuente. Durante esta fase la estructura del programa se guarda en una estructura de datos especial que se denomina árbol sintáctico.

  1. Análisis léxico: separación de cada elemento componente del programa
  2. Análisis sintáctico: agrupa los componentes léxicos en frases gramaticales
  3. Análisis semántico: Se revisa el programa fuente para comprobar que las reglas semánticas del lenguaje (aquellas relativas al significado de las distintas instrucciones) se cumplen. Un ejemplo de regla semántica es la comprobación de tipos en las expresiones.

Síntesis: Construye el programa destino deseado a partir de una descripción en un lenguaje de representación intermedia.


Las tres primeras fases que realiza un compilador son: análisis léxico, sintáctico y semántico las cuales corresponden al analisis, pero dentro de la segunda fase de la compilación es decir durante la sintesis existen las siguientes fases: generación de código intermedio, optimador de código, y generador de código y existen otras dos fases la administración de la tabla de simbolos y el manejo de errores las cuales hacen interacción con las seis fases.


La tabla de símbolos: es una estructura de datos que almacena los identificadores utilizados en el programa fuente así como los atributos de cada identificador. Estos atributos pueden proporcionar información sobre el tipo del identificador, su tamaño, su rango de visibilidad, sus argumentos (en caso de procedimientos). La tabla de símbolos tiene operaciones para encontrar un identificador rápidamente, y leer sus atributos o modificarlos. Asimismo, permite introducir nuevos identificadores. Cada una de las fases de compilación puede realizar modificaciones de los registros de una tabla de símbolos, generalmente añadiendo más atributos a medida que se van conociendo.
El manejador de errores: es un módulo que gestiona las acciones a realizar por cada uno de los errores encontrados en las diferentes fases de la compilación.

PROGRAMAS DE SISTEMAS RELACIONADOS CON UN COMPILADOR

Preprocesador: Un programa fuente puede estar dividido en módulos almacenados en ficheros diferentes. La tarea de recopilar el código fuente almacenado en estos ficheros puede ser encomendada a un preprocesador. Asimismo, un preprocesador puede expandir las macros
convirtiéndolas en instrucciones ejecutables.
Ensamblador: Para poder obtener un programa ejecutable es preciso ensamblar este programa final con un ensamblador convencional.
Enlazador.Esta herramienta toma código máquina relocalizable de los diferentes objetos compilados y de librería, modifica las direcciones relocalizables para situarlas a los valores absolutos adecuados, y crea el programa ejecutable.