Compiladores - Lenguajes Formales y Gramática

14
1 UNIVERSIDAD NACIONAL DE TRUJILLO ESCUELA DE INFORMATICA COMPILADORES Las Estructuras Formales: Lenguajes Formales y Gramática ALVAREZ ALVAREZ, GUSTAVO ALEXANDER

description

En Este Texto se estudian las mas importantes estructuras minimas de todo compilador: Lenguaje Formal y las Gramaticas. Para llegar a este concepto es necesario definir antes otras nociones más elementales.

Transcript of Compiladores - Lenguajes Formales y Gramática

1

UNIVERSIDAD NACIONAL DE TRUJILLO ESCUELA DE INFORMATICA 

COMPILADORES Las Estructuras Formales: Lenguajes Formales y Gramática 

ALVAREZ ALVAREZ, GUSTAVO ALEXANDER

2

1. INTRODUCCION

Uno de los conceptos más importantes de este texto es el de Lenguaje. Para llegar a este concepto es necesario definir antes otras nociones más elementales. Para todas las definiciones utilizaremos extensivamente la teoría elemental de conjuntos.

2. SÍMBOLOS Un “símbolo” es una entidad abstracta que no definiremos, de la misma manera que los conceptos “punto” y “línea”, no se definen en geometría. Las letras y los dígitos son ejemplos de símbolos usados con frecuencia.

3. CADENA DE CARACTERES

Una cadena (o palabra) es una secuencia finita de símbolos yuxtapuestos. Por mencionar a, b y c son símbolos, y abcb es una cadena. La longitud de una cadena w, que se denota como w , es el numero de símbolos que componen la cadena. Por ejemplo, abcb tiene longitud 4.

Las cadenas de caracteres son llamadas también palabras. La longitud de una palabra es la cantidad de letras que contiene, contando las repeticiones; se denota por w para una palabra w .

Por ejemplo, perro es 5 Un caso particular es la cadena vacía, denotada por ε , es la cadena que consiste en cero símbolos. Por tanto 0ε = . Los prefijos de una cadena están formados por los primeros símbolos de esta; y los sufijos, por los últimos. Por ejemplo, la cadena abc tiene como prefijos: a, ab y abc; sus sufijos son ε , c ,bc y abc . Un prefijo o sufijo de una cadena que no sea la misma cadena es un prefijo o sufijo propios.

3.1.1. Operaciones Con el fin de manipular las cadenas es conveniente introducir varias operaciones Para las cadenas

1 2

1 2

h

k

x a a ay b b b==

……

La concatenación es definido como

1 2 1 2. h kx y a a a b b b= … …

Se puede obviar el punto, solo escribiendo xy en lugar de .x y . Esta operación es esencial para los lenguajes formales y además desempeña la funciona de la teoría de números.

Ejemplo: Sean las cadenas: , ,x gel y a z tina= = = Luego obtendremos

3

xy gelayx agel xy== ≠

( ) . ( ) .xy z gela tina x yz gel atina gelatina= = = =

3.1.2. Cadenas Vacías Es útil introducir el concepto de cadenas vacía (o nula), denotadas por la letra griega Epsilon ε , como la única cadena de la satisfacción de la identidad xe ex x= = . Para cada cadena x, por propiedad de la igualdad una cadena vacía tiene longitud cero:

0ε = Desde una perspectiva algebraica, la cadena vacía es un elemento neutral con respecto a la concatenación, porque ninguna cadena se vería afectada por concatenar a ε hacia su derecha o izquierda. La cadena vacía no debe de confundirse con el conjunto vacío: el factor ∅ de hecho que no contiene alguna cadena, mientras que el conjunto { }ε contiene una, la cadena vacía.

3.1.3. Subcadenas

Tenemos x uyv= de alguna concatenación, posiblemente vacía, cuyas cadenas son u , y , v . Además y es una subcadena de x , además u es prefijo de x, y v es sufijo de x. Una subcadena (prefijo, sufijo) es llamado propia si no coincide con la cadena x . Tenemos x como una cadena de al menos una longitud k , 1x k≥ ≥ . La notación

