You are on page 1of 109

Compiladores

Ernesto Herrera Salinas

Captulo Estudiantil de la Universidad Autnoma Metropolitana Iztapalapa

Compiladores
Definicin: Un compilador es un programa que lee un programa escrito en un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Cdigo Objeto
k=i+j ;

Cdigo Fuente

or 0101101010101 lad pi om C

Compiladores
La Caja Negra: Programa fuente Programa Objeto Mensaje de error

Programa fuente

COMPILADOR

Programa objeto

Mensaje de error

Cdigo de Mquina
Binario Ininteligible
00000010101011101011 00000010101110101100 00000010101111001010 00000010111111001000 00000011001110101000 00000010101011101011 00000010101001011011

Dependiente de la arquitectura:
RISC CISC

Hablando con Mquinas


k = i + j; LOAD i ADD j STORE k

00000010101111001010 00000010111111001000 00000011001110101000

Teora de la Computacin

LENGUAJES & AUTMATAS

El inicio de nuestro aprendizaje

Conceptos Bsicos
Smbolo: Un smbolo es un signo, dgito, letra o incluso un grupo de letras que se utiliza en algn lenguaje y tiene algn significado por s mismo. Ejemplo: 0, 1, W, OK, b, , , , , STOP,9, \, , , `, etc.

Conceptos Bsicos
Alfabeto: Un alfabeto es un conjunto finito no vaco de smbolos. ={a, b, c, d, ...} ={, , , , ..., }

Conceptos Bsicos
Los alfabetos vistos como conjuntos: 1 y 2 son dos alfabetos. 1 [ 2 1 \ 2 1 - 2 y 2 - 1 1 2

Conceptos Bsicos
Cadena: Una cadena es una secuencia finita de smbolos yuxtapuestos de un alfabeto dado. Ejemplo: Sea = { 0, 1}, entonces w1= 01010101, w2=111, w3 = 000, w4=01010101, ...; son cadenas formadas por el alfabeto dado.

Conceptos Bsicos
La Cadena Vaca La cadena vaca se denota por y es la cadena que est formada por una secuencia vaca de smbolos bajo cualquier alfabeto.

Conceptos Bsicos
Operaciones con Cadenas:

Longitud Concatenacin Potencia de cadenas Subcadenas Inversa de una cadena

Conceptos Bsicos
Longitud de una cadena Ejemplo: w = 123456 entonces |w| = 6 w= entonces |w| = 0

Conceptos Bsicos
Concatenacin Es la yuxtaposicin de dos cadenas, una a continuacin de la otra, de tal forma que si w y x son dos cadenas. wx Ejemplo: w = chango x = leon

w x = changoleon

Conceptos Bsicos
Concatenacin No es conmutativa: wxxw Ejemplo: changoleon leonchango

Conceptos Bsicos
Potencia de Cadenas Ejemplo: Sea w = abc w0 = w1 = ww0 = abc = abc w2 = ww1 = abcabc w3 = ww2 = abcabcabc

Conceptos Bsicos
Subcadenas Una cadena w es una subcadena de otra cadena z, si existen x y y, no ambas vacas, para las cuales z = xwy. Cualquier prefijo o sufijo propios de z tambin son subcadenas de z.

Conceptos Bsicos
Subcadenas Ejemplo: Prefijo , a, ar, arc, arce son prefijos propios de w = arceo. Sufijo , o, to, ato son sufijos de w = gato. Entrefijo

Conceptos Bsicos
Inversa de una Cadena La inversa de una cadena w es la cadena wI, tal que es la imagen refleja de w, es decir, que equivale a w cuando se lee de derecha a izquierda. Formalmente:

Conceptos Bsicos
Propiedades de la Inversa (xI)I = x

Si x = wy, entonces xI = yIwI

Una cadena se llama palndroma, cuando es igual a su inversa: w = wI.

Conceptos Bsicos
Lenguajes Espaol Nihongo (

Franois Pascal C C++ C# C#++ C##? Perl Phyton Seas Geroglficos, etc.

Conceptos Bsicos
Como una entidad matemtica Es un conjunto de palabras o cadenas formadas por smbolos de un alfabeto dado. ={ 0, 1}, L = {0, 1, 00, 11, 000, 010, 111, ...}, es un lenguaje de cadenas palndromas sobre .

Conceptos Bsicos
Concatenacin L1 L2, L1={patz, came, yure, zita} y L2 ={cuaro}, entonces L1 L2={patzcuaro, camecuaro, yurecuaro, zitacuaro}. Unin, Interseccin y Diferencia

Conceptos Bsicos
Cerraduras
*

n=0 ={0,1}, L* = { , 1, 0, 00, 01, 10, 11, 000, 001, 010, 011, 111, ...}

Conceptos Bsicos
Cerradura Positiva
+

n=1 ={a,b}, L+ = { a, b, aa, ab, ba, bb, aaa, aab, aba, abb, bbb, ...}

Lenguajes Regulares
a*b* es una expresin regular, esto define una serie de cadenas:

aaab abbb a bb

Expresiones Regulares
rs=sr r=r=r rr=r (rs)t=r(st) r=r=r r=r= (rs)t = r(st) r(st)=rsrt (rs)t=rtst r*=r**=r*r*=(r)* =r*(r)=(r)r*= r*= r+=(r)+ (rs)*=(r*s*)*= (r*s*)*=(r*s)*r*= r*(sr*)*

Expresiones Regulares
r(sr)*=(rs)*r (r*s)*=(rs)*s (rs*)*=r(rs)* r+=rr*=r*r

Expresiones Regulares y Autmatas


Cmo reconocer la expresin regular (a*ba*)(b(a*ba*))* ? R.- El autmata (finito determinista) siguiente nos ayuda a reconocer todas las cadenas de esta expresin:

Autmatas

AFD = (Q, , , s, F)

Autmatas
Q: Es un conjunto finito de estados. s: s Q es el estado inicial. F: Es el subconjunto de Q de estados de aceptacin (F Q). es la funcin de transicin (:Q x Q). : Es el alfabeto de entrada. Ejemplo = {a, b}

a S q0

b q1 b

Autmatas

q0 *q1

a q0 q1

b q1 q0

Autmatas

Autmatas

Autmatas

Autmatas

q0 *q1

a q0 q1

b q1 q0

Implementacin computacional
int alfabeto(char c, const char alf[]) { int i = 0; for ( ; alf[i] != c && alf[i] != '\0'; i++) ; return (alf[i] == c ? i : -1 ); } int automata(const int a[], int n, const int A[], const char alf[], const char cad[]) { int i = 0, s, q = 0, pos = strlen(alf); while (q > -1 && cad[i] != '\0') { s = alfabeto(cad[i], alf); if (s == -1) break; q = A[(q * pos)+s]; i++; } return acepta(q, a, n); } int acepta(const int qf, const int Qa[], int n) { int i = 0; while((qf != Qa[i]) && (i < n-1)) i++; return (qf == Qa[i]); }

Implementacin computacional
int alfabeto(char c, const char alf[]) { int i = 0; for ( ; alf[i] != c && alf[i] != '\0'; i++) ; return (alf[i] == c ? i : -1 ); }

Implementacin computacional
int automata(const int a[], int n, const int A[], const char alf[], const char cad[]) { int i = 0, s, q = 0, pos = strlen(alf); while (q > -1 && cad[i] != '\0') { s = alfabeto(cad[i], alf); if (s == -1) break; q = A[(q * pos)+s]; i++; } return acepta(q, a, n); }

Implementacin computacional
int acepta(const int qf, const int Qa[], int n) { int i = 0; while((qf != Qa[i]) && (i < n-1)) i++; return (qf == Qa[i]); }

Ejemplo I

Reconocimiento de cadenas particulares Herramienta: ANSI C

Anlisis Lxico

Breve introduccin

FLEX
Generar escneres: programas que reconocen patrones lxicos en un texto. Flex lee los ficheros con la descripcin de un escner a generar. La descripcin se encuentra en forma de parejas de expresiones regulares y cdigo C, denominadas reglas.

FLEX
parser.l lex.yy.c

lex.yy.c

parser.o

parser.out

FLEX
%{ #include <stdio.h> %} DIGITO [0-9] ID [A-Za-z][A-Za-z0-9]* %% printf(entero); {ID} printf(identificador); %% int main(int argc, char* argv[]) { ... {DIGITO}+

Cdigo C de apoyo

FLEX
%{ #include <stdio.h> %} DIGITO [0-9] ID [A-Za-z][A-Za-z0-9]* %% printf(entero); {ID} printf(identificador); %% int main(int argc, char* argv[]) { ... {DIGITO}+

Elementos bsicos como expresiones regulares.

FLEX
%{ #include <stdio.h> %} DIGITO [0-9] ID [A-Za-z][A-Za-z0-9]* %% printf(entero); {ID} printf(identificador); %% int main(int argc, char* argv[]) { ... {DIGITO}+

Reglas: Token Accin

FLEX
%{ #include <stdio.h> %} DIGITO [0-9] ID [A-Za-z][A-Za-z0-9]* %% printf(entero); {ID} printf(identificador); %% int main(int argc, char* argv[]) { ... {DIGITO}+

Cdigo en C del modulo.

Patrones
x . [xyz] [abj-oZ] [^A-Z] [^A-Z\n] r* r+ r? r{2,5} r{2,} r{4} {nombre} [xyz]\foo

Patrones
\x \0 \123 \x2a (r) rs r|s r/s ^r <s>r <s1,s2,s3>r <*>r <<EOF>> <s1,s2><<EOF>>

Patrones
Clases de caracteres:
[:alnum:] = [a-zA-Z0-9] [:alpha:] = [a-zA-Z] [:blank:] = [\t] [:digit:] = [0-9] [:lower:] = [a-z] [:upper:] = [A-Z] [:print:] = caracteres imprimibles.

Patrones
[:alnum:] [:alpha:][:digit:] [:alpha:][0-9] [a-zA-Z0-9]

Variables de Flex
yytext El texto que corresponde con el token se almacena en puntero global yytext. %pointer %array.

Variables de Flex
yyin El identificador de archivo que FLEX utilizara como entrada. Por defecto stdin.

Variables de Flex
yyleng Es la longitud de yytext.

Funciones de Flex
yylex() Aqu es dnde inicia el escaner el anlisis de la entrada.

Ejemplo II

Creacin de una impresora esttica. Herramienta: FLEX

Gramticas

Breve introduccin

Gramticas
G = (N, , S, P) Ejemplo: L(G) = b(a2)*(b), = {a,b}, N = {S, A} S bA A aaA | b |

Gramticas

el hombre fue un gran depredador

Gramticas
<oracin> <frase de sujeto><verbo><frase de objeto> <frase de sujeto> <determinador><sustantivo> <frase de objeto> <determinador><adjetivo><sustantivo> <determinador> un|uno|unos|unas|el|la|los|las|este| esta|estos|estas|esos|esas <sustantivo> hombre|depredador <verbo> es|est|fue|estuvo <adjetivo> postres|gran

Gramticas
Frase

Frase de sujeto

Verbo

Frase del objeto

Determinador

Sustantivo

Determinador

Adjetivo

Sustantivo

el

hombre

fue

un

gran

depredador

Gramticas
S AB | BC A BA | a B CC | b C AB | a

S AB | BC A BA | a B CC | b C AB | a

Gramticas
? ? ? ? ?

S AB | BC A BA | a B CC | b C AB | a

Gramticas
? {S,C} B {A,C} B

Gramticas
S aA | aB A aA | bC B bB | bC C

BISON
Bison es un generador de analizadores sintcticos de propsito general que convierte una descripcin gramatical en un programa C que analice esa gramtica.

BISON

GIC: Gramtica contexto.

independiente

del

BISON

Backus-Naur o "BNF"

BISON
%{ #include <stdio.h> #define max(x,y) ((x>y)? x:y) %} %token DIGITO OP NL ERR %start linea %% linea: expr NL linea | /*epsilon*/ ; expr: expr OP expr | DIGITO ; %% int main(int argc, char* argv[]) { ... yyparse(); ... }

Declaraciones en C

BISON
%{ #include <stdio.h> #define max(x,y) ((x>y)? x:y) %} %token DIGITO OP NL ERR %start linea %% linea: expr NL linea | /*epsilon*/ ; expr: expr OP expr | DIGITO ; %% int main(int argc, char* argv[]) { ... yyparse(); ... }

Declaraciones de Bison

BISON
%{ #include <stdio.h> #define max(x,y) ((x>y)? x:y) %} %token DIGITO OP NL ERR %start linea %% linea: expr NL linea | /*epsilon*/ ; expr: expr OP expr | DIGITO ; %% int main(int argc, char* argv[]) { ... yyparse(); ... }

Reglas gramaticales

BISON
%{ #include <stdio.h> #define max(x,y) ((x>y)? x:y) %} %token DIGITO OP NL ERR %start linea %% linea: expr NL linea | /*epsilon*/ ; expr: expr OP expr | DIGITO ; %% int main(int argc, char* argv[]) { ... yyparse(); ... }

Cdigo C adicional

Bison

Bison
archivo.y archivo.tab.c

archivo.tab.c

archivo.o

archivo.out

Bison

Una regla gramatical de Bison tiene la siguiente forma general: resultado: componentes ...
;

Ejemplo: exp: exp '+' exp ;

Acciones Semnticas
Por ejemplo, he aqu una regla que dice que una expresin puede ser la suma de dos sub expresiones:
expr: expr '+' expr { $$ = $1 + $3; } ;

Ejemplo III

Creacin de una calculadora Herramienta: BISON

Compilador

CPU
REGISTRO DE INSTRUCCIONES

0000 0001 0001 0010 0010 0010 0011 0010 0100 0010 0101 0010 0110 0011 0111 0011 1000 0011 1001 0011

NEXT AC STATUS

CPU
CODE 0 1 2 3 4 5 6 7 8 9 FORMATO TIPO CLEAR 1 SET [C] 2 STORE [D] 2 LOAD [D] 2 ADD [D] 2 GO [D] 2 IFGT [C][D] 3 IFLT [C][D] 3 IFEQ[C][D] 3 INT [C],[D] 3 ACCION AC <- 0 AC <- [C] [D]<- AC AC<- [D] AC <- AC + [D] NEXT <- [D] NEXT <- [D] sii AC > [C] NEXT<- [D] sii AC < [C] NEXT <- [D] SIi AC = [C] -

Pequeo Programa
0 SET 10 2 STORE 0 4 SET 1 6 STORE 1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2 22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

Traduccin
0 SET 10 2 STORE 0 4 SET 1 6 STORE 1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2 22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

0000 0001 0000 1010 0000 0010 0000 0000 0000 0001 0000 0001 ...

Traduccin
0000 0001 0000 1010 0000 0010 0000 0000 0000 0001 0000 0001 ...

SET 10 STORE 0 SET 1

Traduccin
0000 0001 0000 1010 0000 0010 0000 0000 0000 0001 0000 0001 ...

SET 10 STORE 0 SET 1

Traduccin
0000 0001 0000 1010 0000 0010 0000 0000 0000 0001 0000 0001 ...

SET 10 STORE 0 SET 1

Traduccin
0000 0001 0000 1010 0000 0010 0000 0000 0000 0001 0000 0001 ...

SET 10 STORE 0 SET 1

Traduccin
0000 0001 0000 1010 0000 0010 0000 0000 0000 0001 0000 0001 ...

SET 10 STORE 0 SET 1

Traduccin
0000 0001 0000 1010 0000 0010 0000 0000 0000 0001 0000 0001 ...

SET 10 STORE 0 SET 1

0 SET 10 2 STORE 0 4 SET 1 6 STORE 1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2 22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0x0 0x0 0

1[0x0] 2[0x2] 3[0x4] 4[0x6] 5[0x8] 6[0xA] 7[0xC]

0x0 0x0 0x0 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE 1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

SET 10

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0x2 0xA 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0x0 0x0 0x0 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE 1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

STORE 0

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0x4 0xA 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xA 0x0 0x0 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE 1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

SET 1

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0x6 0x1 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xA 0x0 0x0 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

STORE 1

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0x8 0x1 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xA 0x1 0x0 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

STORE 2

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0xA 0x1 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xA 0x1 0x1 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

LOAD 0

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0xC 0xA 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xA 0x1 0x1 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

ADD 1

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0xE 0xB 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xA 0x1 0x1 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

STORE 0

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0x10 0xB 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xB 0x1 0x1 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

LOAD 2

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0x12 0x1 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xB 0x1 0x1 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

ADD 1

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0x14 0xC 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xB 0x1 0x1 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

STORE 2

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0x16 0xC 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xB 0x1 0xC 0x0 0x0 0x0 0x0

0 SET 10 2 STORE 0 4 SET 1 6 STORE1 8 STORE 2 10 LOAD 0 12 ADD 1 14 STORE 0 16 LOAD 2 18 ADD 1 20 STORE 2

IFGT 100, 10

22 IFGT 100, 10 25 INT 5, 0 28 INT 6, -1

NEXT AC STATUS

0x19 0xC 0

0x0 0x2 0x4 0x6 0x8 0xA 0xC

0xB 0x1 0xC 0x0 0x0 0x0 0x0

Faces de un compilador
Analizador lxico (FLEX) Analizador Sintctico (BISON) Analizador Semntico (FLEX&BISON) Generador de cdigo intermedio (FLEX, BISON, C/C++) Optimizador de cdigo (C/C++) Generador de cdigo(C/C++)

Bibliografa

Compiladores: Principios, tcnicas y herramientas. Autores: Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. Editorial: ADDISON-WESLEY.

Bibliografa

Lenguajes de programacin: Conceptos y constructores. Autor: Ravi Sethi. Editorial: ADDISON-WESLEY.

Bibliografa

Compiler Design in C. Autor: Allen I. Holub. Editorial: Prentice Hall.

Bibliografa

Lenguajes y Automatas. Autor: Jorge Eduardo Carrin. Editorial: ACD.

Gracias Por Su Asistencia


Preguntas? ernestohs@gmail.com Material en:
http://www.mokasoftware.com/ernesto/conf/mat/ceaumi