Professional Documents
Culture Documents
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
Teora de la Computacin
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:
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
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
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
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}+
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}+
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}+
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
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
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
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
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 ...
;
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
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 ...
Traduccin
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 ...
Traduccin
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 ...
Traduccin
0000 0001 0000 1010 0000 0010 0000 0000 0000 0001 0000 0001 ...
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
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
NEXT AC STATUS
0x2 0xA 0
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
NEXT AC STATUS
0x4 0xA 0
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
NEXT AC STATUS
0x6 0x1 0
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
NEXT AC STATUS
0x8 0x1 0
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
NEXT AC STATUS
0xA 0x1 0
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
NEXT AC STATUS
0xC 0xA 0
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
NEXT AC STATUS
0xE 0xB 0
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
NEXT AC STATUS
0x10 0xB 0
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
NEXT AC STATUS
0x12 0x1 0
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
NEXT AC STATUS
0x14 0xC 0
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
NEXT AC STATUS
0x16 0xC 0
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
NEXT AC STATUS
0x19 0xC 0
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
Bibliografa
Bibliografa