( )kIni x denota el prefijo u de x teniendo como longitud k o longitud inicial k.

Ejemplo: La cadena x aabacba= contiene los siguientes componentes: prefijo: , , , , , ,a aa aab aaba aabac aabacb aabacba sufijo: , , , , , ,a ba cba acba bacba abacba aabacba subcadenas: todos los prefijos y sufijos y las cadenas internas como , , , ,a ab ba bacb…

4. ALFABETO

Un alfabeto es un conjunto no vació de símbolos, es también un conjunto finito de elementos llamados símbolos finales o caracteres. Así el alfabeto del idioma español { , , ,...., }a b c z=∑ , es solo uno de tantos alfabetos

posibles. En general utilizaremos la notación ∑ para representar un alfabeto. Con los símbolos de un alfabeto es posible formar secuencias o cadenas de caracteres, tales como mxzzptlk ,balks , r ,etc. Cuando escribimos varias palabras o caracteres uno a continuación de otro, se supone que forman una sola palabra (se concatenan). La notación usada para denotar la concatenación de dos cadenas α y β es αβ . Por ejemplo, si w abra= y v cada= , entonces wvabra es la palabra .abracadabra

La concatenación de palabras es asociativa, esto es ( ) ( )xy z x yz= , pero no conmutativa en el caso general. La longitud de una concatenación cumple la propiedad: .uv u v= +

4

La concatenación de dos cadenas es la cadena que se forma al escribir la primera seguida de la segunda, sin que haya espacio entre ellas. Por ejemplo, la concatenación de perro y casa es perrocasa . La yuxtaposición se utiliza como el operador de concatenación. Esto es, si w y x son cadenas, entonces wx es la concatenación de estas dos cadenas. La cadena vacía es la identidad para el operador de concatenación. Es decir ew we w= = para cada cadena w. La secuencia 1 2 3{ , , ,...., }ka a a a∑ será nuestro alfabeto con k elementos, el cual tendrá una

cardinalidad k∑ = . Una palabra (también llamado string) es una secuencia de caracteres.

Ejemplo: Tomar el Alfabeto { , }a b∑ . Algunas cadenas serian: aaa, aaba , aaab, ba.

5. LENGUAJE FORMAL Un lenguaje formal es un conjunto de cadenas de símbolos tomados de algún alfabeto. El conjunto vació ∅ , y el conjunto formado por la cadena vacía { }ε son lenguajes. Nótese que son diferentes: el ultimo tiene elemento, mientras que le primero no. El conjunto de palíndromos (cadenas que se leen igual de izquierda a derecha o viceversa) sobre el alfabeto {0,1} es un lenguaje infinito. Algunos elementos de este lenguaje son ε 0, 1, 00, 11, 010 y 1101011. Una palabra v es subcadena de otra w cuando existen cadenas x , y - posiblemente vacías tales que xvy w= . Por ejemplo, “bora ” es subcadena de “ vibora ”, y ε es subcadena de toda palabra.

Un lenguaje es un conjunto de cadenas sobre un alfabeto específico. Ejemplo:

1

2

3

{ , }{ , }{ , , , ,...., ,....}

L aa aaaL aba aabL ab ba aabb abab aaabb

===

cadenas conformadas con “a” y “b”.

Teniendo un lenguaje, las cadenas que pertenezcan a este se les llama oración o frase. Así 3aabb aL∈ es una oración de 3L , mientras que 3abb L∉ es una cadena incorrecta. La cardinalidad o el tamaño de un lenguaje es el número de frases que contiene.

Ejemplo:

2 { , } 2L aba aab= = Si la cardinalidad es finita, al lenguaje también se le denomina finito, caso contrario si el número de cadenas no tiene límite al lenguaje se le denominara infinito. Para ilustrar L1 y L2 son lenguajes finitos y L3 es lenguaje infinito.

Se puede observar que un lenguaje finito es esencialmente una colección de palabras muchas veces llamado vocabulario. Un lenguaje infinito especial es el conjunto vació o el lenguaje Ø el cual no contiene frase alguna 0∅ = . Por lo general cuando una lengua tiene un solo elemento se omite las llaves al

denotar los elementos { }abb abb= .

