Está en la página 1de 27

INSTITUTO POLITÉCNICO NACIONAL

UNIDAD PROFESIONAL INTERDISCIPLINARIA


DE INGENIERÍA Y CIENCIAS SOCIALES Y
ADMINISTRATIVAS

APUNTES DE COMPILADORES
SECUENCIA: 4NM51
PROGRAMA ACADÉMICO: INGENIERÍA EN INFORMÁTICA
ALUMNO: ENRÍQUEZ ESPARRAGOZA DANIEL
NIVELES DE APRENDIZAJE ASOCIADOS DE MANERA
ASCENDENTE:
5.- ADMINISTRACIÓN DE TECNOLOGÍAS
4.- COMPILADORES, SISTEMAS EN TIEMPO REAL
3.- SISTEMAS OPERATIVOS, ALGORITMOS COMPUTACIONALES
2.- TEORÍA DE LA COMPUTACIÓN, ESTRUCTURA DE DATOS
1.- MATEMÁTICAS DISCRETAS.
FORMA DE EVALUACIÓN:
1er Departamental: 50% Examen escrito 25% Participaciones 25%
Tareas
2do Departamental: 50% Examen escrito 25% Participaciones 25%
Tareas
3er Departamental: 50% Examen escrito 25% Participaciones 25%
Tareas
80% Asistencia; En caso de falta, justifica con receta médica.
1er Departamental
Sistemas de Traducción y Compilación.
ARCHIVO COMPILADOR PROGRAMA.EXE

TRADUCTOR

INTERPRETE
COMPILADOR

Fases de compilación

=
<id,1> <=> <id,2> <+>
A=B+C*60; <id,1> +
<id,3> <*> <60>
<id,2> *

<id,3> 60
ANALIZADOR LÉXICO

ANALIZADOR SINTÁCTICO
=
T1=inttofloat(60)
<id,1> + LDF R2, id3
T2=id3 * T1 T1 = id3 * 60.0
<id,2> * MULF R2,R2
T3= id2 + t2 id1=id2+T1
<id,3> float LDF R1,id2
id1=T3 OPTIMIZADOR DE
60 CÓDIGO ADDF R1,R1,R2
GENERADOR DE
ANALIZADOR SEMÁNTICO CÓDIGO INTERMEDIO STF i d1,R1

GENERADOR DE CÓDIGO

Ilustración 1 Autómata para distinguir de una palabra reservada

EJERCICIO 1.3.1: Indique cuál de los siguientes términos se aplican a los siguientes lenguajes:

a) Imperativo h) Secuencia de comandos (scripting)


b) Declarativo
c) Von Neumann
d) Orientado a Objetos
e) Funcional 1) C
f) De tercera generación 2) C++
g) De cuarta generación 3) Cobol
4) Fortran 8) Perl
5) Java 9) Python
6) Lisp 10) VB
7) ML

RESPUESTAS:

a) ->1,2,5
b) ->7
c) ->1,4
d) ->2,5
e) ->7
f) ->1,2,3,4,5,6
g) ->2,5,10
h) ->5,8,9

ELEMENTOS PARA EL DISEÑO DE LENGUAJES


ALFABETO ∑
ESPAÑOL ∑1={A,..,Z}U{a,..,z} PALABRAS
INGLES ∑2={ESPAÑOL}-{Ñ,ñ} Hola
BINARIO ∑3={0,1} Hello
OCTAL ∑4={0,..,7} 01,10,1,0
HEXADECIMAL ∑5={0,…,9}U{A,…,F}

Declaration Type
Int a = 1 B1-B3
Int b = 1 B1-B2
Int b=2 B2-B4
Int a=3 B3
Int b =4 B4

Ilustración 2 Análisis de los valores de a y b

#define a (x+1)
int x = 2;
void b(){int x=1; printf(“%d\n”,a);}
void c(){printf(“%d\n”, a);}
void main(){b(); c();}
Programa 1 Análisis del valor de a

TRADUCTOR SIMPLE ORIENTADO A SINTAXIS


{
Int i, int j, float a[100]; float v; float x;
While(true){
Do i = i +1; while(a[i]<v);
Do j =j-1; while(a[j]>v);
If(i>=j)break;
X=a[i], a[i]=a[j]; a[j]=x;
}
}
Programa 2 Análisis del valor de x con arreglos

