Anlisis Lxico - PowerPoint PPT Presentation

1 / 63
About This Presentation
Title:

Anlisis Lxico

Description:

Es un modelo matem tico que sirve para determinar si una cadena ... S= alfabeto de entrada & = funciones de transici n. F = conjunto de estados de aceptaci n ... – PowerPoint PPT presentation

Number of Views:147
Avg rating:3.0/5.0
Slides: 64
Provided by: juancarlos3
Category:

less

Transcript and Presenter's Notes

Title: Anlisis Lxico


1
Análisis Léxico
  • M.C. Juan Carlos Olivares Rojas

2
Agenda
  • Introducción a los Autómatas finitos y
    expresiones regulares.
  • Analizador de léxico.
  • Manejo de localidades temporales de memoria
    (buffers).
  • Creación de tablas de símbolos.
  • Manejo de errores léxicos.
  • Generadores de código léxico Lexy Flex.

3
Ensamblado en Java
  • Qué es un autómata? Es un modelo matemático que
    sirve para determinar si una cadena pertenece a
    un lenguaje no.
  • A (Q, S, , F) donde
  • Q conjunto de estados
  • S alfabeto de entrada
  • funciones de transición
  • F conjunto de estados de aceptación

4
AFD
  • La característica que tienen los Autómatas
    Finitos Deterministas (AFD) es que solo existe
    una función de transición definida para un
    símbolo de entrada. Esto elimina ambigüedades
  • Una expresión regular es una forma abreviada de
    representar lenguajes
  • a Representa el lenguaje de las letras a
  • a Representa el lenguaje que tiene 0 hasta n as

5
AFD
  • El principio de diseño de un Lenguaje de
    Programación radica en la utilización de un
    autómata genérico y de ese autómata partir de
    varios subautómatas.
  • Los autómatas suelen representarse con
    expresiones regulares. Ejemplo
  • Identificador letra (letra digito gb)

6
AFD
  • Generar la expresión regular para identificar URL
    válidas.
  • Ejemplo
  • http//www.patito.com/recurso.php?id0
  • ftp//ftp.sindominio.com/pub/archivo
  • file//casa.decera.com/recurso20dos
  • Cómo queda la expresión regular?

7
AFD
  • Dada la siguiente expresión regular como queda el
    autómata que lo representa
  • Alpha (alpha num sim)
  • Donde alpha es un carácter de a..Z
  • Num es un dígito de 0 a 9
  • Sim es uno de los siguientes símbolos

8
AFD
  • Cómo se programa un autómata?
  • Los autómatas tienen su representación en forma
    de grafos que a su vez se representan en forma de
    tablas de transiciones, se cuenta con un estado
    inicial y una función de siguiente estado. Al
    terminar de leer la cadena se verifica si el
    estado es algún estado de aceptación.

9
Práctica 5
  • Programar un autómata para reconocer la URLs que
    son válidas.
  • Se deberá tener una matriz de transiciones y una
    función de estado siguiente. No se permitirán
    validaciones por otros medios.
  • Se deberán leer cadenas contenidas en un archivo
    de texto plano y deberá devolver que cadenas si
    son URLs

10
Expresiones Regulares y Gramáticas
  • Qué similitudes existen entre las expresiones
    regulares y gramáticas?
  • Una gramática sirve para generar cadenas de un
    determinado lenguaje pero también sirve para
    generarla.
  • Existente una relación uno a uno entre Lenguajes,
    Autómatas, Expresiones regulares y gramáticas.

11
Analizador Léxico
  • El análisis léxico es la primera fase de la
    compilación.
  • Un analizador léxico
  • Lee caracteres de entrada y generar como salida
    una secuencia de componentes léxicos
    (generalmente representados por números).

12
Analizador Léxico
  • Un analizador léxico
  • Elimina espacios en blanco (considerados por el
    lenguaje como tabuladores, etc.)
  • Eliminar comentarios
  • Proporcionar información acerca de errores
    léxicos (caracteres inexistentes o tokens
    inexistentes)

13
Tabla de Símbolos
  • La tabla de símbolos se compone de un lexema y un
    identificador del componente léxico.
  • Los componentes léxicos se conforman de un patrón
    (expresión regular que lo valida).
  • El patrón se codifica como un autómata.

14
Tokens, Lexemas y Patrones
15
Análisis Léxico
  • También recibe el análisis lineal, se llama
    léxico o exploración.
  • Ejemplo
  • Posicion inicial velocidad 60
  • Posicion identificador
  • símbolo de asignación
  • Inicial identificador