5

Es conveniente introducir la notación

bX , donde b es el número de caracteres presentes en

una cadena X. Ejemplo:

2

2

0

a

a

c

aab

aba

baa

=

=

=

La longitud x de una cadena x es el número de caracteres que contiene.

Ejemplo: 2

4

ab

abaa

=

=

Sean dos Cadenas: 1 2

1 2

........

h

k

x a a ay b b b==

Son iguales si se cumple que h k= y i ia b= , para todo 1,2,...., .i h= En palabras, al examinar las cadenas de izquierda a derecha sus respectivos caracteres coinciden. Así se obtendrá:

aba baabaa ba

≠≠

5.1. Operaciones

a) Iteración, Cierre o Clausura del Lenguaje

El cierre de un lenguaje L (o cerradura de Kleene) se representa por *L y se define como:

2 31* i

iL L L L L∞== ∪ ∪ ∪ = ∪…

Clausura Positiva Se representa por L+ y se define como:

1i

iL L+ ∞== ∪

2 3

1i

iL L L L L+ ∞== ∪ ∪ ∪ = ∪…

Ninguna clausura positiva contiene a λ , si Lλ ∉ Como Σ es un lenguaje sobreΣ , la clausura positiva de Σ será:

1 ( ) { }ii W λ+ ∞=∑ = ∪ ∑ = ∑ −

6. GRAMÁTICA

El paradigma formal más famoso y rápidamente desarrollado para la caracterización de lenguajes, es el derivado del concepto de gramática generativa de Noam Chomsky. En Chomsky este celebérrimo lingüista norteamericano que intentó formalizar los lenguajes naturales, partiendo de que un lenguaje L es un subconjunto de todas las secuencias (finitas o

6

no), que podemos formar mediante la concatenación de los elementos de un alfabeto ∑ , define la gramática mediante la cuaterna siguiente:

7

6.1. Representación de Gramáticas

Para la representación de una gramática utilizaremos la BNF. La BNF (Backus Normal Form, Backus-Naur Form, en homenaje a Backus, su creador y a Naur, su continuador), es un metalenguaje muy utilizado para definir la estructura sintáctica de lenguajes de programación (lenguajes formales). La forma de Backus-Naur fue creada para definir la escritura sintáctica del lenguaje de programación ALGOL60. Las notaciones BNF, reducen el número de reglas necesarias. Para ello, utilizan los siguientes metasímbolos:

Traduciendo esta notación infija a prefija, se gana en facilidad de procesamiento pero no en facilidad de escritura (hay que escribir más).

8

Cuadro 6.1 Gramática de la Notación BNF Consideremos la construcción de frases del español mediante la aplicación de reglas gramaticales, tal vez un poco arbitrarias, pero que sirven para el propósito que tenemos.

Ejemplo, la oración: Susana y Pepe comen muchas manzanas

La podemos ver como constituida de dos constituyentes principales sujeto predicado

Susana y Pepe comen muchas manzanas La construcción de la oración la podemos dar con la siguiente regla gramatical: 1. oración sujeto predicado→

La regla nos dice que una expresión de tipo oración puede reescribirse como (ser sustituida

por, o se define como) una expresión de tipo sujeto seguida de una expresión de tipo

predicado .

Usamos la notación de encerrar entre lo que constituyen clases o tipos de expresiones, para diferenciarlas de lo que forma parte del lenguaje. Otras reglas que podemos intuir de la oración anterior son: 2.

3.

4.

sujeto frnominal

frnominal sustantivo

frnominal sustantivo conjunción frnominal

La regla (2) nos dice que una frase tipo sujeto puede ser sustituida por una frase de tipo

frnominal y las reglas (3) y (4) dicen que una frnominal puede tomar una de dos

formas: sustantivo o bien sustantivo conjunción frnominal . Como se puede ver, la regla (4) define una frase en términos de si misma. A esto se le llama la propiedad recursiva de las gramáticas, y es precisamente la que permite una representación finita de una colección infinita. El sujeto de la oración del ejemplo se genera mediante una utilización (aplicación) de las reglas (2), (4) y (3) en ese orden y una aplicación de las siguientes reglas: 5.

