Está en la página 1de 45

UNIVERSIDAD NACIONAL

DE SAN MARTIN
TEORIA DE COMPILADORES

PROF. ING. AMERICO TORRES GONZALES


Herramientas de Construcción de Compiladores

Igualmente que para el desarrollo de software, el desarrollo de compiladores


puede utilizar los entornos de desarrollo modernos (IDEs) que integran herramientas
como editores de lenguaje, depuradores, administradores de versiones, profilers,
ambientes seguros de prueba, etc.

Existen además herramientas generales para el desarrollo exclusivo de compiladores.


Estas herramientas usan lenguajes especializados para especificar e implementar
componentes específicos haciendo uso de algoritmos bastante sofisticados.

Las herramientas más exitosas son las que ocultan los detalles del algoritmo de
generación y producen componentes que pueden integrarse con facilidad al resto del
compilador. Algunas de ellas son:

Generadores de Analizadores Sintácticos (parsers)


Producen de manera automática analizadores sintácticos a partir de una
descripción gramatical de un lenguaje de programación.
Herramientas de Construcción de Compiladores
Generadores de Escáneres
Producen analizadores de léxicos a partir de una descripción de los tokens de
un lenguaje usando expresiones regulares.

Motores de Traducción orientados a la sintaxis


Producen colecciones de rutinas para recorrer un árbol de análisis sintáctico
y generar código intermedio.

Generadores de generadores de código


Producen un generador de código a partir de una colección de reglas para
traducir cada operación del lenguaje intermedio en el lenguaje máquina
para una máquina destino.

Motores de análisis de flujos de datos


Facilitan la recopilación de información de cómo se transmiten los valores
de una parte de un programa a cada una de las otras partes. El análisis de
los flujos de datos es una parte clave en la optimización de código.

Kits de herramientas para la construcción de compiladores


Proporcionan un conjunto integrado de rutinas para construir varias fases de
un compilador.
LENGUAJES FORMALES
LENGUAJES FORMALES

DEFINICION
EN MATEMATICA, LOGICA, Y CIENCIAS DE LA COMPUTACION, UN LENGUAJE
FORMAL ES UN CONJUNTO DE CADENAS QUE CONFORMAN ALGUN PATRON /
ESTRUCTURA.

TIPICAMENTE DESCRITAS EN ALGUNA NOTACION MATEMATICA (EXPRESIONES


REGULARES, GRAMATICAS LIBRES DE CONTEXTO).
LENGUAJES FORMALES

ALFABETO
ES UN CONJUNTO FINITO DE SIMBOLOS.

CADENA (PALABRA)
ES UNA SECUENCIA FINITA DE SIMBOLOS TOMADOS DE UN ALFABETO DEFINIDO,
CERO O MAS SIMBOLOS.
LENGUAJES FORMALES
LENGUAJES FORMALES
LONGITUD DE LAS CADENAS
LENGUAJES FORMALES / Operaciones con Palabras
IGUALDAD DE CADENAS
DOS CADENAS SON IGUALES SI CONTIENEN EXACTAMENTE LA MISMA SECUENCIA
DE SIMBOLOS.
LENGUAJES FORMALES
NOTACION INUSUAL
SI x ES UN SIMBOLO, ENTONCES 𝑥𝑛 DENOTA n REPETICIONES DEL SIMBOLO x
CONCATENADOS JUNTOS:

EJEMPLOS:
LENGUAJES FORMALES
PALABRA INVERSA

LENGUAJE UNIVERSAL
LENGUAJES FORMALES

LENGUAJE
ES UN CONJUNTO FINITO O INFINITO DE CADENAS DE UN ALFABETO.
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – EJEMPLOS

Sea el alfabeto Σ={0,1,2,3,4,5,6,7,8,9} y sea L1 ϵ Σ y L2 ϵ Σ .


L1 = {x|x ϵ Σ, (x mod 2)=0, x<10 }, y
L2 = {x|x ϵ Σ, es numero primo, x < 10 }

Solución:
Expresamos por extensión si es posible cada lenguaje:

L1 = {2,4,6,8}
L2 = {2,3,5,7}

Calcular:

▪ L1ՍL2={2,3,4,5,6,7,8}
▪ L1ՌL2={2}

▪ L1-L2={4,6,8}
▪ L1Ռ(L1-L2) = {4,6,8}
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS - CONCATENACION
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – CONCATENACION

CONJUNTO CIERRE (CLOSURE)