Ilustración 3 Arboles sintácticos de las sentencias if y do-while del Programa 2

1. i=i+1
2. t1=a[i]
3. if t1 < v goto 1
Programa 3 Código de tres direcciones del Programa 2 basado en la Ilustración

1. i=i+1
2. t1=a[i]
3. if t1 < v goto 1
4. j=j-1
5. t2=a[j]
6. if t2 > v goto 4
7. if FALSE i>=j goto 9
8. goto 14
9. x=a[i]
10. t3=a[j]
11. a[i]=t3
12. a[j]=x
13. goto 1
14.
Programa 4 Código optimizado del Programa 2

Ilustración 4 Modelo Front-End de un compilador

ROBOT

Ilustración 5 Izq. Plano Cartesiano en la que se mueve el robot Der. Controles para su movimiento, así como un botón de reset y sus coordenadas
actuales

begin, west, south,east,east,north,north T={begin,east,north,west,south}


Gramática: S={seq}
Seq  seq instr | begin P={seqseq instr
Instr east | north | west | south seqbegin
G={N,T,S,P} instreast
N={seq,instr} instrnorth
instrwest instrsouth }

Ilustración 6 Árbol sintáctico para el movimiento del robot

En 2 dimensiones tenemos que meter la secuencia: begin east, south, north, west y decirnos su posición.

west x −1 south x 0 east x 1 north x 0


PRODUCCTIONS SEMANTIC RULES
Seqseq instr Seq x = seq.x + instr.x ( y 0 ) (
y −1 ) ( )
y 0 y 1 ( )
Seq y = seq.y + instr.y
Seqbegin Seq.x = 0 Seq seq instr | begin
Seq.y = 0
Instr east | north | west | south
Instreast Seq.x = 1
Seq.y = 0
Instrnorth Seq.x = 0
Seq.y = 1 Ilustración 7 Movimiento en tres dimensiones

Instrwest Seq.x = -1
Seq.y = 0
Instrsouth Seq.x = 0
Seq.y = -1

NOTACIÓN POLACA
Infija Prefija +XY
X+Y Postfija XY+
X -> OP1 Y->OP2 + -> OPBinario
Expresión matemática:

−b ± √ b2−4 ac
x 1,2=
2a
Codificación: +, -, *, /, ↑, (, ), =
Infija
X1=(¬b+(b↑2-4*a*c) ↑(1/2))/(2*a) X2=(¬b-(b↑2-4*a*c) ↑(1/2))/(2*a)

En base a la Ilustración 8, obtener las


expresiones prefija y postfija

PREFIJA

=X1/+¬b↑-↑2**4ac/12*2a
POSTFIJA
X1b¬b2↑4a*c*-12/↑+2a*/=

Ilustración 8 Árbol sintáctico para obtener todas las


expresiones

Ilustración 9 Árbol sintáctico demostrativo de la sentencia if-else

Syntax definition
If(expr) instr else instr
G={N,T,S,P}
Instr if ( expr) instr else instr
Expr  expr + factor
| expr – term
| term
Term term * factor | term / factor | factor
Factordigit | (expr)
Digit 0|1|2|3|4|5|6|7|8|9

Supóngase la siguiente expresión: 9-5*2


Analizamos la precedencia de los operadores, el operador de menor procedencia será el que se ubicará en la
raíz del árbol sintáctico.

Ilustración 10 Árbol sintáctico y árbol de análisis sintáctico de la operación 9-5*2

expr expr + term | expr – term | term


term term * factor | term / factor | factor
factor factor ↑ digito | digito | expr
digito  0|1|2|3|4|5|6|7|8|9

Ejercicio:
9-5*(2↑3)

9-(5*2) ↑3
(9-5)*(2+3)

Stmt  expr
| if (expr) stmt
A grammar for some sentences in C and Java
| for (optexpr ; optexpr ; optexpr) stmt
| other
Optexpr  expr | Ꜫ