16
Análisis Léxico
  • signo de suma
  • Velocidad identificador
  • signo de multiplicación
  • 60 numero
  • Las palabras clave de muchos lenguajes son
    lexemas tal cual. Por ejemplo para reconocer un
    token if, se necesita de un patrón if.

17
Analizador Léxico
  • La tabla de símbolo debe insertar y buscar
    componentes léxicos (aunque en el análisis léxico
    sólo se inserten, se debe recordar que la tabla
    de símbolos es utilizada por el analizador
    sintáctico y por otras fases del proceso de
    traducción.
  • Los componentes léxicos se tratan como terminales
    de la gramática del lenguaje fuente. Existen
    muchas herramientas para utilizar expresiones
    regulares.

18
Definiciones Regulares
  • Dan nombres a las expresiones regulares. Permiten
    referenciar las expresiones regulares
    recursivamente
  • Ejemplo
  • Digito ? 1234567890
  • Entero ? dígito
  • Decimal ? dígito .dígito E ( - e) dígito
  • Real ? entero (decimal e)

19
Abreviaturas
  • cero o más casos
  • uno o más casos
  • ? 0 ó 1 vez (opcional)
  • a-zA-Z mayúsculas y minúsculas
  • 0-9 dígitos

20
Definiciones Regulares
  • Digito?0-9
  • Entero ?digito
  • Decimal ?.digitoexponente?
  • Exponente ?(E e) (-)?digito
  • Real ? entero decimal?

21
Analizador Léxico
22
Examen 2
  • Entrega viernes 9
  • Análisis de Requerimientos dado un archivo
    .class correcto, encontrar los mnemónicos que
    tiene disponible el ensamblador (alias javap c
    Archivo)
  • Complejidad al detectar el encabezado (formato
    .class) y después la complejidad del código

23
Examen 2
24
Examen
  • Se puede observar que de este pequeño hola mundo
    se tienen dos métodos.
  • El primero de ellos de 5 bytes, revisando sus
    mnemónicos se puede observar que su códigos de
    operación en byte es
  • 0x2a
  • 0xb7 0x00 0x01
  • b1

25
  • BB FE AF EA 77 03 05 2a b7 00 01 b1 12
  • Formato valido
  • aload_o
  • Invokespecial 0 1
  • Return

26
Examen 2
27
Examen 2
  • Esto se puede buscar en el archivo .class.
  • El detalle radica en que el código no viene sólo
    sino en una estructura Attribute denominada
    code_attribute (ver unidad pasada). Nótese por
    ejemplo que un byte antes del código marcado nos
    indica el tamaño del código de ese método.

28
Examen 2
  • Reformulación del proyecto. Dado nuestro propio
    formato comenzará de la siguiente forma 4 bytes
    de número mágico BB FE AF EA, 2 bytes para
    indicar la versión y subversión del compilado, 2
    bytes para indicar el tamaño del código,
    instrucciones del ensamblador de java y un byte
    al final como código de comprobación (tamaño
    total del archivo 255).

29
Examen 2
  • Se deberá validar que sus archivos .obj tengan
    este formato. Se hará la impresión de los
    mnemónicos contenidos (puede ser modo texto o
    visual).
  • Se ocupa conocer el tamaño de los mnemónicos
  • Para el viernes autómata o examen 2? Por lo
    tanto que queda para el lunes.

30
Mnemónicos en Java
  • astore ltvarnumgt saca de la pila una referencia.
  • baload recupera un byte de un arreglo de bytes y
    lo convierte a un entero que se coloca en la pila
    de operandos.
  • bipush ltngt coloca un entero de 8 bits en la pila
    (lo convierte a un entero de 32 bits)

31
Mnemónicos en Java
  • d2f saca de la pila un flotante de doble
    presición para convertile a un flotante sencillo
    y volverlo a colocar en la pila (esta operación
    puede causar pérdida de precisión).
  • dadd toma dos dobles de la pila, los suma y
    coloca el resultado en la pila.
  • dup_x1 duplica el valor de la cima de la pila y
    la coloca una posición debajo.

32
Mnemónicos en Java
  • fneg niega un flotante.
  • goto ltlabelgt brinca a la dirección especificada
    por la etiqueta (cadena de texto), label ocupa
    dos bytes por lo que esta instrucción es de 3
    bytes.
  • iand realiza una operación lógica Y entre dos
    enteros en la cima de la pila, el resultado lo
    deja en la pila.

33
Mnemónicos en Java
  • ifeq ltlabelgt realiza un pop en la pila para
    comparar si el valor apuntado por etiqueta es
    igual al de la pila. Esta es una instrucción de 3
    bytes
  • istore ltvarnumgt saca un valor de la pila y lo
    almacena en una variable local.
  • jsr_w ltlabelgt salta a una subrutina, label hace
    referencia a un valor doble, por lo que esta
    instrucción es de 5 bytes.

34
Manejo de localidades temporales de memoria
(buffers)
  • La forma más fácil de realizar el escanner de un
    código es a través de carácter por carácter pero
    esto es sumamente ineficiente.
  • La forma más eficiente es realizar una copia a la
    memoria de todo el código fuente.

35
Manejo de Buffers
  • La desventaja de este último enfoque es que la
    gran mayoría de las ocasiones es impráctico por
    las dimensiones de los programas. Para solucionar
    este problema se sugiere utilizar buffers.
  • Existen muchas formas de dividir el trabajo, pero
    siempre se deberá llevar dos punteros, uno al
    carácter actual y otro al inicial del lexema.

36
Creación de Tabla de Símbolos
  • En general el proceso de análisis léxico puede
    describirse simplemente como el reconocimiento de
    caracteres de un lenguaje para generar una tabla
    de símbolos.
  • El primer paso consiste en crear un escáner, el
    cual se encarga de verificar que no existan
    caracteres no presentes en el lenguaje.

37
Tabla de Símbolos
  • La tabla de símbolos va a guardar cada palabra
    analizada, la va identificar como un lexema y le
    va asociar un identificador numérico para
    posteriormente utilizarlo.
  • La tabla de símbolos debe estar en memoria para
    realizar un análisis rápido.

38
Errores Léxicos
  • Son pocos los errores que se pueden detectar al
    hacer análisis léxico
  • Por ejemplo
  • fi (a f(x))
  • Es error léxico? No, es error sintáctico
  • Puede existir algún error si ninguno de los
    patrones no concuerda con el prefijo de entrada.

39
Técnicas de Recuperación de Errores
  • Borrar un carácter extraño
  • Insertar un carácter que falta
  • Reemplazar un carácter incorrecto por otro
    correcto
  • Intercambiar dos caracteres adyacentes

40
Técnicas para realizar analizadores léxicos
  • Utilizar un analizador léxico como LEX. El
    generador se encarga de manejar buffers
  • Escribir el analizador en un lenguaje de alto
    nivel haciendo uso de la E/S del lenguaje
  • Escribir el lenguaje ensamblador y manejar
    explícitamente la E/S

41
Patrones en Java
  • El lenguaje Java es un lenguaje de alto nivel de
    propósito general que cuenta entre sus cosas con
    un motor para reconocimento de patrones de texto.
  • El paquete javax.util.regex. el cual dispone de
    dos clases Pattern y Matcher.

42
Patrones en Java
  • La clase Pattern se utiliza para especificar los
    patrones y la clase Matcher se utiliza para
    procesar las cadenas y ver si coinciden con el
    patrón.
  • El método compile de la clase Pattern permite
    especificar la expresión regular utilizando
    prácticamente la misma simbología de comodines de
    expresiones regulares.

43
Patrones en Java
  • Un objeto de la clase Matcher se crea a través
    del método matcher() del objeto instanciado de la
    clase Pattern.
  • La clase matcher tiene los siguientes métodos
    matches para una coincidencia exacta, lookingAt
    cuando se encuentra el patrón en parte de la
    cadena, find permite buscar subcadenas que
    coincidan con el patrón.

44
Patrones en Java
  • El método find permite utilizar los métodos start
    y end para encontrar la primera y última
    coincidencia.
  • El método replaceAll(), permite cambiar una
    subcadena por otra.

45
Patrones en Java
  • import java.util.regex.
  • public class ValidarEmail
  • public static void main(String args) throws
    Exception
  • String cadena jcolivar_at_hotmail.com"
  • Pattern p Pattern.compile("\\w\\_at_\\w\\.\\w"
    )
  • Matcher m p.matcher(input)
  • if (m.find()) System.err.println("Las
    direcciones email no empiezan por punto o _at_")

46
Generadores de Código Léxico
  • FLEX es la versión de software libre del popular
    generador de analizadores léxicos LEX para
    sistemas NIX, genera código C aunque existen
    otras herramientas que generan código en otros
    lenguajes (Jflex para Java)
  • Analizador.lex ? flex ?lex.yy.c ?gcc ?Programa
    ejecutable analizador
  • gcc lex.yy.c o analizador l fl

47
Estructura Lex
  • Definiciones globales C
  • Definiciones flex
  • Acciones
  • Código C auxiliar

48
Definiciones de Expresiones Regulares
  • Separadores de secciones
  • Def ?expresión
  • Acciones
  • def código C asociado
  • _at_código C asociado

49
Ejemplo Scanner Flotante
  • include ltstdio.hgt
  • int ocurrencias
  • digito 0-9
  • punto \.
  • exp eE
  • signo\\-
  • digitos digito

50
Ejemplo de Scanner Flotante
  • decimal punto digitos(expsignodigitos)?
  • flotante digitosdecimal?
  • flotante printf(flotante encontrado\n)
  • ocurrenicas
  • _at_ printf(Arroba\n)
  • . printf(Inválido s\n, yytext)

51
Ejemplo de Scanner Flotante
  • int main(int argc, char argv)
  • FILE f
  • F fopen(argv1, r)
  • yyin f
  • while(yylex())
  • printf(dflotantes encontrados\n,
    ocurrencias)
  • fclose(f)
  • return 0

52
JFlex
  • Es otra forma de incluir expresiones regulares
    para crear scanners pero ahora con lenguaje java.
  • Se tiene que manejar una sintaxis muy similar a
    lex con sus respectivas variantes.
  • Las expresiones regulares se definen dentro de un
    archivo con extension .lex o jflex (realmente la
    extensión no importa). A continuación se muestra
    un ejemplo.

53
JFlex
  • /Aqui van todas las bibliotecas/
  • import javax.swing.JOptionPane
  • /Definiciones regulares y parametros de
    configuracion/
  • class Flotante
  • unicode
  • full
  • int

54
JFlex
  • line
  • column
  • /Codigo Java genérico/
  • int ocurrencias
  • public int getOcurrencias()
  • return ocurrencias

55
JFlex
  • /Definiciones regulares/
  • digitodigit
  • blancos\n\r\t\f\b
  • punto .
  • expeE
  • signo-
  • digitosdigito
  • decimalpuntodigitos(("e""E")signodigitos
    )?

56
JFlex
  • flotantesigno?digitosdecimal?
  • /Seccivn de acciones/
  • /Palabras reservadas /
  • ltYYINITIALgt "break" JOptionPane.showMessageDialo
    g(null, "Se encontro un break")
  • ltYYINITIALgt
  • flotante

57
JFlex
  • JOptionPane.showMessageDialog(null, "Se
    encontro un flotante " yytext())
  • ocurrencias
  • blancos /se ignora/
  • . /ignoramos el token/
  • //Falta construir la clase principal o bien
    incrustarla dentro del código main

58
JFlex
  • import java.io.
  • public class ScannerFlotante
  • public static void main(String args)
  • try
  • FileReader arch new FileReader(args0)
  • Flotante f new Flotante(arch)
  • f.yylex()
  • System.out.print("Numero de flotantes
    encontrados" f.getOcurrencias())
  • catch (Exception e)

59
JFlex
  • e.printStackTrace()
  • La invocación de Jflex se realiza jflex
    archivo.lex, sino se pasan argumentos se abre una
    interface gráfica.
  • La clase generada se llama Flotante.java (si no
    se expecifica se crea una clase Yylex.java)

60
JFlex
  • Al igual que lex, se puede complementar el código
    con algún otro código de Java, por ejemplo APIs
    para el manejo de gráficos.
  • Jflex genera autómatas finitos no determinista
    que luego convierte a autómatas finitos
    determinista para posteriormente minimizar su
    estado.

61
Referencias
  • Aho, Sethi, Ullman. Compiladores Principios,
    técnicas y herramientas Ed. Addison Wesley.
  • Beck,. Software de Sistemas, Introducción a la
    programación de Sistemas Ed. Addison-Wesley
    Iberoamericana.
  • Kenneth C. Louden. Construcción de compiladores
    Principios y práctica. Ed. Thomson.

62
Referencias
  • Java Virtual Machine Specification

63
Preguntas?
Write a Comment
User Comments (0)
About PowerShow.com