SET CLOSURE
El cierre L* de L es el conjunto de cadenas que pueden ser expresadas como
la concatenación de cero o más (posiblemente diferentes) cadenas de L.
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – CONCATENACION
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – CONCATENACION EXPRESIONES
LENGUAJES FORMALES
REFLEXION DE UN LENGUAJE
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – EJEMPLOS 1

Sea el alfabeto Σ={0,1,2,3,4,5,6,7,8,9} y sea L1 ϵ Σ y L2 ϵ Σ .


L1 = {x|x ϵ Σ, (x mod 2)=0, x<5 }, y
L2 = {x|x ϵ Σ, es numero primo, x < 5 }

Solución:
Expresamos por extensión si es posible cada lenguaje:

L1 = {2,4}
L2 = {2,3}

Calcular:

▪ L1L2={2,4,2,3}
▪ L1L22={2,4,22,23,32,33}

▪ E=|L1L2|2 = 42 = 16
▪ F=(|L1 Ս (L2-L1)|)(|L1L2|) =(| {2,4} Ս ({3}|){|{2,4,2,3}|}
=(| {2,3,4} |)4
=34 = 81.
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – EJEMPLOS 2

Sea el alfabeto Σ={0,1,2,3,4,5,6,7,8,9} y sea L1 ϵ Σ y L2 ϵ Σ .


L1 = {x|x ϵ Σ, (x mod 2)=0, x<5 }, y
L2 = {x|x ϵ Σ, es numero primo, x < 5 }

Solución:
Expresamos por extensión si es posible cada lenguaje:

L1 = {2,4}
L2 = {2,3}

Calcular:

▪ L1-L1-1 = {2,4}-{2,4} = {λ}


▪ | L1-L1-1 | = (|{2,4}-{2,4}|) = {|λ|} = 0

▪ (L12)-1 = ({22,24,42,44})-1 = {22,42,24,44}


▪ (|L1 L2|)/|L1-1| = (|{2,3,4}|/|{4,2}|) = 3/2 = 1.5
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – EJEMPLOS 3

Dado L1 y L2 sobre A={a,b,c}

L1 = { ai bj cq / q=2i+j y 0≤ i,j ≤ 2}
L2 = { ai c2i/ q=2i+j y 0≤ i ≤ 2}

Calcular:
(1) L1 Ս L2 (2) L1 Ռ L2 (3) L1-L2 (4) L1L2 (5) L1

Solución:
Expresamos por extensión cada lenguaje:
L1 ai bj cq L1 ai bj cq
i=0 j=0 q=0 ԑ i=0 j=2 q=2 bbcc
i=1 j=0 q=2 acc i=1 j=2 q=4 abbcccc
i=2 j=0 q=4 aacccc i=2 j=2 q=6 aabbcccccc
i=0 j=1 q=1 bc
i=1 j=1 q=3 abccc
i=2 j=1 q=5 aabccccc
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – EJEMPLOS 3

Dado L1 y L2 sobre A={a,b,c}


L1 = { ai bj cq / q=2i+j y 0≤ i,j ≤ 2}
L2 = { ai c2i/ q=2i+j y 0≤ i ≤ 2}

Calcular:
(1) L1 Ս L2 (2) L1 Ռ L2 (3) L1-L2 (4) L1L2 (5) L1
Solución:
Expresamos por extensión cada lenguaje:
L2 ai c2i
i=0 ԑ
i=1 acc
i=2 aacccc

Por lo tanto,
L1={ԑ, acc, aacccc, bc, abccc, aabccccc, bbcc, abbcccc, aabbcccccc}
L2={ԑ, acc, aacccc }
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – EJEMPLOS 3

Calcular:
(1) L1 Ս L2 (2) L1 Ռ L2 (3) L1-L2 (4) L1L2 (5) L1

L1={ԑ, acc, aacccc, bc, abccc, aabccccc, bbcc, abbcccc, aabbcccccc}

L2={ԑ, acc, aacccc }

(1) L1 Ս L2 = L2 ⊆ L1 = L1 ={ԑ, acc, aacccc, bc, abccc, aabccccc,


bbcc, abbcccc, aabbcccccc}

(2) L1 Ռ L2 = {ԑ, acc, aacccc }

(3) L1-L2 = {bc, abccc, aabccccc, bbcc, abbcccc, aabbcccccc}

(4) L1L2 = {ԑ, acc, aacccc, bc, abccc, aabccccc, bbcc, abbcccc,
aabbcccccc, accacc, accaacccc, aaccccacc, aaccccaacccc,
bcacc, bcaacccc, abcccacc, abcccaacccc, aabccccccacc,
aabcccccaacccc, bbccacc, bbccaacccc, abbccccacc,
abbccccaacccc, aabbccccccacc, aabbccccccaacccc}
(5) L1 = {w|w ϵ A* y w ≠ ai bj cq y q=2i+j y i,j≥0}
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – EJEMPLOS 4

Dado L1 sobre A={a,b,c,d} y L2 sobre B={c,d,e}

L1 = { ai bi cj dm/ i≥0 y j,m ≥1}


L2 = { ck dk ep / k,p ≥0}

Calcular:

(1) L1 Ս L2 (2) L1 Ռ L2 (3) L1-L2 (4) L2-L1 (5) L1L2 (6) L1

Solución: Desarrollar formulas para ambos lenguajes:

L1 ai bi cj dm L2 ck dk ep
i=0 j=1 m=1 cd k=0 p=0 ԑ
i,j,m ≥ 1 abcd, aabbccdd, … k, p ≥ 1 cde, ccddee, …

Como ambos lenguajes están compuestos por infinitas cadenas, las


respuestas tienen necesariamente que ser expresadas por
comprensión.
LENGUAJES FORMALES
OPERACIONES CON CONJUNTOS – EJEMPLOS 4

L1 ai bi cj dm L2 ck dk ep
i=0 j=1 m=1 cd k=0 p=0 ԑ
i,j,m ≥ 1 abcd, aabbccdd, … k, p ≥ 1 cde, ccddee, …

(1) L1 Ս L2 = { ai bi cj dm/ i≥0 y j,m ≥1} Ս { ck dk ep / k,p ≥0}

(2) L1 Ռ L2 = {ck dk / k≥1 }

(3) L1-L2 = {ai bi / i≥0}

(4) L2-L1 = {ep / p≥0}

(5) L1L2 = { ai bi cj dm ck dk ep / i,k,p≥0 y j,m ≥1 }

(6) L1 = { w|w ϵ A* w ≠ (ai bi cj dm / i ≥0 y j,m ≥1) }


GRAMATICA FORMAL

▪ Se ha visto que los lenguajes son subconjuntos de las palabras sobre un


alfabeto
▪ ¿Cómo se pueden definir las palabras que pertenecen a un determinado
lenguaje?
- Enumerando el conjunto de palabras => ¿algunos lenguajes son infinitos?
- Descripción informal de las palabras => a veces complicado y demasiado
impreciso.
- Descripción formal, basada en los operadores de palabras => no suelen ser
suficientes para especificar todos los lenguajes.

▪ Necesitamos un formalismo para definir los lenguajes (las palabras que pertenecen
a un lenguaje). => Una posibilidad – Gramáticas Formales.
• Una gramática describe de forma inequívoca la estructura de las
palabras de un lenguaje.

• Proporcionan un mecanismo para Generar todas las palabras que


pertenecen a un determinado lenguaje, también se llaman (Gramáticas
Generadoras).

Gramáticas Formales:
https://www.youtube.com/watch?v=siMdRFvK2kk
GRAMATICA FORMAL
GRAMATICA FORMAL / PRODUCCIONES

DEFINICION DE PRODUCCION
Sea ∑ un alfabeto. Una producción, o regla de producción, o regla de
derivación, o regla de escritura, es un par ordenado (x,y), también
representado por x ::= y, tal que x ϵ ∑+ e y ϵ ∑*.

Se llama x la cabeza o parte izquierda de la producción, e y su cuerpo o parte


derecha.

DERIVACIONES

Es un proceso mediante el cual una gramática define un lenguaje, de forma


derivativa. La idea central consiste en que se considera una producción como
regla de reescritura, donde el no terminal de la izquierda es sustituido por la
cadena del lado derecho de la producción. Ejemplo:

E → E +E | (E*E) | (E) | -E | id
(gramática para expresiones aritméticas, donde
el no terminal E representa una expresión.)
GRAMATICA FORMAL / ARBOL DE DERIVACION

DERIVACION
Es la Aplicación de las Producciones de una Gramática para obtener una
cadena de terminales.

Lo que se quiere lograr con una Derivación es COMPROBAR si ciertas cadenas


están en el Lenguaje expresado por la Gramática.

Existen 2 tipos de inferencia:

A. Inferencia Recursiva: Que recorre el árbol desde el cuerpo hacia la cabeza.


B. Derivación (propiamente dicha): Que recorre el árbol desde la cabeza hacia el
cuerpo.

Aquí estaremos tratando con la Derivacion.


GRAMATICA FORMAL / ARBOL DE DERIVACION

Tipos de Derivación

La operación de derivación se realiza principalmente mediante un Árbol de Derivación,


el cual tiene la siguiente estructura:

▪ Nodo Raíz: Es el nodo que da inicio al


árbol.
▪ Nodo Interior: Pueden contener símbolos
no terminales como terminales.
▪ Hojas: Contienen solamente
símbolos terminales.
GRAMATICA FORMAL / ARBOL DE DERIVACION

Derivación por la Izquierda

Se sustituye siempre la hoja no terminal que se encuentre más a la izquierda.


Ejemplo:

Tenemos la siguiente gramática con 6 reglas:

1. S → ASB
2. A→b
3. aaA → aaBB
4. S→d
5. A → aA
6. B → dcd

Identificamos los elementos de la gramática:

S = Símbolo Inicial
ASB = Símbolos No terminales
abcd = Símbolos Terminales
GRAMATICA FORMAL / ARBOL DE DERIVACION

Derivación por la Izquierda

▪ Paso 1: Comenzamos a construir el árbol con el


Símbolo Inicial:
S

▪ Paso 2: Por medio de la regla 1, S deriva en ASB, los cuales son No Terminales.

A S B

Como estamos derivando por la izquierda continuaremos la derivación con el nodo


A por estar más a la izquierda.
GRAMATICA FORMAL / ARBOL DE DERIVACION

Derivación por la Izquierda

▪ Paso 3: Por medio de la Regla 5 el nodo A deriva en aA:

A S B

a A S

A S B
▪ Paso 4: la ‘a’ como es terminal no puede derivarse,
pero el nodo que le sigue por la izquierda A si puede
derivarse mediante la regla 2 que produce b. a A

b
Seguimos con la derivación del Nodo S…
GRAMATICA FORMAL / ARBOL DE DERIVACION
Derivación por la Izquierda

▪ Paso 5: Mediante la regla 4 derivamos S en d:


S

A S B

a A d
S
b
A S B
▪ Paso 6: Finalmente derivamos B mediante la
regla 6.
a A d d c d

Hemos obtenido mediante la derivación por la b


Izquierda de S:
abddcd
GRAMATICA FORMAL / DERIVACION SIN USAR EL ARBOL
Derivación por la Izquierda

Resolveremos el problema sin usar el árbol:

▪ Paso 1: Escribimos el Nodo Inicial:

▪ Paso 2: Aplicamos la regla 1 y obtenemos:

▪ Paso 3: Como estamos en derivación por la izquierda derivamos A por la regla 5 y


copiamos el resto de la expresión tal cual:

▪ Paso 4: el No terminal de la izquierda ahora es A al cual derivamos mediante la


regla 2:
GRAMATICA FORMAL / DERIVACION SIN USAR EL ARBOL
Derivación por la Izquierda

▪ Paso 5: Derivamos el No Terminal S mediante la regla 4:

▪ Paso 6: Finalmente, derivamos B mediante la regla 6:

Así hemos derivado S usando la derivación por la izquierda obteniendo la producción:


abddcd.
GRAMATICA FORMAL / DERIVACION SIN USAR EL ARBOL

Derivación por la Derecha

Se sustituye siempre la hoja no terminal que se encuentre más a la derecha.


Ejemplo:

Usaremos la misma gramática:

1. S → ASB
2. A→b
3. aaA → aaBB
4. S→d
5. A → aA
6. B → dcd

▪ Paso 1: Comenzamos con el Símbolo de Inicio:

S
GRAMATICA FORMAL / DERIVACION SIN USAR EL ARBOL

Derivación por la Derecha

▪ Paso 2: Usamos la regla 1:


S

A S B

▪ Paso 3: Comenzamos derivando el Nodo B usando la regla 6:

A S B

d c d
GRAMATICA FORMAL / DERIVACION SIN USAR EL ARBOL

Derivación por la Derecha

▪ Paso 4: Derivamos S por la regla 4:


S

A S B

d d c d

▪ Paso 5: Derivamos A por la regla 5:

A S B

a A d d c d
GRAMATICA FORMAL / DERIVACION SIN USAR EL ARBOL

Derivación por la Derecha

▪ Paso 6: Finalmente derivamos A por la regla 2:


S

A S B

a A d d c d

Hemos derivado por la derecha S obteniendo abddcd.

Tarea
Realizar la derivación por la derecha de esta gramática sin usar el árbol.

También podría gustarte