Sentencia a analizar
For ( ; expr; expr) other
void instr(){
Switch(preanálisis){
Case expr:
Match(expr); match(‘;’);
break;
Case if:
Match(if); match(‘(‘); match(expr); match(‘)’); instr();
Case for:
Match(for); match(‘(‘); expropc(); match(‘;’);
expropc(); match(‘;’); expropc(); match(‘)’); instr(); break;
Case other:
Match(other); break;
Default:
Report(“Syntax error”);
}
}
Void expropc(){
If(preanálisis==expr)match(expr);
}
Void match(terminal t){
If(preanálisis==t) preanálisis = nextTerminal;
Else report(“Syntax error”);
}
RESPUESTAS DEL EXAMEN 1ER DEPARTAMENTAL
a) P=>QVRVS
PREFIJA =>PVVQRS
POSTFIJA PQRVSV=>

b) Qʌ¬(R<=>PVQ)
PREFIJA ʌQ¬<=>RVPQ
POSTFIJA QRPQV<=>¬ʌ
c) ¬¬PVQʌRV¬Q
PREFIJA VV¬¬PʌQR¬Q
POSTFIJA P¬¬QRʌVQ¬V

2do Departamental
Figura 3.34
/ER/= (a U b)
/ER/= (a U b)abb
Tabla de transiciones:
Q a b Ꜫ-Cerraddura Función de composición
0 φ φ {0,1,2,4,7} Δ(Ꜫ-Cerradura(0),a)={3,8}
1 φ φ {1,2,4} Δ(Ꜫ-Cerradura(0),b)={5}
2 {3} φ {2} Ꜫ-Cerradura(3) U Ꜫ-Cerradura(8) = {1,2,3,4,5,6,7,8}
3 φ φ {3,6,7,1,2,4} ∑ =
4 φ {5} {4} {a,b}
5 φ φ {5,6,7,1,2,4} Ꜫ-
6 φ φ {6,7,1,2,4}
7 {8} φ {7}
8 φ {9} {8}
9 φ {10} {9}
10 φ φ {10}
Cerradura(Δ(Ꜫ-Cerradura(qi),a))
Ꜫ-Cerradura(Δ(Ꜫ-Cerradura(qi),b))

DE FORMA GENERAL
OPERADORES RELACIONALES
Diagrama de transiciones hipotético para identificadores (id) y palabras clave
Cadena utilizando la gramática:
Declarate foo real fixed real
floating

El único problema con la gramática es


que permite declaraciones que son
contradictores o redundantes.

GRAMÁTICA AMBIGUA DEL


IF—THEN
FACTORIZACIÓN POR LA IZQUIERDA
Instr  if expr then instr S
Selse instr | Ꜫ

TEMA 4.4.2 PRIMERO Y SIGUIENTE


Ejemplo:
ETE’
E’+TE’ | -TE’ | Ꜫ
TFT’
T’*FT’ | /FT’ | Ꜫ
F ( E ) | num | id

Encontrar los PRIMEROS (P) y SIGUIENTES (S) de la gramática.

P(E) = { ( , num , id } Por lo tanto:


P(E’)= { + , - , Ꜫ } P(F)=P(T)=P(E)={ ( , num , id }
P(T) = { ( , num , id } P(E’) = { + , - , Ꜫ }
P(T’)= { * , / , Ꜫ } P(T’) = { * , / , Ꜫ }
P(F) = { ( , num , id }

S(E) = { ) , $ }
S(E’) = { ) , $ }
S(T) = { + , - , $ , ) } Por lo tanto:
S(T’) = { + , - , $ , ) } S(E’) = S(E) = { ) , $ }
S(F) = {+ , - , * , / , $ , ) } S(T’) = S(T) = { + , - , $ , ) }
S(F) = {+ , - , * , / , $ , ) }

QUITAR RECURSIVIDAD POR LA DERECHA


SSa | Sb | c | d Siguiendo la regla:
S cR | dR AAἀ | ẞ
RaR | bR| Ꜫ A ẞR
RἀR | Ꜫ

Entrada: cba

Gramáticas LL(1)
Left to Right
Left most derivation
No terminal Id + * ( ) $
ETE’ E ETE ETE’
E’+TE’E | Ꜫ E’
T TFT’
E’+TE’
TFT’
E’ Ꜫ E’ Ꜫ

