Análisis Léxico
Introducción
• "Una forma sencilla de crear un
  analizador léxico consiste en la
  construcción de un diagrama que
  ilustren    la   estructura   de   los
  componentes léxicos del lenguaje
  fuente, y después hacer la traducción
  "a mano" del diagrama a un programa
  para     encontrar   los    componente
  léxicos."
Función del analizador léxico

• El análisis léxico o lineal (scanner), reconoce y
  clasifica todas las “palabras”, componentes léxicos
  o tokens de un código fuente.

• El analizador léxico lee el código fuente caracter a
  caracter y vá armando uno a uno los componentes
  léxicos que después entregará al analizador
  sintáctico, cada que este le de la orden de enviarle
  el siguiente token.

• El analizador léxico puede hacer tareas secundarias
  como: eliminar comentarios y espacios en blanco y
  relacionar los mensajes de error.
2 de diciembre de 2012
Función del analizador léxico
Componentes léxicos, patrones y
          lexemas
 • Estos tres nombres tienen significado
   específico en análisis sintáctico.

 • En general hay un conjunto de cadenas de
   entrada para el cual se produce como salida
   el mismo componente léxico.

 • Este conjunto de cadenas se construye
   mediante una regla llamada patrón asociado
   al componente léxico.
Estructura de un
  Compilador
Análisis Léxico
• ¿ Qué queremos hacer? Ejemplo:
   If (i == j)
     z=0;
   else
      z=1;
• La entrada es sólo una secuencia de caracteres:
   tif(i==j)nttz=0;ntelsenttz=1;


Meta: Partir la cadena de entrada en subcadenas
  y clasificar las subcadenas de acuerdo a su role
¿Qué es un token?
• La salida del analizador léxico es un conjunto
  de tokens.
• Un token es una categoría sintáctica
  – En Español:
     • Nombres, verbos, adjetivos, …
  – En un lenguaje de programación
     • Identificadores, Enteros, palabras reservadas, espacios
       en blanco, …
• La siguiente etapa, toma los tokens.
  – Ejem. Los identificadores se tratan diferente que
    las palabras reservadas.
Tokens
•   Los token corresponden a conjuntos de cadenas.

•   Identificadores:cadenas de letras o dígitos que comienzan con
    una letra.

•   Enteros: una cadena de dígitos.

•   Palabras reservadas: else, if, begin, …

•   Espacios en blanco: una secuencia de espacios, nuevas líneas,
    tabuladores.

•   Open par: un paréntesis izquierdo.
Implementación del
       analizador léxico
• Una implementación debe hacer dos
  cosas:

  – Reconocer las subcadenas que
    corresponden a tokens.

  – Regresar el valor o lexema de un token
    • El lexema es la subcadena.
Ejemplo
• Recordar:
  tif(i==j)nttz=0; ntelsenttz=1:

• El par Token-lexema que regresa el
  analizador léxico:
  –   (Espacio en blanco, ¨t¨ )
  –   (Palabra reservada, ¨if¨)
  –   (Parentesis abre, ¨(¨)
  –   (Identificador, ¨i¨)
  –   (Relación, ¨==¨)
  –   (Identificador, ¨j¨), etc
  –   …
Implementación del
        analizador léxico
• El A. Léxico por lo regular descarta tokens
  que no son "importantes" tokens que no
  contribuyen a generar el árbol.

• Ejemplos: Espacios en blanco, comentarios.

• Pregunta: ¿Qué pasa si quitamos todos los
  espacios en blanco y comentarios antes de
  realizar el análisis léxico?
Mirar por adelantado
• Dos puntos importantes:
  – La meta final es particionar la cadena. Esto se
    implementa leyendo la cadena de izquierda a
    derecha, reconociendo un token a la vez.

  – Mirar por adelantado algunas veces se requiere
    para decidir donde finaliza un token y donde
    comienza el último token.
        i vs if
        = vs ==
Además
• Necesitamos
  – Una forma de describir los lexemas de
    cada token.

  – Una forma de resolver ambigüedades
    • ¿If describe dos variables?
    • ¿ == representa dos símbolos = y = ?
Lenguajes Regulares
• Existen diferentes formalismos para
  especificar tokens.

• Los lenguajes regulares son los más
  populares.
  – Teoría simple y útil
  – Fácil de entender
  – Implementaciones eficientes.
Lenguaje
• Def. Sea ∑un conjunto de caracteres.
  Un lenguaje sobre ∑ es un conjunto de
  cadenas tomadas desde ∑.

    • (∑ se conoce como el alfabeto)
Ejemplo de lenguajes
• Alfabeto = Caracteres   • Alfabeto = ASCII
  del idioma inglés       • Lenguaje =
                            programas en C
• Lenguaje = sentencias
  en inglés.
                          • Nota. El conjunto de
                            caracteres ASCII es
• No todas las cadenas      diferente que el
  en el alfabeto inglés     conjunto de
  forman sentencias.        caracteres inglés.
Componentes léxicos
              Identificadores
 Lenguaje                 Patrón                Ejemplos
C, Pascal, Java, Inician con letra y pueden     X1, r_23
C# y casi todos ir seguidos de letras,
los lenguajes    dígitos o carácter
                  subrayado
PHP               Inician con $ y van           $x, $_POST
                  seguidos de letras o
                  dígitos
Prolog            Inician con letra, seguidas   Nombre
                  de létras o dígitos o _.      primo(X)
                  Mayúsculas nombre de
                  variable
                  Minúsculas nombre de
                  predicado
Componentes léxicos
                Literales Numéricos
                   Enteros, reales, reales con notación científica.

        Lenguaje                                Patrón                             Ejemplos

Todos                      Enteros: Inician con signo opcional y va seguido de   -1223
                           uno o más dígitos
                                                                                 99882
                           Reales: Inician con signo opcional y van seguido de   12.323
                           uno o más dígitos y opcional seguido de un punto y
                           uno o más dígitos.                                    -44.53421

                           Reales con notación científica: Inicia con signo      -32.3e-19
                           opcional, y van seguidos de uno o más dígitos,
                           seguido de punto “.”, seguido de uno o más dígitos,   7.4e+12
                           seguido de “E” seguido del signo + ó – opcional y     -9.1e10
                           seguido de uno o más dígitos.

Smalltalk, Scheme otros    Fraccion: inicia por signo o no, seguido de uno o     43/28
                           más dígitos, seguido del slash “/” seguido de uno o
                           más dígitos                                           2/78
                                                                                 -12/43
Componentes léxicos
                          Literales Caracter
   Lenguaje                          Patrón                      Ejemplos
  C, java, C#, Un símbolo del alfabeto                     ‘a’ ‘n’
  prolog, y    encerrado entre comillas                    ‘Z’
  otros        sencillas ‘. Algunos caracteres
                         especiales usan el símbolo        ‘b’ ‘t’
                         backslash 

  Pascal                 Un símbolo del alfabeto           “a” “z”
                         encerrado entre comillas dobles   “b”
                         “.
  Smalltalk              Un símbolo del alfabeto           $a $$
                         precedido por el signo $          $b
  Scheme                 Cualquier símbolo del alfabeto    #a
                         precedido por los símbolos #     #b
2 de diciembre de 2012
Componentes léxicos
       Literales Cadena
Lenguaje           Patrón               Ejemplos
C, java,   Cualquier conjunto de cero “Hola”
C#,        o más símbolos del alfabeto
           encerrados entre comillas    “Mundo”
prolog,    dobles “. Prolog permite     “Adios Mundo”
scheme y   cualquier conjunto de
otros      símbolos que no contengan
           espacios e inicien por letra
           minúscula.

a          Cualquier conjunto de cero ‘Hola Mundo’
           o más símbolos del alfabeto
           encerrados entre comillas
           sencillas ‘.
Componentes léxicos
                Literales Booleanos
  Lenguaje                  Patrón                  Ejemplos
Java, pascal,    Constante verdadera: true       true, false
smalltalk,       Constante falsa: false
visual basic     En smalltalk, en realidad son
                 objetos

Scheme           Constante verdadera: #t         #t, #f, ()
                 Constante false: #f ó ()

Lenguajes como C no tienen literales booleanas
Componentes léxicos
          Operadores Matemáticos
  Lenguaje                  Patrón                  Ejemplos
Casi todos los   Suma +, Resta -, multiplicación
lenguajes        *, División /

C, java          Incremento ++, Decremento --; Modulo %
                 No tiene operador de división entera
Pascal           Modulo MOD, División entera DIV


Visual Basic     Potenciación ^ División Entera
Componentes léxicos
          Operadores Relacionales
  Lenguaje                    Patrón                 Ejemplos
Casi todos los     Mayor que (>), Mayor o igual   >, <, >=, <=
lenguajes          (>=), menor que (<), menor o
                   igual (<=)
C, java            Diferente !=, igual ==
Pascal, prolog, Igual en pascal, prolog y scheme =, diferente en
smalltalk       pascal y prolog <>. En scheme es una función.

Smalltalk y scheme, no tienen operador para diferente,
Componentes léxicos


           Operadores Booleanos
  Lenguaje                  Patrón             Ejemplos
C, Java         And && ó &, Or || ó |, not !

Pascal          And AND Or OR not NOT


Lenguajes como prolog, scheme y smalltalk no tienen
operadores relacionales, sino métodos o funciones para esto
Componentes léxicos

           Operador de Asignación
    Lenguaje               Patrón              Ejemplos
C, java, visual     =                       a=10;
Basic, C#
Pascal, smalltalk   :=                      A:=10;

Prolog no tiene operador de asignación, pero tiene un
operador similar que es :-.
Scheme no tiene operadores de asignación
Componentes léxicos
        Operador de Concatenación
    Lenguaje             Patrón      Ejemplos
Java, C#       +                  a=“Hola “;
                                  b=“Mundo”;
                                  printf(“%s”,a+b);
Pascal, C      , coma             a=‘Hola ‘;
                                  b=‘Mundo’;
                                  write(a,b);
Visual Basic   &                  a=“Hola “
                                  b=“Mundo”
                                  Print a & b
PHP            . punto
Componentes léxicos


                      Separadores
. , ; .. ( ) { } [ ] : =
Componentes léxicos

               Espacios en Blanco
   Lenguaje                 Patrón             Ejemplos
En casi todos los lenguajes comprenden caracteres de Barra
espaciadora, Nueva línea, retorno de carro y tabulador
C, java            Nueva línea n
                   Retorno de carro f
                   Tabulador t
Visual Basic       Nueva Linea VBCR

Otros lenguajes utilizan funciones como char(Ascii) de pascal
que imprime el carácter de acuerdo con el codigo Ascii
ingresado
Componentes léxicos
                   Comentarios
      Existen comentarios de línea y de Bloque
    Lenguaje           Patrón            Ejemplos
C, java, muchos    Línea //
lenguajes          Bloque /*   */ /**   */
Pascal             Bloque { } ó (* *)
Prolog             Línea %
                   Bloque /* */
Visual Basic       Línea ‘

Smalltalk          Bloque “    “

Scheme             Línea ;
Notacion
• Los lenguajes son conjuntos de cadenas.

• Necesitamos alguna notación para
  especificar los conjuntos que necesitamos.

• Para el análisis léxico nos interesan los
  lenguajes regulares, que se pueden describir
  empleando expresiones regulares.
Expresiones regulares y
     lenguajes regulares
• Cada expresión regular representa una
  notación para un lenguaje regular (un
  conjunto de palabras).

• Si A es una expresión regular entonces
  escribimos L(A) para referirnos al
  lenguaje denotado por A

                      Elaboró: Dr. José Raymundo Marcial Romero
Expresiones Regulares
Expresiones Regulares (ER)
  => Especificación léxica
1. Seleccionar un conjunto de tokens
   –   Número, palabras reservadas, identificadores, …
1. Escribir una ER para los lexemas de cada token
   –   Números = digitos*
   –   Palabras reservadas = ´if´ | ´then´ | ´else´ | …
   –   Identificadores = letras (letras | digitos)*
   –   Parentesis que abre = ´(´
   –   …
Resumen
• Las expresiones regulares proveen una
  forma concisa para detectar cadenas.

• Su uso en analizadores léxicos requiere
  pequeñas extensiones.
  – Para resolver ambigüedades
  – Para manejar errores
Autómata finito
• Expresión Regular = Especificación.

• Autómata finito = implementación.

• Un autómata finito consiste de:
   –   Un alfabeto de entrada Σ
   –   Un conjunto de estados S
   –   Un estado inicial n
   –   Un conjunto de estados de aceptación F⊆S
   –   Un conjunto de transiciones estado→estado
Autómata finito
• Transición
                        s1 →a s2
• Se lee
  – En el estado s1 teniendo como entrada a "a"
    moverse al estado s2
• Estando al final de la entrada
  – Si el estado es de aceptación => aceptar, de otra
    forma => rechazar
  – Si no existe transición con símbolo "a" =>
    rechazar
Grafos de los estados de un
      Autómata finito
• Un estado

• Estado de inicio

• Estado de aceptación
                         a
• Una transición
Ejemplo
• Un autómata finito que acepte ¨1¨

                       1




Un autómata finito acepta una cadena si podemos
seguir las etiquetas de los arcos con los caracteres
de la cadena desde el estado de inicio hasta un
estado de aceptación
Otro Ejemplo
• Un autómata finito que acepta cualquier cantidad de
  1´s seguido de un 0.

• Alfabeto: 0,1


                    1

                        0




 Verificar que ¨1110¨ es aceptada pero no ¨111¨
Otro ejemplo
• Alfabeto {0,1}




 La operación del autómata no esta completamente
 definida por la entrada.
        En la entrada ¨11¨ el autómata puede estar en
        cualquier estado
Movimientos λ
• Otra clase de transición: movimientos λ


                         λ




  La máquina se puede mover del estado A al estado B
  sin leer símbolos de entrada.
Autómatas deterministas y
     No deterministas
• Autómatas Finitos Deterministas (AFD)
   – Una transición por entrada y por estado.
   – No hay movimientos λ.
• Autómatas Finitos No deterministas (AFN).
   – Puede tener más de una transición por entrada y por
     estado.
   – Puede tener movimientos λ.
• Autómata finito tiene memoria finita.
   – Necesita sólo codificar el estado actual.

Claselexico

  • 1.
  • 2.
    Introducción • "Una formasencilla de crear un analizador léxico consiste en la construcción de un diagrama que ilustren la estructura de los componentes léxicos del lenguaje fuente, y después hacer la traducción "a mano" del diagrama a un programa para encontrar los componente léxicos."
  • 3.
    Función del analizadorléxico • El análisis léxico o lineal (scanner), reconoce y clasifica todas las “palabras”, componentes léxicos o tokens de un código fuente. • El analizador léxico lee el código fuente caracter a caracter y vá armando uno a uno los componentes léxicos que después entregará al analizador sintáctico, cada que este le de la orden de enviarle el siguiente token. • El analizador léxico puede hacer tareas secundarias como: eliminar comentarios y espacios en blanco y relacionar los mensajes de error. 2 de diciembre de 2012
  • 4.
  • 5.
    Componentes léxicos, patronesy lexemas • Estos tres nombres tienen significado específico en análisis sintáctico. • En general hay un conjunto de cadenas de entrada para el cual se produce como salida el mismo componente léxico. • Este conjunto de cadenas se construye mediante una regla llamada patrón asociado al componente léxico.
  • 6.
  • 7.
    Análisis Léxico • ¿Qué queremos hacer? Ejemplo: If (i == j) z=0; else z=1; • La entrada es sólo una secuencia de caracteres: tif(i==j)nttz=0;ntelsenttz=1; Meta: Partir la cadena de entrada en subcadenas y clasificar las subcadenas de acuerdo a su role
  • 8.
    ¿Qué es untoken? • La salida del analizador léxico es un conjunto de tokens. • Un token es una categoría sintáctica – En Español: • Nombres, verbos, adjetivos, … – En un lenguaje de programación • Identificadores, Enteros, palabras reservadas, espacios en blanco, … • La siguiente etapa, toma los tokens. – Ejem. Los identificadores se tratan diferente que las palabras reservadas.
  • 9.
    Tokens • Los token corresponden a conjuntos de cadenas. • Identificadores:cadenas de letras o dígitos que comienzan con una letra. • Enteros: una cadena de dígitos. • Palabras reservadas: else, if, begin, … • Espacios en blanco: una secuencia de espacios, nuevas líneas, tabuladores. • Open par: un paréntesis izquierdo.
  • 10.
    Implementación del analizador léxico • Una implementación debe hacer dos cosas: – Reconocer las subcadenas que corresponden a tokens. – Regresar el valor o lexema de un token • El lexema es la subcadena.
  • 11.
    Ejemplo • Recordar: tif(i==j)nttz=0; ntelsenttz=1: • El par Token-lexema que regresa el analizador léxico: – (Espacio en blanco, ¨t¨ ) – (Palabra reservada, ¨if¨) – (Parentesis abre, ¨(¨) – (Identificador, ¨i¨) – (Relación, ¨==¨) – (Identificador, ¨j¨), etc – …
  • 12.
    Implementación del analizador léxico • El A. Léxico por lo regular descarta tokens que no son "importantes" tokens que no contribuyen a generar el árbol. • Ejemplos: Espacios en blanco, comentarios. • Pregunta: ¿Qué pasa si quitamos todos los espacios en blanco y comentarios antes de realizar el análisis léxico?
  • 13.
    Mirar por adelantado •Dos puntos importantes: – La meta final es particionar la cadena. Esto se implementa leyendo la cadena de izquierda a derecha, reconociendo un token a la vez. – Mirar por adelantado algunas veces se requiere para decidir donde finaliza un token y donde comienza el último token. i vs if = vs ==
  • 14.
    Además • Necesitamos – Una forma de describir los lexemas de cada token. – Una forma de resolver ambigüedades • ¿If describe dos variables? • ¿ == representa dos símbolos = y = ?
  • 15.
    Lenguajes Regulares • Existendiferentes formalismos para especificar tokens. • Los lenguajes regulares son los más populares. – Teoría simple y útil – Fácil de entender – Implementaciones eficientes.
  • 16.
    Lenguaje • Def. Sea∑un conjunto de caracteres. Un lenguaje sobre ∑ es un conjunto de cadenas tomadas desde ∑. • (∑ se conoce como el alfabeto)
  • 17.
    Ejemplo de lenguajes •Alfabeto = Caracteres • Alfabeto = ASCII del idioma inglés • Lenguaje = programas en C • Lenguaje = sentencias en inglés. • Nota. El conjunto de caracteres ASCII es • No todas las cadenas diferente que el en el alfabeto inglés conjunto de forman sentencias. caracteres inglés.
  • 18.
    Componentes léxicos Identificadores Lenguaje Patrón Ejemplos C, Pascal, Java, Inician con letra y pueden X1, r_23 C# y casi todos ir seguidos de letras, los lenguajes dígitos o carácter subrayado PHP Inician con $ y van $x, $_POST seguidos de letras o dígitos Prolog Inician con letra, seguidas Nombre de létras o dígitos o _. primo(X) Mayúsculas nombre de variable Minúsculas nombre de predicado
  • 19.
    Componentes léxicos Literales Numéricos Enteros, reales, reales con notación científica. Lenguaje Patrón Ejemplos Todos Enteros: Inician con signo opcional y va seguido de -1223 uno o más dígitos 99882 Reales: Inician con signo opcional y van seguido de 12.323 uno o más dígitos y opcional seguido de un punto y uno o más dígitos. -44.53421 Reales con notación científica: Inicia con signo -32.3e-19 opcional, y van seguidos de uno o más dígitos, seguido de punto “.”, seguido de uno o más dígitos, 7.4e+12 seguido de “E” seguido del signo + ó – opcional y -9.1e10 seguido de uno o más dígitos. Smalltalk, Scheme otros Fraccion: inicia por signo o no, seguido de uno o 43/28 más dígitos, seguido del slash “/” seguido de uno o más dígitos 2/78 -12/43
  • 20.
    Componentes léxicos Literales Caracter Lenguaje Patrón Ejemplos C, java, C#, Un símbolo del alfabeto ‘a’ ‘n’ prolog, y encerrado entre comillas ‘Z’ otros sencillas ‘. Algunos caracteres especiales usan el símbolo ‘b’ ‘t’ backslash Pascal Un símbolo del alfabeto “a” “z” encerrado entre comillas dobles “b” “. Smalltalk Un símbolo del alfabeto $a $$ precedido por el signo $ $b Scheme Cualquier símbolo del alfabeto #a precedido por los símbolos # #b 2 de diciembre de 2012
  • 21.
    Componentes léxicos Literales Cadena Lenguaje Patrón Ejemplos C, java, Cualquier conjunto de cero “Hola” C#, o más símbolos del alfabeto encerrados entre comillas “Mundo” prolog, dobles “. Prolog permite “Adios Mundo” scheme y cualquier conjunto de otros símbolos que no contengan espacios e inicien por letra minúscula. a Cualquier conjunto de cero ‘Hola Mundo’ o más símbolos del alfabeto encerrados entre comillas sencillas ‘.
  • 22.
    Componentes léxicos Literales Booleanos Lenguaje Patrón Ejemplos Java, pascal, Constante verdadera: true true, false smalltalk, Constante falsa: false visual basic En smalltalk, en realidad son objetos Scheme Constante verdadera: #t #t, #f, () Constante false: #f ó () Lenguajes como C no tienen literales booleanas
  • 23.
    Componentes léxicos Operadores Matemáticos Lenguaje Patrón Ejemplos Casi todos los Suma +, Resta -, multiplicación lenguajes *, División / C, java Incremento ++, Decremento --; Modulo % No tiene operador de división entera Pascal Modulo MOD, División entera DIV Visual Basic Potenciación ^ División Entera
  • 24.
    Componentes léxicos Operadores Relacionales Lenguaje Patrón Ejemplos Casi todos los Mayor que (>), Mayor o igual >, <, >=, <= lenguajes (>=), menor que (<), menor o igual (<=) C, java Diferente !=, igual == Pascal, prolog, Igual en pascal, prolog y scheme =, diferente en smalltalk pascal y prolog <>. En scheme es una función. Smalltalk y scheme, no tienen operador para diferente,
  • 25.
    Componentes léxicos Operadores Booleanos Lenguaje Patrón Ejemplos C, Java And && ó &, Or || ó |, not ! Pascal And AND Or OR not NOT Lenguajes como prolog, scheme y smalltalk no tienen operadores relacionales, sino métodos o funciones para esto
  • 26.
    Componentes léxicos Operador de Asignación Lenguaje Patrón Ejemplos C, java, visual = a=10; Basic, C# Pascal, smalltalk := A:=10; Prolog no tiene operador de asignación, pero tiene un operador similar que es :-. Scheme no tiene operadores de asignación
  • 27.
    Componentes léxicos Operador de Concatenación Lenguaje Patrón Ejemplos Java, C# + a=“Hola “; b=“Mundo”; printf(“%s”,a+b); Pascal, C , coma a=‘Hola ‘; b=‘Mundo’; write(a,b); Visual Basic & a=“Hola “ b=“Mundo” Print a & b PHP . punto
  • 28.
    Componentes léxicos Separadores . , ; .. ( ) { } [ ] : =
  • 29.
    Componentes léxicos Espacios en Blanco Lenguaje Patrón Ejemplos En casi todos los lenguajes comprenden caracteres de Barra espaciadora, Nueva línea, retorno de carro y tabulador C, java Nueva línea n Retorno de carro f Tabulador t Visual Basic Nueva Linea VBCR Otros lenguajes utilizan funciones como char(Ascii) de pascal que imprime el carácter de acuerdo con el codigo Ascii ingresado
  • 30.
    Componentes léxicos Comentarios Existen comentarios de línea y de Bloque Lenguaje Patrón Ejemplos C, java, muchos Línea // lenguajes Bloque /* */ /** */ Pascal Bloque { } ó (* *) Prolog Línea % Bloque /* */ Visual Basic Línea ‘ Smalltalk Bloque “ “ Scheme Línea ;
  • 31.
    Notacion • Los lenguajesson conjuntos de cadenas. • Necesitamos alguna notación para especificar los conjuntos que necesitamos. • Para el análisis léxico nos interesan los lenguajes regulares, que se pueden describir empleando expresiones regulares.
  • 32.
    Expresiones regulares y lenguajes regulares • Cada expresión regular representa una notación para un lenguaje regular (un conjunto de palabras). • Si A es una expresión regular entonces escribimos L(A) para referirnos al lenguaje denotado por A Elaboró: Dr. José Raymundo Marcial Romero
  • 33.
  • 34.
    Expresiones Regulares (ER) => Especificación léxica 1. Seleccionar un conjunto de tokens – Número, palabras reservadas, identificadores, … 1. Escribir una ER para los lexemas de cada token – Números = digitos* – Palabras reservadas = ´if´ | ´then´ | ´else´ | … – Identificadores = letras (letras | digitos)* – Parentesis que abre = ´(´ – …
  • 35.
    Resumen • Las expresionesregulares proveen una forma concisa para detectar cadenas. • Su uso en analizadores léxicos requiere pequeñas extensiones. – Para resolver ambigüedades – Para manejar errores
  • 36.
    Autómata finito • ExpresiónRegular = Especificación. • Autómata finito = implementación. • Un autómata finito consiste de: – Un alfabeto de entrada Σ – Un conjunto de estados S – Un estado inicial n – Un conjunto de estados de aceptación F⊆S – Un conjunto de transiciones estado→estado
  • 37.
    Autómata finito • Transición s1 →a s2 • Se lee – En el estado s1 teniendo como entrada a "a" moverse al estado s2 • Estando al final de la entrada – Si el estado es de aceptación => aceptar, de otra forma => rechazar – Si no existe transición con símbolo "a" => rechazar
  • 38.
    Grafos de losestados de un Autómata finito • Un estado • Estado de inicio • Estado de aceptación a • Una transición
  • 39.
    Ejemplo • Un autómatafinito que acepte ¨1¨ 1 Un autómata finito acepta una cadena si podemos seguir las etiquetas de los arcos con los caracteres de la cadena desde el estado de inicio hasta un estado de aceptación
  • 40.
    Otro Ejemplo • Unautómata finito que acepta cualquier cantidad de 1´s seguido de un 0. • Alfabeto: 0,1 1 0 Verificar que ¨1110¨ es aceptada pero no ¨111¨
  • 41.
    Otro ejemplo • Alfabeto{0,1} La operación del autómata no esta completamente definida por la entrada. En la entrada ¨11¨ el autómata puede estar en cualquier estado
  • 42.
    Movimientos λ • Otraclase de transición: movimientos λ λ La máquina se puede mover del estado A al estado B sin leer símbolos de entrada.
  • 43.
    Autómatas deterministas y No deterministas • Autómatas Finitos Deterministas (AFD) – Una transición por entrada y por estado. – No hay movimientos λ. • Autómatas Finitos No deterministas (AFN). – Puede tener más de una transición por entrada y por estado. – Puede tener movimientos λ. • Autómata finito tiene memoria finita. – Necesita sólo codificar el estado actual.