Sei sulla pagina 1di 14

Desarrollo de lenguajes y Compiladores [MII-771] Captulo 1: Lenguajes y Gramticas Formales

Dr. Ricardo Soto


[ricardo.soto@ucv.cl] [http://www.inf.ucv.cl/rsoto]

Escuela de Ingeniera Informtica Ponticia Universidad Catlica de Valparaso

Marzo, 2010

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

1/14

1. Introduccin

El desarrollo de un compilador genera comnmente la impresin de ser una tarea ardua... muchas lneas de cdigo y de conocimientos avanzados en teora de autmatas. En la actualidad, existen diversas herramientas que permiten al usuario abstraerse de complejos algoritmos... Motivacin??... Necesidad de la industria de denir lenguajes propios...
Estandarizar el desarrollo de sus productos. Modelar problemas y distribuir el conocimiento de manera apropiada. Facilitar las tareas de los programadores.

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

2/14

1. Introduccin
Un compilador es un programa que traduce un programa escrito en un lenguaje a (lenguaje fuente) a un lenguaje b (lenguaje objeto).
Programa Fuente

Analizador Lxico Analizador Sintctico Analizador Semntico Generador Cdigo Intermedio Optimizador Cdigo Intermedio Generador Cdigo Objeto Programa Objeto

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

3/14

2. Alfabetos y palabras

Un alfabeto es un conjunto nito y no vaco de elementos llamados smbolos o letras. Una palabra o cadena sobre un alfabeto V es una cadena nita de smbolos del alfabeto.
Notaciones: denota a una cadena de longitud 0, tambin conocida como palabra vaca. Vn denota al conjunto de todas las palabras de longitud n sobre V V denota al conjunto de todas las cadenas de cualquier longitud sobre V . V + denota al conjunto de todas las cadenas de cualquier longitud sobre V , excepto la vaca. Un elemento de Vn es una cadena del tipo a1 a2 . . . an donde cada ai V .

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

4/14

3. Lenguajes Formales

Llamamos lenguaje sobre el alfabeto V a cualquier subconjunto de V . Especicacin de lenguajes:


Extensin (lenguajes nitos) L = {a, aa, aaa} es un lenguaje sobre el alfabeto V = {a} L = {aba, cab, aaabc } es un lenguaje sobre el alfabeto V = {a, b, c } Comprensin (lenguajes innitos) L = {a(bc )n |n >= 1}

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

5/14

4. Gramticas Formales

El uso de gramticas es otra forma de describir un lenguaje en forma general y rigurosa.


Deniciones: Una gramtica es una cuadrupla G = (VN , VT , S , P ) donde: VT es el alfabeto de smbolos terminales. VN es el alfabeto de smbolos no terminales, de forma que VT VN = , y denotamos con V al alfabeto total de la gramtica, esto es, V = VN VT S es el smbolo inicial y se cumple que S VN P es un conjunto nito de reglas de produccin.

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

6/14

4. Gramticas Formales
Deniciones: Una regla de produccin es un par ordenado (, ) de forma que: = 1 A2 , donde:
1 , 2 (VN VT ) A VN

(V N V T ) Una regla de produccin (, ) se suele escribir como Ejemplo Denir una gramtica para el lenguaje L = {a(bc )n |n >= 1}: Solucin: S aB B bcB |bc donde VN = {S , B } y VT = {a, b, c }.

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

7/14

Ejercicios

Denir una gramtica para los siguientes lenguajes:


L1 = {an bm |n 4 y m 3}

L2 = {an bn |n > 0}

L3 = {an b2n |n > 0}

L4 = {an bn c m d m |n > 0 y m > 0}

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

8/14

4.2 Notacin BNF (Backus-Naus-Form)

BNF es una metasintaxis utilizada para denir gramticas BFN y sus extensiones son ampliamente utilizadas para denir gramticas de lenguajes de programacin. En BNF, smbolos no terminales se denen entre ngulos ( ) y producciones se denen utilizando el smbolo ::=.

Ejemplos
1. <S> ::= a<B> <B> ::= bc<B>|bc 2. <class-dec> ::= class <identifier> { <class-body> }

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

9/14

4.3 Notacin EBNF (Extended BNF)

EBNF introduce el uso de parntesis cuadrados para smbolos opcionales y llaves para repeticiones. El uso de ngulos para smbolos no terminales no es obligatorio. Introduce el uso de comillas en terminales para evitar ambigedad con smbolos reservados de EBNF.

Smbolo opcional
class-dec ::= "class" identifier ["extends" identifier] "{" class-body "}"

Repeticin
number ::= {digit}

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

10/14

4.4 Otras convenciones

denota desde cero a n repeticiones + denota desde una a n repeticiones () para agrupaciones

Repeticin
number ::= digit+

Opcin y repeticin
import-dec ::= identifier ("." identifier )* ["." "*"] ";"

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

11/14

Ejercicios

Utilize EBNF para construir las siguientes gramticas:


Nmero entero. Nmero real. Letra. Palabra. Direccin Postal.
Ej: Juan Maldonado Perez, 6 norte 1234, Via del Mar, Chile

Una expresin. if-else en Java. for en Java. Clase Java.

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

12/14

4.5 Expresiones Regulares

Las expresiones regulares tambin permiten especicar lenguajes regulares. Las expresiones regulares son de gran utilidad en editores de texto y aplicaciones para buscar y manipular textos. En la actualidad existe gran soporte para el uso de expresiones regulares (Perl, PHP, bibliotecas Java, bibliotecas .NET, shell Unix, etc). Similar a EBNF: denota desde cero a n repeticiones + denota desde una a n repeticiones {n} denota n repeticiones {m, n} denota de m a n repeticiones ? denota elemento opcional () para agrupaciones

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

13/14

Ejercicios

Dena los siguientes lenguajes mediante expresiones regulares: L1 = {(ab)n |n > 1} L2 = {an bm |n 4 y m 3} Todas las palabras que empiezen con a y terminen con o Todas las palabras que empiezen con a, tengan una s y terminen con o Todas las palabras que tengan entre 5 y 8 letras

Dr. Ricardo Soto

Desarrollo de lenguajes y Compiladores

14/14

Potrebbero piacerti anche