TEMA 1. ANÁLISIS LÉXICO PROCESADORES DE LENGUAJES 4o Informática http://ccia.ei.uvigo.es/docencia/PL 1 de octubre de 2007 – FJRP 2007 ccia PL – 1.1 Algoritmo de Brzozowski Construye Autómatas Finitos Deterministas (AFD) a partir de Expresiones Regulares (ER) Basado en el concepto de derivación de una expresión regular Derivación de una Expresión Regular La derivación de una ER E respecto a un sı́mbolo a ∈ Σ (notado a−1 [E]) es la nueva expresión regular que resulta de suprimir el terminal a de todas las cadenas del lenguaje L(E) que comiencen por a. Ejemplo: Para la ER E = abba + ba + aa∗ c, tenemos el lenguaje L(E) = {abba, ba, ac, aac, aaac, ...}, resultando la derivación respecto a a, a−1 [E] = bba + a∗ c Definición (Función Auxiliar δ(E)) Siendo E una ER, se define δ(E) = 1 0 si ε ∈ L(E) en otro caso Utilidad: Notación utilizada para indicar si una ER es capaz de generar la cadena vacı́a, ε. En los cálculos el valor 0 se hará corresponder con la ER del conjuntos vacı́o (Φ) El valor 1 se corresponderá con la ER del conjunto formado por la cadena vacı́a {ε} Se usarán las siguientes equivalencias: 0=Φ 1 = {ε} – FJRP 2007 ccia PL – 0+E ≡E ≡E+0 0·E ≡0≡E·0 1+E ≡E ≡E+1 1·E ≡E ≡1·E 1 Reglas para el cálculo de δ(E): δ(Φ) = 0 (ó δ(0) = 0) δ(ε) = 1 (ó δ(1) = 1) δ(a) = 0 ∀a ∈ Σ δ(E1 + E2 ) = δ(E1 ) + δ(E2 ) δ(E1 · E2 ) = δ(E1 ) · δ(E2 ) δ(E1∗ ) = 1 δ(E1+ ) = δ(E1 ) Definición (Derivación de una Expresion Regular) Dada una expresión regular E y un sı́mbolo a ∈ Σ, se define recursivamente la derivación a−1 [E] mediante las siguientes reglas: a−1 [ε] = 0 a−1 [Φ] = 0 a−1 [a] = 1 a−1 [b] = 0 ∀b 6= a a−1 [E1 + E2 ] = a−1 [E1 ] + a−1 [E2 ] a−1 [E1 · E2 ] = a−1 [E1 ] · E2 + δ(E) · a−1 [E2 ] ˆ ˜ a−1 E1∗ = a−1 [E1 ] · E1∗ Propiedades: La derivación a−1 [E] es compatible con los operadores ”∩” (intersección) y ”\” (diferencia). −1 a −1 [E ∩ F ] = a −1 [E] ∩ a −1 [F ] , a −1 [E \ F ] = a −1 [E] \ a [F ] Extensión a cadenas: Siendo E una ER, dada una cadena w ∈ Σ∗, se define la derivación de E respecto a w de la forma: w −1 ( [E] = – FJRP 2007 ccia PL – E si w = ε h i −1 −1 a x [E] si w = x · a, con a ∈ Σ 2 1.1.2 Funcionamiento Idea básica: Cada uno de los estados del AFD resultante se corresponderá con la ER asociada a cada derivación posible. Se establecerá una transición etiquetada con el terminal ”a” entre un estado asociado a una ER E y el estado asociado a la ER a−1 [E], si a−1 [E] 6= 0. Se puede demostrar que el conjunto de derivaciones de una ER E es finito. • Siempre será posible comprobar la equivalencia de las ER asociadas a 2 derivaciones distintas (existe un algoritmo) E ≡ F ⇔ L(E) = L(F ) • Con ello se garantiza la convergencia del método de Brzozowski. Algoritmo de Brzozowski Entrada: Una ER E Salida: Un AFD A que reconoce las cadenas de la ER E Paso 1: Identificación de los estados del AFD Calcular todas las derivaciones posibles de la ER de partida, E , respecto a los sı́mbolos a ∈ Σ. Calcular iterativamente las derivaciones respecto a a ∈ Σ de las ER asociadas a las derivaciones que vayan surgiendo. Parar cuando no se generen derivaciones nuevas. Paso 2: Establecimiento de transiciones Enlazar el estado asociado a la ER F con el asociado a a−1 [F ] con un arco etiquetado ”a”. Paso 3: Identificación de estado inicial y estados finales Estado inicial: el asociado a la ER de partida E . Estados finales: aquellos estados cuya ER asociada pueda generar ε. – FJRP 2007 ccia PL – 3 Ejemplo: Construcción de un AFD que reconozca la ER E = (ab + b)∗ba – FJRP 2007 ccia PL – 4 1.1.3 Ventajas e inconvenientes Ventajas: Simplidad, sólo usa el concepto de derivacion (x−1 [E]). Aplicable a ER definidas mendiante los operadores ”∩” (intersección) y ”\” (diferencia). Inconvenientes: Para cada nueva derivación calculada debe comprobarse la equivalencia de la ER resultante con cada una de las derivaciones anteriores. • Necesario para asegurar la convergencia del algoritmo. • Puede hacerse, pero es costoso. – FJRP 2007 ccia PL – 5 1.2 Algoritmo de McNaugthon&Yamada Construye Autómatas Finitos No Deterministas (AFN) a partir de Expresiones Regulares (ER) • Podrán determinizarse a posteriori. Basado en el concepto de continuación de una Expresión Regular Trabaja con Expresiones Regulares Marcadas Definición (Expresión Regular Marcada) Siendo E una ER, la Expresion Regular Marcada, E 0, obtenida a partir de E , viene dada por la incorporación de un subı́ndice distinto a cada sı́mbolo a ∈ Σ que aparece en E . Ejemplo: A partir de E = (ab + b)∗ ba, se obtiene la ER marcada E 0 = (a1 b2 + b3 )∗ b4 a5 Objetivo: Asegurar que todos los sı́mbolos terminales en E 0 son distintos. – FJRP 2007 ccia PL – 6 1.2.1 Idea base Funcionamiento general: E0 −→ A0 −→ A −→ D exp. reg. marcada (1) AFD marcado (2) AFN sin marcas en transiciones (3) AFD sin marcas en transciones −→ E exp. reg. inicial • (1) algoritmo de construcción del AFD marcado (MacNaughton&Yamada ó Berry&Sethi) • (2) eliminar las marcas de los sı́mbolos en las transiciones • (3) algoritmo de determinización del AFN. 0 El algoritmo McNaugthon&Yamada construye un AFD A mediante el cálculo de derivaciones sobre la ER marcada E 0. • En este caso se hablará del continuaciones de sı́mbolos. El uso de ER con sı́mbolos marcados evita tener que comprobar la equivalencia de las derivaciones calculadas. • Dado que todos los sı́mbolos en la ER marcada E 0 son distintos, se puede demostrar que todas las derivaciones respecto a sı́mbolos ˆ ˜ marcados (a−1 E 0 ) serán también distintas. i Definición (Continuación de un sı́mbolo ”a” en una ER marcada E 0) Siendo E 0 una ER con todos sus sı́mbolos marcados y siendo a ∈ Σ uno de esos sı́mbolos, se define la continuación de a en 0 E 0 (notación CaE ) como la expresión (wa)−1E 0 6= Φ. Nota: El marcado no es compatible con los operadores ”∩” (intersección) y ”\” (diferencia). Es decir, siendo E 0 y F 0 las ER marcadas asociadas a e y F , tenemos que E ∩ F 6= E 0 ∩ F 0 y E \ F 6= E 0 \ F 0. Ejemplo: Para E = ab∗ y F = a tenemos E 0 = a1b∗2 y F = a3, verificándose: E ∩ F = a 6= Φ = E 0 ∩ F 0 – FJRP 2007 ccia PL – y E \ F = abb∗ 6= a1 b∗2 = E 0 \ F 0 7 Consecuencias: • Dado que todos los sı́mbolos en la ER marcada E 0 son distintos (y aparecen sólo una vez), se deduce que todas las derivaciones de ”a” que se calculen en E 0 serán necesariamente equivalentes (esto es: (w1a)−1E 0 ≡ (w2a)−1E 0 ≡ (w3a)−1E 0 ≡ ... ∀wj ). • Estas continuaciones darán lugar a los estados del AFD marcado M 0. – FJRP 2007 ccia PL – 8 1.2.2 Funcionamiento Algoritmo de McNaugthon&Yamada Entrada: Una ER E Salida: Un AFN A que reconoce las cadenas de la ER E Paso 1: Marcado de la ER E Paso 2: Identificación de los estados del AFD marcado Crear un estado por cada sı́mbolo presente en la ER marcada E 0 , más un estado inicial q0 . Paso 3: Establecimiento de transiciones Calcular las continuaciones en E 0 de cada sı́mbolo de la ER marcada. • Construir las posibles derivaciones de sı́mbolos marcados sobre E 0 ◦ serán los sı́mbolos que puedan aparecer al comienzo de las cadenas de E 0 • Crear un arco etiquetado desde el estado inicial q0 hasta el estado correspondiente a ese sı́mbolo marcado. Sobre las derivaciones asociadas a los estados no inicial: • Construir sus posibles derivaciones de sı́mbolos marcados ◦ serán los sı́mbolos por los que pueden empezar las cadenas de esa derivación • Crear un arco etiquetado hacia el estado (=sı́mbolo) implicado. Terminar cuando se hayan calculado las derivaciones de todos los estados (=sı́mbolos marcados) Paso 4: Identificación de estado inicial y estados finales Estado inicial: estado q0 Estados finales: estados (=sı́mbolos) cuya continuación sea ε Paso 5: Eliminar las marcas en las etiquetas de las transiciones Normalmente resultará un AFN, que habrá que determinizar si se desea. – FJRP 2007 ccia PL – 9 Ejemplo: Construcción de un AFN que reconozca la ER E = (ab + b)∗ba – FJRP 2007 ccia PL – 10 1.2.3 Ventajas e inconvenientes Ventajas: El número de derivaciones necesarias para calcular las continuaciones está predeterminado (en Brzozowski no se conoce a priori) • Habrá una derivación/continuación para cada uno de los sı́mbolos en la ER marcada El concepto de derivación junto con el uso de ER marcadas (sus sı́mbolos son únicos) evita tener que efectuar el test de equivalencia entre ER para las derivaciones calculadas (en Brzozowki era necesario para evitar la repetición de estados) Inconvenientes: No es compatible con los operadores ”∩” (intersección) y ”\” (diferencia) (en ocasiones facilitan especificar ER complejas) Al eliminar los ı́ndices de las transiciones se obtiene un AFN que normalmente será necesario determinizar. – FJRP 2007 ccia PL – 11 1.3 Algoritmo de Berry&Sethi Evolución del algoritmo de McNaugthon&Yamada. Construye Autómatas Finitos No Deterministas (AFN) a partir de Expresiones Regulares (ER) • Podrán determinizarse a posteriori. Trabaja con Expresiones Regulares Marcadas Evita calcular explı́citamente el conjunto de continuaciones. Basado en la utilziación de los conjuntos f irst y f ollow 1.3.1 Idea base Se trata de una mejora sobre el método de McNaugthon&Yamada. Se basa ˆ 0˜en la observación de que las continuaciones calculadas −1 (ai E ) se utilizan únicamente para determinar las transiciones desde el estado ai, en función de los sı́mbolos que puedan aparecer al principio de las cadenas generadas por esa continuación El algoritmo de Berry&Sethi evita tener que realizar el cálculo de esas continuaciones. En su lugar, se calcula previamente de forma estática que sı́mbolos bj pueden ir a continuación de un sı́mbolo ai dado en las cadenas generadas por E 0. Se introducen los conjuntos f irst(E) y f ollow(E, a) – FJRP 2007 ccia PL – 12 Definición (Conjuntos f irrt(E) y f ollow(E, a)) Siendo E una expresión regular, dado un sı́mbolo a ∈ Σ, definimos: f irst(E) = {a | aw ∈ L(E)} f ollow(E, a) = {b | vabw ∈ L(E)} De este modo, se verifica la siguiente propiedad: • Si CaE es la continuación de ”a” en E ⇒ f irst(CaE ) = f ollow(E, a) Nota: Se utilizará el sı́mbolo a como marca de fin de entrada (EOF : end of file) • Siempre se podrá asegurar que: f ollow(E· a, a) = {a} ⇔ ”a” es el último sı́mbolo en una cadena generada por E – FJRP 2007 ccia PL – 13 1.3.2 Funcionamiento Idea básica: A partir de las definiciones de f irst(E 0) y f ollow(E 0, a) se llega al principio de funcionamiento del método de Berry&Sethi. Si x ∈ f irst(E 0) ⇒ establecer una transición desde el estado inicial q0 al estado x. Si y ∈ f ollow(E 0, x) ⇒ establecer una transición desde el estado x al estado y . (a) Cálculo del conjunto f irst Dada una ER E , el conjunto f irst viene dado por las siguientes reglas recursivas: f irst(0) = Φ f irst(1) = Φ f irst(a) = a f irst(E1 + E2 ) = f irst(E1 ) ∪ f irst(E2 ) f irst(E1 · E2 ) = f irst(E1 ) ∪ f irst(δ(E1 ) · E2 ) f irst(E1∗ ) = f irst(E1 ) (b) Cálculo de los conjuntos f ollow Se usará la función auxiliar F para formalizar el mecanismo de cálculo de los conjuntos f ollow Definición (Función auxiliar F) Dada una ER E y un sı́mbolo b ∈ Σ, definimos F(E, b) = {[a, f ollow(E · b, a)]} ∀a ∈ Σ – FJRP 2007 ccia PL – 14 Intuitivamente, la función F asocia a cada sı́mbolo a ∈ Σ el conjunto de sı́mbolos que pueden ir inmediatamente después de a en las cadenas generadas por la ER E · b. El sı́mbolo b juega el papel de ”marcador” del final de las cadenas de E . En la práctica calcularemos la función F(E, a), que asociará a cada sı́mbolo de E sus conjuntos f ollow. Dada una ER E y un conjunto de ”marcadores” S , el cálculo de F(E, S) viene dado por las siguientes reglas recursivas: F(0, S) = Φ F(1, S) = Φ F(a, S) = {[a, S]} F(E1 + E2 , S) = F(E1 , S) ∪ F(E2 , S) F(E1 · E2 ) = F(E1 , f irst(E2 ) ∪ δ(E2 ) · S) ∪ F(E2 , S) F(E1∗ , S) = F(E1 , f irst(E1 ) ∪ S) (S sigue a ”a” en aS ) Ejemplo: Cáculo de F(E 0, a) para la ER marcada E 0 = (a1b2 + b3)∗b4a5 – FJRP 2007 ccia PL – 15 Algoritmo de Berry&Sethi Entrada: Una ER E Salida: Un AFN A que reconoce las cadenas de la ER E Paso 1: Marcado de la ER E Paso 2: Identificación de los estados del AFD marcado Crear un estado por cada sı́mbolo presente en la ER marcada E 0 , más un estado inicial q0 . Paso 3: Establecimiento de transiciones Calcular el conjunto f irst(E 0 ) y la función F(E 0 , a) Establecer una transición desde el estado inicial q0 a los estados de los sı́mbolos en f irst(E 0 ) Establecer una transición desde el estado a a los estados de los sı́mbolos en f ollow(E 0 , a) Paso 4: Identificación de estado inicial y estados finales Estado inicial: estado q0 Estados finales: aquellos estados a para los que a ∈ f ollow(E 0 , a) Si les sigue el sı́mbolo EOF (”a”) ⇒ ha acabado la expresión E 0 Paso 5: Eliminar las marcas en las etiquetas de las transiciones Normalmente resultará un AFN, que habrá que determinizar si se desea. Ejemplo: Construcción de un AFN que reconozca la ER E = (ab + b)∗ba – FJRP 2007 ccia PL – 16