6.

7.

conjunción y

sustantivo Susana

sustantivo Pepe

Obteniéndose las siguientes etapas por la que pasa la cadena:

9

A la parte izquierda de estas líneas, las que describen las distintas etapas de la oración o frase se les llama forma sentencial, y en conjunto forman lo que se llama una derivación. Cada una de las formas senténciales de una derivación se obtiene a partir de la anterior mediante la aplicación de alguna regla. Muchas veces es posible representar la derivación por un diagrama de árbol. Para completar el ejemplo, a continuación damos mas reglas, necesarias para la derivación de la oración.

Figura 1.1 Arbol de Derivación para una Oración

El conjunto de reglas que enumeramos del (1) al (12) constituye una gramática. La oración dada es un miembro del lenguaje generado por la gramática (¿hay otras posibilidades?). La descripción estructural de la derivación, el diagrama del árbol, muestra como se usaron las reglas de la gramática para generar la expresión. Cada nodo del árbol da la aplicación de una de las reglas. A cada una de las reglas se les llama producciones y como especifican la forma en que el lado izquierdo se forma con las frases del lado derecho, a este tipo de gramáticas se les conoce como gramáticas de estructura de frase.

6.2. Gramáticas Formales

Del ejemplo anterior podemos formalizar la definición de gramática. Para esto, tomemos nota de que en el ejemplo utilizamos: 1. El vocabulario (alfabeto) del cual se construyen las frases de nuestro lenguaje. A los

símbolos que constituyen el alfabeto les llamamos símbolos terminales, o simplemente

10

terminales, pues nuestras derivaciones deben terminar en frases formadas exclusivamente de estos símbolos.

2. Los símbolos que utilizamos en los pasos intermedios y que denotamos como no-terminales, que si bien forman parte de la gramática, no forman parte del lenguaje. Son símbolos auxiliares, también denotados como variables por algunos autores.

3. El conjunto de reglas o producciones. Debemos saber también cual es el punto de partida para la aplicación de las producciones, pues el orden en que se listan estas no fuerza ningún orden en su aplicación. Al punto de partida le llamamos el símbolo inicial. Formalmente

Definición 1: Una gramática formal es un 4-duplo ( , , , )G N T P S= donde: N es un conjunto finito de símbolos no terminales T es un conjunto de terminales ( )N T∩ =∅ P es un conjunto finito de producciones S es el símbolo inicial tal que 2( )S N T∉ ∪ Cada producción en P es una pareja ordenada ( , )α β con Aα γ δ= en la cual β , γ y δ son posibles vacías en *( )N T∪ y A N∈ o bien A S= . Denotamos a la pareja ( , )α β como α β→ . El proceso de generar una frase en el lenguaje de acuerdo a una gramática formal consiste en reescribir las formas senténciales mediante el uso de las producciones y empezando por el símbolo S. La sucesión de las formas senténciales requeridas para generar una frase constituye una derivación de la frase de acuerdo a la gramática G. Sea G una gramática formal.

Definición 2: Una forma sentencial es una cadena de símbolos en *( { })N T S∪ ∪ . Definición 3: Sea α β→ una producción en G , w γαδ= y 'w γβδ= formas senténciales. Decimos que 'w se deriva directamente de w y lo denotamos por 'w w→ . Definición 4: Sea 0 1, , , kw w w… es una sucesión de formas senténciales tales que

0 1 2 kw w w w⇒ ⇒ ⇒ ⇒… . Decimos que kw es derivable de 0w y lo denotamos por

0 kw w∗

⇒ . La estrella encima del símbolo ⇒ significa que la derivación se lleva 0 o más

pasos. Si queremos registrar exactamente el numero de pasos, lo hacemos con 0

k

kw w⇒ .

Nótese que w w∗

⇒ es siempre valido, ya que si ejecutamos cero pasos de la derivación, nos quedaremos con la misma cadena. Definición 5: A la sucesión 0 1, , , kw w w… la llamamos una derivación de kw a partir de 0w en G. Definición 6:

11

El lenguaje ( )L G generado por la gramática G es el conjunto de cadenas de terminales derivables a partir de :S