TFT’ T’
F Fid
T’ Ꜫ T’*FT’
F( E )
T’ Ꜫ T’ Ꜫ

T’*FT’ | Ꜫ
F ( E ) | id
Cadena entrada id + id * id
TE’
FT’E’
IdT’E’
id ꜪE’
id Ꜫ+TE’
id Ꜫ+FT’E’
id Ꜫ+idT’E’
id Ꜫ+id*FT’E’
id Ꜫ+id*idT’E’
id Ꜫ+id*id ꜪE’
id Ꜫ+id*id Ꜫ Ꜫ

Coincidencia Pila Entrada Acción


E$ Id+id*id$
TE’$ Id+id*id$ ET’E
FT’E’$ Id+id*id$ TFT’
IdT’E’$ Id+id*id$ Fid
Id T’E’$ +id*id$ Relacionar(id)
Id E’$ +id*id$ T’ Ꜫ
Id +TE’$ +id*id$ E’+TE’
Id+ TE’$ Id*id$ Relacionar(+)
Id+ FT’E’$ Id*id$ TFT’
Id+ IdT’E’$ Id*id$ Fid
Id+id T’E’$ *id$ Relacionar(id)
Id+id *FT’E’$ *id$ T*FT’
Id+id* FT’E’$ Id$ Relacionar(*)
Id+id* IdT’E’$ Id$ Fid
Id+id*id T’E’$ $ Relacionar(id)
Id+id*id E’$ $ T’ Ꜫ
Id+id*id $ $ E’ Ꜫ

Analizador Sintáctico LR(k)


Left to Right
Right most derivation
A.XYZ
AX.YZ
AXY.Z
AXYZ.

Cerradura de conjunto de elementos Cerradura(I)


1. Al principio agregar cada elemento en I a CERRADURA(I)
2. Si Aἀ Bẞ está en CERRADURA(I) y Bγ es una producción, entonces agregar el elemento Bγ a
CERRADURA(I), si no se encuentra ahí. Aplicar esta regla hasta que no puedan agregarse más elementos nuevos
a CERRADURA(I)
EJERCICIOS, PROGRAMAS Y FIGURAS fueron obtenidas del libro de Compiladores, Aho., pero la mayoría fueron
dibujadas e insertadas por el mismo autor.

EJERCICIOS DE PRÁCTICA
GRAMÁTICA LL(1)
SE
SE APLICANDO
ETE’
EE+T | T AAα |β
E’+TE | Ꜫ

TT*F | F TFT’
A Βr
Fid | ( E ) T’*FT’ | Ꜫ
R αR | Ꜫ
F id | ( E )

FUNCIÓN PRIMERO & SIGUIENTE