( ) { | }L G w T S w∗

∗= ∈ ⇒ Definición 7: Si ( )w L G∈ , entonces w es una cadena, frase o palabra en el lenguaje generado por .G En general, en la especificación de gramáticas usaremos letras mayúsculas para la no-terminales (o la notación BNF) y letras minúsculas para terminales. Se debe insistir en que se requiere que .N T∩ =∅ De acuerdo a las definiciones anteriores, cada producción en una gramática formal nos da una regla que permite la modificación de una forma sentencia sustituyendo por una cadena arbitraria a una no-terminal particular. Usamos la producción Aγ λ α→ para obtener la forma sentencia iw a partir de la forma sentencia 1iw − ; lo que hemos hecho es casar el lado izquierdo de alguna producción con alguna subcadena de 1iw − , sustituir esa subcadena por el lado derecho, y obtener de esa forma .iw

6.3. Jerarquía de Chomsky

A fin de precisar más qué tipo de gramática es capaz de generar un lenguaje lo más parecido posible a los naturales, Chomsky clasificó las gramáticas y lenguajes dentro de cuatro familias jerárquicamente ordenadas como modelos potenciales del lenguaje natural. Esta clasificación, conocida como jerarquía de Chomsky, se establece aumentando las restricciones sobre la forma de las producciones. Así pues, tenemos: • Gramáticas no Restringidas (tipo 0)

Las gramáticas de tipo 0, son gramáticas sin restricciones, es decir, no hay restricciones ni para el lado izquierdo, ni para el lado derecho de las producciones. Su potencia es la de una máquina de Turing, y sus reglas son del tipo:

α β= No existe algoritmo que en tiempo finito nos diga si una cadena obedece o no las reglas de una gramática de reescritura tan generalizada. Cuando Chomsky formuló sus objeciones a las gramáticas de estructura de sintagma (tipo 2), propuso la utilización de reglas de tipo 0 para el reordenamiento, elisión, etc., de elementos. La no existencia de algoritmo de parsing, mostraba que su potencia superaba en mucho a las lenguas naturales, y el formato de las reglas de reescritura se limitó mucho (los clásicos movimientos de sintagmas por tematización, interrogación...). Una gramática sin restricciones, es una cuaterna de la forma (V, ∑, P, S). Donde:

V es un conjunto de variables o no terminales, ∑ (el alfabeto) es un conjunto finito de símbolos terminales, P es un conjunto finito de reglas, y S es un elemento de V llamado el símbolo inicial o axioma de la gramática.

Una producción de una gramática de este tipo, tiene la forma que ya hemos visto anteriormente ( )α β= , donde ( )Vα +∈ ∪∑ y donde ( )*Vβ ∈ ∪∑ . Los conjuntos V y ∑ son disjuntos.

• Gramática Tipo 1 o Dependientes del Contexto

12

Contiene reglas que se ajustan a: Aβ γ βδγ=

Este tipo de producciones, implica que las sustituciones sólo pueden efectuarse en cierto contexto (el símbolo 'A' se podrá sustituir por 'δ ' si y sólo si, está precedido por ' β ', y le sigue 'γ '), esto es, son gramáticas dependientes (sensibles) al contexto, por tanto, pueden hacer que un sintagma sea sistemáticamente igual a otro. Obsérvese en el cuadro A lo complejo de las reglas necesarias. La complejidad de su parsing es exponencial con la longitud de la cadena de entrada (lo cual es inaceptable con fines de reconocimiento). Este tipo de gramáticas son las de menor éxito en toda la jerarquía.

Cuadro A Gramática Sensible al Contexto

• Gramática Tipo 2 o Libres del contexto

Describen los llamados lenguajes de contexto libre, es decir, en ellos se pueden insertar proposiciones dentro de proposiciones, independientemente del contexto de la oración. De acuerdo con Chomsky, una gramática y su lenguaje correspondiente son independientes del contexto, si y sólo si pueden definirse con un conjunto de producciones independientes del contexto. Las gramáticas de contexto libre (o independiente del contexto), son muy importantes en la teoría de los lenguajes de programación, ya que los lenguajes que definen, tienen en general, una estructura muy sencilla. Las técnicas de análisis sintáctico, suelen basarse en gramáticas de contexto libre. El formato de las producciones según Chomsky será:

A α= Donde α es una cadena, vacía o no, de símbolos terminales o no terminales. Equivale en cuanto a potencia descriptiva, al autómata con pila o Pushdown, y nos permite describir adecuadamente las relaciones intra e inter-sintagmáticas de la lengua natural:

• Concordancia sujeto-verbo. • Concordancia sujeto-atributo. • Inserción de proposiciones en posibles centrales. • Etc.

La representación gráfica de un análisis de contexto libre es el típico árbol sintáctico, con los símbolos no terminales en los nodos intermedios, y los símbolos terminales en los nodos finales. En estas gramáticas todas las producciones son de la forma.

A α→ ( )N Tα +∈ ∪ y { }A N S∈ ∪ Excepto por la posible producción .S ε→

13

• Gramáticas Regulares o Tipo 3

Es el descriptivamente más débil. Sus reglas poseen el siguiente formato: A aB= donde B puede existir o no

Equivalen en cuanto a poder descriptivo, a los autómatas finitos deterministas y no deterministas. Dado un lenguaje regular, que es aquel que es posible caracterizar usando una gramática de tipo 3, siempre será posible hallar su autómata equivalente. Cada símbolo no terminal es un estado, cada regla A = aB, una rama que conecta los estados A y B por medio del símbolo terminal a, y cada regla A = a, nos dice que A se une al estado final del símbolo a. Dada la sencillez estructural de estos lenguajes, la notación chomskiana resulta pesada, por lo que utilizaremos una más compacta para la expresión de lenguajes regulares como es la BNF, ya explicada anteriormente. Las producciones de estas gramáticas se caracterizan por tener del lado derecho a lo más 2 símbolos, uno terminal y otro no terminal. Si la producción es de la forma.

A Bα→ o A α→ con A y { },B N S a T∈ ∪ ∈ Se trata de una producción lineal a la derecha, y si es de la forma

A Ba→ o A a→ Se trata de una producción lineal a la izquierda. Una gramática lineal a la derecha contiene únicamente producciones lineales ala derecha y una gramática lineal ala izquierda contiene únicamente producciones lineales a la izquierda.

En la tabla 1.5 damos un cuadro resumen de los distintos tipos de gramáticas formales y en la figura 1.5 un diagrama de la relación entre estos conjuntos.

Tabla 1.5 Clasificación de gramáticas según sus producciones

14

Figura 1.5 Contención entre los tipos de gramáticas

Heredando o reflejando la jerarquía de las gramáticas formales, los lenguajes también se clasifican en Tipo 0, 1, 2 o 3, dependiendo de si pueden ser generados por una gramática Tipo 0, 1, 2 o 3 respectivamente. Nos podemos encontrar con más de una gramática que genera el mismo lenguaje. En ese caso decimos que el lenguaje es del mismo tipo que la gramática más restringida (en cuanto a tipo) que lo genera. Pedir que la gramática tenga un conjunto finito de reglas es una restricción bastante más seria de lo que parece. Si dado un alfabeto V, y si un lenguaje L es un conjunto de V*, el numero de lenguajes sobre V es el conjunto potencia de V*, ( *)Vγ (de tamaño *2V ), que no es numerable (pues es el numero de subconjuntos de un conjunto infinito). En cambio, el número de representaciones finitas de lenguajes es, como veremos más adelante, en el mejor de los casos un conjunto numerable infinito. Esto quiere decir que hay más lenguajes que representaciones finitas, por lo que habrá un número grande de lenguajes que no podamos describir finitamente. A lo mejor estos lenguajes son tan poco o nada estructurados y no nos interesan. Pero, ¿Qué tal si los lenguajes naturales son de este tipo?

7. Bibliografía

(01) Stefano Crespi Reghizzi, Formal Lenguajes and Compilation, Springer-Verlag 2009. (02) Jhon E. Hopcroft, Introducción a la Teoría de Autómatas, Lenguajes y Computación

Tipo

Tipo

Tipo

Tipo