PRIMERO ( E ) ={( , id }
PRIMERO ( E' ) ={+ , Ꜫ }
PRIMERO ( T )={¿
PRIMERO ( T ' )={∗, Ꜫ }
PRIMERO ( F )={¿

Reglas para calcular la función Siguiente:

SIGUIENTE ( A ) → $
A → αB
° SIGUIENTE ( B ) → SIGUIENTE ( A )
A → αBᵦ
° SIGUIENTE ( B ) → PRIMERO ( ᵦ ) ∄ ε

° SIGUIENTE ( B ) → PRIMERO ( ᵦ ) ∪ SIGUIENTE( A)

SIGUIENTE ( E )={), $ }
SIGUIENTE ( E' )={) , $ }
SIGUIENTE ( T )= {+ , ) , $ }
SIGUIENTE ( T ' )= {+ , ) , $ }
SIGUIENTE ( F )= {¿ ,+ , ) , $ }

TABLA DE ANÁLISIS SINTÁCTICO

NT / T + * ( ) id $
E TE’ TE’
E’ +TE’ Ꜫ Ꜫ
T FT’ FT’
T’ Ꜫ FT’ Ꜫ Ꜫ
F (E) id

Validar la siguiente cadena: id * id + id

COINCIDENCIA PILA ENTRADA ACCIÓN


E$ Id*id+id$
TE’$ Id*id+id$ ET’E
FT’E’$ Id*id+id$ TFT’
IdT’E’$ Id*id+id$ Fid
id T’E’$ *id+id$ Consumir(id)
id *FT’E’$ *id+id$ T’*FT’
Id* FT’E’$ Id+id$ Consumir(*)
Id* IdT’E’$ Id+id$ Fid
Id*id T’E’$ +id$ Consumir(id)
Id*id E’$ +id$ T’Ꜫ
Id*id +TE’$ +id$ E’+TE’
Id*id+ TE’$ Id$ Consumir(+)
Id*id+ FT’E’$ Id$ TFT’
Id*id+ IdT’E’$ Id$ Fid
Id*id+id T’E’ $ Consumir(id)
Id*id+id E’$ $ TꜪ
Id*id+id $ $ E’Ꜫ

EJERCICIO SRL DE PRÁCTICA (diferente al mostrado en el


tutorial)
GRAMÁTICA AUMENTADA
CALCULAMOS PRIMERO Y SIGUIENTE DE LA GRAMÁTICA
1. P →. S
2. S →. id X
3. S →. id Y end
4. X → . otro
5. X →.Ꜫ
6. Y →. begin X end
7. Y →. Ꜫ

Determinamos los estados que conformarán al autómata aplicando las funciones CERRADURA e IR_A
I 0=CERRADURA ( { P→ . S } )= { P → . S , S → . id X , S → .id Y end }
I 1=ir a (I 0 , S)=CERRADURA ( { P → S . } )={ P → S . }
I 2=ir a (I 0 , id )=CERRADURA ( { S → id . X , S → id .Y end } ) ={ S → id . X , S → id .Y end , X →. otro , X → . ,Y → .begin X end

I 3=ir a ( I 2 , otro)=CERRADURA ( { X → otro . } )= { X → otro . }


I 4=ir a ( I 2 , X )=CERRADURA ( { S →id X . } )={ S →id X . }
I 5=ir a ( I 2 , Y )=CERRADURA ( { S → id Y . end } ) ={ S → id Y . end }
I 6=ir a ( I 5 , end )=CERRADURA ( { S → id Y end . } )={ S →id Y end . }
I 7=ir a ( I 2 , begin)=CERRADURA ( {Y → begin . X end } )= {Y → begin . X end , X → . otro , X →. }
I 8=ir a ( I 7 , X )=CERRADURA ( { Y →begin X . end } )={ Y →begin X . end }
I 9=ir a ( I 7 , otro)=CERRADURA ( { X → otro . } ) ={ X → otro . }=I 3

Dado que I 9=I 3 simplemente se efectúa I 3=δ (I 7 , otro) y reutilizamos I 9

I 9=ir a ( I 8 , end )=CERRADURA ( { Y → begin X end . }) ={ Y →begin X end . }

Se construye el autómata con sus respectivos estados

I3
I0 I2 otro
id Xotro.
P.S Sid.X
S.id X Sid. Y end
S.id Y end X.otro
begin otro
X.
S Y.begin X end
Y.
I7

Ybegin . X end
I1 X X.otro
Y
X.
APS.
I5 X

Sid Y. end I8
I4 Y begin X . end

Sid X. end
end
Autómata reducido para su mejor comprensión

Autómata reducido construido en http://madebyevan.com/fsm/

ESTADO / Terminal id otro begin end $ S X Y


0 D2 D1
1 ACEPTA
R
2 D3 D7 R4,R6 D4 D5
3 R3 R3
4 R1
5 D6
6 R2
7 D3 R4 D8
8 D9
9 R5

Analizar la siguiente cadena: id begin otro end end

Estado Entrada Salida Pila Acción Detalles


0 Id begin otro end end$ 0 D2
2 Id begin otro end end$ 0,2 D7
7 Id begin otro end end$ 0,2,7 D3
3 Id begin otro end end$ 3 0,2,7,3 R3 POP(1)
7 Id begin X end end$ 0,2,7 D8
8 Id begin X end end$ 0,2,7,8 D9
9 Id begin X end end$ 3,9,8,7 0,2,7,8,9 R5 POP(3)
2 Id Y end$ 0,2 D5
5 Id Y end$ 0,2,5 D6
6 Id Y end$ 3,9,8,7,6,5,2 0,2,5,6 R2 POP(3)
0 S$ 0 D1
1 S$ 0,1 ACEPTAR