30/06/16
TEMARIO
Objetivo general: Desarrollar un software de base traductor, interprete o
compilador.
Competencias previas: definir, disear, construir, y programar las fases del
analizador lxico semntico de un traductor o compilador.
UNIDAD 1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
ANALIZADOR SEMNTICO
Arboles de expresiones
Acciones semnticas de un analizador sintctico
Comprobaciones de tipos de expresiones
Pila semntica en un analizador sintctico
Esquema de traduccin
Generacin de la tabla de smbolo y direcciones
Manejo de errores semnticos
CRITERIOS DE EVALUACIN
Asistencia 15%
Primera parte del programa 35%
Examen 30%
Apuntes en digital 10%
Examen diagnostico 10%
UNIDAD 2
2.1
2.1.1
2.1.2
2.1.3
2.2
2.2.1
2.2.2
2.2.3
2.2.4
2.3
2.3.1
2.3.2
2.3.3
2.3.4
2.3.5
2.3.6
CRITERIOS DE EVALUACIN
Asistencia 10%
Segunda parte del programa 40%
Examen 15%
Apuntes en digital 20%
Ejercicios 15%
UNIDAD 3
3.1
3.1.1
3.1.2
3.1.3
3.1.4
3.2
3.2.1
3.2.2
3.2.3
OPTIMIZACIN
Tipos de optimizacin
Locales
Ciclos
Globales
De mirilla
Costos
Costos de ejecucin (memoria, registros, pilas)
Criterios para manejar el cdigo
Herramientas para el anlisis del flujo de datos
CRITERIOS DE EVALUACIN
UNIDAD 4
4.1
4.2
4.3
4.4
CRITERIOS DE EVALUACIN
Proyecto final de la unidad 1 y 2 terminado 50%
Asistencia 10%
Proyecto de la unidad 3 terminado 50%
EXAMEN DIAGNOSTICO
LENGUAJES Y AUTMATAS ll
30/06/16
Fase de anlisis
Fase de Sntesis
UNIDAD 1
ANALIZADOR SEMNTICO
01/07/16
UNIDAD 1
EE+T|ET|T
1
2
3
PRODUCCIN
E1 E 2 + T
E1 E 2 - T
E1 T
REGLAS SEMNTICAS
E1.val = E2.val + T.val
E1.val = E2.val - T.val
E1.val = T.val
ANALIZADOR
SINTCTICO
EJERCICIOS:
TT*F|F
1
2
PRODUCCIN
T1 T2 * F
T1 F
REGLAS SEMNTICAS
T1.val = T2.val * F.val
T1.val = F.val
F (E) | num
1
2
PRODUCCIN
F1 (E)
F1 num
REGLAS SEMNTICAS
F1.val = (E.val)
F1.val = lexema.val
REGLAS SEMNTICAS
L1 E \n
L1 print(E.val)
E E+ T
1
PRODUCCIN
E1 E 2 + T
REGLAS SEMNTICAS
E1.val = E2.val + T.val
ET
1
PRODUCCIN
E1 T
REGLAS SEMNTICAS
E1.val = T.val
T T * F
1
PRODUCCIN
T1 T2 * F
REGLAS SEMNTICAS
T1.val = T2.val * F.val
F((E))
1
PRODUCCIN
F((E))
REGLAS SEMNTICAS
F((E)).val
F DIGITO
1
PRODUCCIN
F1 DIGITO
REGLAS SEMNTICAS
F1.val = lexema.val
a) ((4+2)+3)-1
1
b) (2*3)-((10/5))/2
3
10
c) 100/(5**2)
/
100
**
TAREA:
OPERACIONES BSICAS DE UN AVL
Insercin
En un rbol AVL tras realizar la incercion hay que comprobar que se sigue
manteniendo la condicin de equilibrio, o lo que es lo mismo, que la altura de
un subrbol izquierdo y derecho difieran en una unidad o sean iguales. Si se
produce un desequilibrio hay que reequilibrar la estructura para que siga
siendo un rbol AVL. El reequilibrado se produce de abajo hacia arriba sobre
los nodos en los que se produce el desequilibrio.
Eliminacin
al eliminar un nodo en un rbol AVL puede afectar el equilibrio de sus nodos.
Entonces hay que hacer rotaciones simples o dobles.
Eliminas un nodo como lo hacemos en un rbol binario ordenado. Al localizar
el nodo que queremos eliminar seguimos entre procedimiento:
Si el nodo es un nodo hoja, simplemente lo eliminamos.
Si el nodo solo tiene un hijo, los sustituimos con su hijo.
Si el nodo eliminado tiene dos hijos, los sustituimos por el hijo
derecho y colocamos el hijo izquierdo en el subrbol izquierdo del hijo
derecho.
Rotaciones
Esta rotacin se usar cuando el subrbol izquierdo de un nodo sea 2 unidades
ms alto que el derecho, es decir, cuando se FE sea de -2.
ARBOLES
04/07/16
(A+B)+C
X*(y/-z)
(A+Y) * (A-B)
*
+
A
A
A+[(B*-(C+D))]
+
[A*(x+y)]*C
23*(4+5)
*
^
4
2
Participacin
a) x*y / [(a+b)+C]
*
+
x
b) (x*y/a)+(b*c)
+
/
b
*
RBOL AVL
Es un rbol binario de bsqueda, donde la diferencia de alturas de cada subrbol
es 1.
Para saber que un rbol AVL est equilibrado la altura de la ramificacin tanto de
lado derecho como el izquierdo deben de tener el mismo nivel o una diferencia de 0
nivel ya sea de lado izquierdo o de lado derecho.
EL FACTOR DE EQUILIBRIO Y BALANCEO
Tambin pueden ser almacenados directamente en cada nodo o ser computado a
partir de las alturas de los rboles, la diferencia principal de los mtodos de un
rbol binario es que las versiones de un rbol AVL despliega la capa del nuevo
factor de equilibrio.
Las operaciones bsicas de un AVL
1)
2)
3)
4)
Insertar
Rotacin simple (izquierda y derecha)
Rotacin doble (izquierda y derecha)
Eliminar
BALANCE = 1
Implica que la altura subrbol derecho mayor que la altura subrbol derecho
mayor que la altura subrbol izquierdo.
BALANCE = 0
Implica que las alturas de los subrboles son iguales
BALANCE = -1
Implica que la altura subrbol izquierdo es mayor que la altura subrbol
izquierdo.
56
01
15
Supongamos que se dan los siguientes nmeros
en ese orden (ejemplo):
00
20,30,40,35,15,50,55,56,57,58
Si se guardan en un AVL cuantos saltos deben hacer para llegar a 58
57
00
20
02
30
01
40
00
35
50
00
00
30
23
20
55
10
23
15
40
00
11
57
11
35
00
50
00
56
00
58
00
EJERCICIOS:
05/07/16
65
02
20
50
70
10
01
23
82
00
00
50
13
23
00
50
12
23
70
01
11
39
00
82
65
00
01
68
00
b) 3,2,18,5,20,90,77,40,34,12
3
13
18
12
00
20
00
01
90
00
18
22
20
11
01
00
90
00
20
77
10
40
00
18
23
12
00
40
00
2
00
00
11
20
5
90
77
90
01
01
00
00
40
12
10
00
34
00
06/07/16
PROCESO DE UN COMPILADOR
EJEMPLO DE CDIGO
class datos{
String nombre;
Int edad;
String direccin;
Nombre = n;
}
String getNombre(){
Return nombre;
}
Void setEdad( int e){
Edad = e;
}
Int getEdad(){
Return edad;
}
Direccin = d;
}
String getDireccion(){
Return direccin;
}
}
String cadena=jTextArea1.getTex();
y la asigna a un text area
For(int n=0;n<smbolos.lenth();n++){
For(int i=0;i<cadena.lenth();i++){
cdigo introducido por el usuario
}
}
String salida=;
StringTokenizer st;
Sin();
//se llama a un mtodo que realiza una accin si la salida es nula
}
Else{
PRACTICA 1 TOKENS
OBJETIVO: Realizar un programa que pueda generar Tokens
package lenguajes_y_automatas_ii;
import java.util.Scanner;
public class practica_1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int edad;
String nombre,direccion;
System.out.println("cual es tu nombre?");
nombre=in.nextLine();
System.out.println("Cual es tu direccion?");
direccion=in.nextLine();
System.out.println("Cual es tu edad?");
edad=in.nextInt();
System.out.println("Nombre: " + nombre + " Direccion: " + direccion + " Edad:
" + edad);
}
}
PRACTICA 3 Tokenizer
07/07/16
import java.util.StringTokenizer;
//
importamos
la
StringTokenizer para
utilizar sus metodos
// inicio de la clase
// se declara una
cadena
de
caracteres
los
cuales
seran
analizados por el
metodo tokenizer
// se declara un
objeto de tipo
StringTokenizer
el cual separara
la cadena de
caracteres cada
que
encuentre
un =
// metodo main
String string="An=Example=String;"+"String=Tokenizer;";
while(token.hasMoreTokens()) {
clase
poder
//
imprime
los
tokens
marcando un espacio, cada
que
encuentra
una
coincidencia con un =
PRACTICA 4
comienza
a:=b3;
Termina;
Lexema1
comienza
a
:
=
b3
;
Termina
;
Tipo de token
Palabra reservada
Identificador
Smbolo especial
Smbolo de asignacin
Identificador
Smbolo especial
Palabra reservada
Smbolo especial
rbol sintctico
Expresin
Expresin de asignacin
Expresin
Expresin
Expresin subndice
Expresin subndice
Palabra reservada
Identificador
Smbolo especial
comienza
IdentificadorSmbolo especial
Palabra reservada
Smbolo especial
b3
termina
rbol semntico
Expresin de asignacin
Expresin subndice
Palabra reservada
IdentificadorSmbolo especial
comienza
:
a
Expresin subndice
ANEXOS
1. Anlisis semntico
1.1 Arboles de expresiones
Los rboles de expresiones representan el cdigo de nivel del lenguaje en
forma de datos. Los datos se almacenan en una estructura con forma de
rbol. Cada nodo del rbol de expresin representa una expresin, por
ejemplo, una llamada al mtodo o una operacin binaria, como x < y.
Un rbol de expresin sirve para evaluar expresiones del tipo: (a + b) * c/d
Para que un rbol represente una expresin se deben tomar en cuenta 2
caractersticas muy importantes:
Cualquier hoja est etiquetada slo con un operando.
Cualquier nodo interior n est etiquetada por un operador.
Al
introducir
la
expresin
debemos de tomar en cuenta las siguientes caractersticas:
La raz siempre debe ser un operador.
Las hojas siempre deben ser operandos.
Los nodos deben estar etiquetados por operadores.
Si un operador tiene mayor prioridad que la raz se coloca como hijo.
Si un operador tiene igual o menor prioridad que un nodo se coloca
como padre.
Un nodo puede contener como hijo otro subrbol que contiene una
pequea expresin.
Gramtica: G (N, T, P, S)
o
o
o
o
N = No terminales.
T = Terminales.
P = Reglas de Produccin.
S = Axioma Inicial.
Traduccin descendente
Se trabaja con esquema de traduccin en lugar de hacerlo con
definiciones dirigidas por sintaxis, as que se puede ser explcito en
cuanto al orden en que tienen que lugar las acciones y las
evaluaciones de los atributos.
o
p
q
r
s
t
u
Tipo
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
v
w
x
y
z
.
(
)
;
+
=
/
*
%
|
&
!
1
2
3
4
5
6
7
8
9
0
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Carcter
Operador matemtico
Operador matemtico
Operador matemtico
Operador matemtico
Operador matemtico
Operador matemtico
Comilla simple
Operador lgico
Operador lgico
Operador lgico
Carcter numrico
Carcter numrico
Carcter numrico
Carcter numrico
Carcter numrico
Carcter numrico
Carcter numrico
Carcter numrico
Carcter numrico
Carcter numrico
UNIDAD 2
GENERACIN DE
CDIGO
INTERMEDIO
UNIDAD 2
2.1
2.1.1
2.1.2
2.1.3
2.2
2.2.1
2.2.2
2.2.3
2.2.4
2.3
2.3.1
2.3.2
2.3.3
2.3.4
2.3.5
2.3.6
CRITERIOS DE EVALUACIN
Asistencia 10%
Segunda parte del programa 40%
Examen 15%
Apuntes en digital 20%
Ejercicios 15%
13/07/16
(6+4) * 8 (7+4)
Expresin prefija
*+648+74
Procedimiento
(6+4) * 8 (7+4)
cont.
0
1
Tope
-1
0
pila
2
3
4
5
6
7
1
-1
0
1
2
-1
) 4+7( 8* )4+ 6 (
0 1 2 3 4 5 6 7 8 9 10 11
4 7 + 8 4 6 + *
Ejercicio: pasar la expresin de infija a postfija (izquierda a derecha)
(6+4) *8(7+4)
Cont
-1
-1
7
8
pila tope
)1 2
+2 1
(3 0
4
-1
)5 3
+6 2
(
1
*
0
Ejercicios
14/07/16
pila
A*B/(A+C)
(
+
)
1
0
-1
Procedimiento
A*B/(A+C)
Cont
*
/
tope
0
1
2
pila
1
0
-1
3
Procedimiento
A*B/(A+C)
Cont
tope
pila
-1
tope
pila
tope
pila
0
1
2
3
4
5
6
/*AB+AC
Procedimiento
A*B/A+C
Cont
*
/
+
0
1
2
3
2
1
0
-1
Procedimiento
A*B/A+C
Cont
0
1
2
-1
3
4
5
6
C
+/*ABAC
Procedimiento
(A-B)*C+D
Cont
(
)
*
+
tope
pila
4
1
2
3
3
2
1
0
-1
Cont
tope
pila
tope
pila
4
Procedimiento
(A-B)*C+D
-1
1
2
3
4
5
6
D
+*-ABCD
De infija a posfija
Procedimiento
A*B/(A+C)
Cont
)
+
(
/
*
0
1
2
3
0
-1
3
2
1
Procedimiento
A*B/(A+C)
Cont
tope
0
pila
-1
1
2
3
4
5
6
A
ABAC+/*
Procedimiento
A*B/A+C
Cont
+
/
*
0
1
2
3
tope
pila
tope
pila
tope
pila
2
1
0
-1
Procedimiento
A*B/A+C
Cont
0
1
2
3
-1
4
5
6
A B A
ABAC+/*
Procedimiento
(A-B)*C+D
Cont
)
(
0
1
2
1
0
-1
Procedimiento
(A-B)*C+D
1
Cont
0
+
*
tope
-1
3
pila
4
A
Procedimiento
(A-B)*C+D
1
Cont
0
tope
pila
tope
pila
tope
-1
pila
tope
pila
2
3
4
5
6
A
AB-CD+*
De prefijas a posfijas
Procedimiento
/*AB+AC
+
*
/
A
Cont
0
1
2
3
2
1
0
-1
Procedimiento
/*AB+AC
Cont
0
1
2
3
4
5
6
*
/
+
0
1
2
3
ABAC+*/
Procedimiento
+/*ABAC
Cont
2
1
0
-1
Procedimiento
+/*ABAC
Cont
0
1
2
3
tope
-1
pila
tope
pila
4
5
6
A
ABAC*/+
Procedimiento
+*-ABCD
Cont
*
+
2
1
2
1
0
-1
Procedimiento
+*-ABCD
Cont
0
tope
pila
tope
pila
-1
1
3
4
5
6
ABCD-*+
Expresin infija pasar a prefija y posfija
(2+(3*4))=x
INFIJA A PREFIJA
Procedimiento
(2+(3*4))=x
Cont
(
*
)
)
=
0
1
2
4
3
2
1
0
-1
x
Procedimiento
(2+(3*4))=x
Cont
(
+
0
1
tope
2
3
4
5
x
pila
1
0
-1
Procedimiento
(2+(3*4))=x
Cont
0
1
tope
pila
-1
2
3
4
5
6
De infija a posfija
Procedimiento
(2+(3*4))=x
)
*
(
+
(
+2=*34x
+
Cont
tope
4
3
2
1
0
-1
pila
Cont
tope
1
0
-1
pila
0
1
2
Procedimiento
(2+(3*4))=x
=
)
0
1
2
3
4
5
Procedimiento
(2+(3*4))=x
Cont
0
1
2
tope
pila
-1
3
4
5
6
2
3
4
234*+x=
18/07/16
CDIGO
<DOCTYPE html>
<html>
<head>
<title>Conversor</title>
<meta charset="utf-8">
<script type="text/javascript">
// variables para resolver el ejercicio
var expresion;
var PILA="";
var ARREGLO="";
// funcin que recibe un entero el cual verifica si es prefija o posfija
function set(i){
expresion=document.getElementById("expresion").value;
// si la expresin esta vaca manda un mensaje
if(expresion!=""){
// selecciona el mtodo a usar
switch(i){
case 0:
prefija();
break;
case 1:
posfija();
break;
}
}else{
resultado.value="No hay una expresin";
}
}
// funcin que resuelve el mtodo prefijo
function prefija(){
// iteracin de la expresin de izquierda-derecha
for (var i = expresion.length - 1; i >= 0; i--) {
// si el id es 0 se coloca el caracter en el arreglo
// si el id es 1 se coloca el carcter en la pila
// si sale otro id se vaca la pila
switch(getId(expresion.charAt(i))){
case 0:
ARREGLO+=expresion[i];
break;
case 1:
if(PILA==""){
PILA=expresion.charAt(i);
}else{
PILA+=","+expresion.charAt(i);
}
break;
default:
vaciarPila();
}
}
// verifica que la pila est vaca
checarPila();
// se obtiene la expresin final en la variable res
var res="";
// se itera el arreglo para obtener la expresin final
for (var i = ARREGLO.length - 1; i >= 0; i--) {
res+=ARREGLO[i];
}
// se retorna la expresin final
document.getElementById("resultado").value=res;
// se limpia la pila y el arreglo
// para prepararse para una nueva expresin
PILA="";
ARREGLO="";
}
// funcin que resuelve el mtodo posfijo
function posfija(){
// iteracin de la expresin de izquierda-derecha
for (var i = 0; i < expresion.length; i++) {
// si el id es 0 se coloca el caracter en el arreglo
// si el id es 1 se coloca el carcter en la pila
// si sale otro id se vaca la pila
switch(getId(expresion.charAt(i))){
case 0:
ARREGLO+=expresion[i];
break;
case 1:
if(PILA==""){
PILA=expresion.charAt(i);
}else{
PILA+=","+expresion.charAt(i);
}
break;
default:
vaciarPila();
}
}
// verifica que la pila esta vaca
checarPila();
// se obtiene la expresin final en la variable res
var res="";
// se itera el arreglo para obtener la expresin final
for (var i = 0; i < ARREGLO.length; i++) {
res+=ARREGLO[i];
}
// se retorna la expresin final
document.getElementById("resultado").value=res;
// se limpia la pila y el arreglo
// para prepararse para una nueva expresin
PILA="";
ARREGLO="";
}
// retorna un entero que ayudara a tomar la decisin
// para meter el carcter en el arreglo, pila o vaciar la pila
function getId(caracter){
}
//limpia la pila
PILA="";
}
// funcin que checa la pila para ver
// si necesita ser vaciada
function checarPila(){
// si la pila no est vaca se llama a la funcin vaciarPila
if(PILA!=""){
vaciarPila();
}
}
</script>
</head>
<body>
<center>
<h1>Conversor de expresiones</h1>
</center>
<br>
<br>
<br>
<center>
<strong>Expresin:</strong><br><input type="text"
id="expresion"><br><br>
<strong>Resultado</strong><br>
<input type="text" id="resultado"><br><br>
<input type="submit" value="Prefija" onclick="set(0)">
<input type="submit" value="Posfija" onclick="set(1)">
</center>
</body>
</html>
Prueba del cdigo con las siguientes expresiones.
INFIJAS-PREFIJAS
(6+4)*8(7+4)
A*B/(A+C)
(A-B)*C+D
A*B/A+C
INFIJAS-POSTFIJAS
(6+4)*8(7+4)
A*B/(A+C)
(A-B)*C+D
A*B/A+C
PREFIJAS-POSTFIJAS
64+874+*
ABAC+/*
AB-CD+*
ABAC+/*
ACTIVIDAD
19/07/16
Clculos finales:
Tercetos resultantes:
expra = IDa
expr3 = NUM3
exprb = IDb
exprtmp1 = expr3 + exprb
expr7 = NUM7
exprtem2 = exprtmp1 + expr7
exprc = IDC
exprtemp3 = exprtemp2 + exprc
asiga =expra = exprtmp3
:=
a
Asiga
exprc
tem1
Asig=a=b
Asigb
Asigc
tem2
20/07/16
tem4
x
tem5
Tercetos resultantes:
Clculos finales:
Tem1 = a * b
Tem1 representa a * b
Tem2 = c * d
Tem2 representa a c * d
Tem4 = tem1 + tem2
Tem4 representa tem1 + tem2 = a * b + c* d
PRACTICA 2: INSTRUCCIONES DE CONTROL
Tem3 = e * f
Tem3 representa e * f
Tem5El
= alumno
tem4 tem
Tem
tem4 tem
3
3= a * b + c * d e * f
OBJETIVO:
aplicara
las sentencias
de5 representa
control, funciones
y estructuras,
Y
X
=
tem
X
representa
tem
5
5= a * b + c * d e * f
recordara conocimientos necesarios para llevar a cabo la estructura de su
traductor.
PRCTICA 3
Con base al programa anterior, realizar un programa que realice lo
siguiente:
"Escriba el resultado (1 = aprobado, 2 = reprobado)" y que al usuario le
pidan 10 veces el ingreso de 1 o 2, y al final de ingresar esos 10
nmeros, tiene que dar como resultado de la suma de cuantas veces
ingresaron 1 o 2.
package unidad_2;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class practica3 {
public static void main(String[] args) {
Scanner m = new Scanner(System.in);
String n;
int c1=0,c2=0;
for (int i = 0; i < 10; i++) {
n = JOptionPane.showInputDialog("Ingrese 10 veces 1 2\n Si es:\n 1
aprobado \n 2 reprobado ");
int num = Integer.parseInt(n);
if (num == 1) {
c1++;
}else{
c2++;
}
}
UNIDAD II GENERACIN DE
CDIGO INTERMEDIO
EXPOSICIN
21/07/16
2.2.4 Cudruplos
Un cudruplo es una estructura de tipo de registro con cuatro campos que se
llamaran:
op
arg1
arg2
resultado
Donde:
EJEMPLOS:
(A+B)*(C+D)-E
OPERADO
R
+
+
*
-
OPERAND
O1
A
C
Temp1
Temp3
OPERAND
O2
B
D
Temp2
E
RESULTADO
Temp1
Temp2
Temp3
Temp4
OPERAND
O1
base
Temp1
Temp2
OPERAND
O2
altura
2
RESULTADO
Temp1
Temp2
rea
En los triplos es referenciado el valor intermedio hacia el nmero del triplo que lo
creo, pero en los cudruplos requiere que ellos tengan nombres implcitos.
Los triplos tienen una ventaja obvia de ser ms consistentes, pero ellos dependen
de su posicin, y hacen que la optimizacin presente cambios de cdigo mucho
mas compleja.
EJERCICIOS: Construya los siguientes cuadruplos
Volumen = (2*PI*R) * Altura
OPERADO
R
*
*
*
=
OPERAND
O1
2
Temp1
Temp2
Temp3
OPERAND
O2
PI
R
Altura
RESULTADO
Temp1
Temp2
Temp3
Volumen
(a*b-c)*(x / (a*b))
OPERADO
R
*
/
*
OPERAND
O1
a
Temp1
x
Temp2
OPERAND
O2
b
c
Temp1
Temp3
OPERAND
O1
C
B
Temp2
OPERAND
O2
D
Temp1
RESULTADO
Temp1
Temp2
Temp3
Temp4
A := B + C * D
OPERADO
R
*
+
=
RESULTADO
Temp1
Temp2
A
Deben separarse de tal manera que queden las expresiones una por una de
manera simple.
Por ejemplo:
int a, b, c;
se descompone
respectivamente.
Las variables utilizadas en los programas se clasifican en dos tipos: variables
locales y variables globales.
Variables locales:
Aquella que est declarada para el programa o algoritmo completo.
Para definir variables locales, la definicin debe hacerse inmediatamente
despus de una llave de inicio ({), y la variable deja de existir fuera de la
llave de fin (}) que corresponde a la llave de inicio despus del cul fue
definida la variable.
Ejemplo:
{
int a,b;
a=5;
b=a + 100;
}
Variables globales:
Aquella que est declarada y definida dentro de una funcin y slo es vlida dentro
de la misma funcin y no podr utilizarse en otra parte del programa.
Una variable global se declara fuera de cualquier funcin y primero que
cualquier funcin que requiera de ella. Una variable se declara de la
siguiente forma:
Estatuto Condicional.
Las condiciones deben expresarse de manera lo ms sencilla posible de tal forma
que puedan evaluarse en cortocircuito. Por ejemplo una instruccin como:
if (a == b && f!=5 && f%3==0)
se evala primero x = (a==b && f!=5) y = x && f%3==0; if (y)
Las instrucciones de decisin compleja como switch se reducen a una versin
complejas de ifs
Son por as decirlo las normas que regulan nuestras expresiones regulares,
(if,then, else) donde una expresin condicional nos permite elegir que pautas deben ser
encontradas, en base a una condicin.
Nuestros programas pueden tomar decisiones sirvindose de las expresiones
condicionales.
Una expresin condicional responde a los valores de True o False y de acuerdo al
resultado podemos decidir si ejecutar o no un pedazo de cdigo o simplemente no
hacer nada.
if (expresion condicional) {
bloque de cdigo
}
if (expresion condicional) {
bloque de cdigo ; }
else {
bloque de cdigo ;
}
Estatus condicional.
Ejecutar instrucciones dependiendo del valor de una condicin que resulta en un
dato tipo boolean.
Ejemplo:
If Expresin lgica Then
Instrucciones Afirmativo
Else
Instrucciones negativo
End If
Hay otra forma, abreviada, de escribir una sentencia if, aunque es importante
observar que esta expresin no slo compara valores, sino que tambin asigna un
valor a una variable. su sintaxis es:
Variable = (condicin) ? valor1 : valor2
Esta expresin emplea el operador ? para asignar valores a una variable. Si la
condicin resulta verdadera entonces asignavalor1, de lo contrario asignar valor2.
var sCondicin = (user = "Juan") ? "Jefe" : "Empleado" ;
2.3.4 Instrucciones de control
Esta forma de programacin slo permite resolver problemas sencillos.
Para resolver problemas ms complejos, nos puede interesar que dependiendo de
los valores de los datos, se ejecuten unas instrucciones u otras.
Las instrucciones condicionales nos van a permitir representar ste tipo de
comportamiento. Sentencias IF y SWITCH. En otros casos, nos encontraremos con
la necesidad de repetir una instruccin o instrucciones un nmero determinado de
veces. En stos casos utilizaremos instrucciones de control iterativas o repetitivas
(ciclos). Sentencias WHILE, DO-WHILE y FOR.
Estatuto de Ciclos
Los ciclos se descomponen en un ciclo genrico, por lo que ciclos while, for y
do-while tienen la misma representacin interna.
Todo queda en forma de while
Ejemplo:
While (A>B) and (A<=2*B-5) do A:= A+B
el Cdigo intermedio generado ser:
Arreglos.
Los Arreglos se descomponen en estructuras bsicas de manejo de manera simple:
Ejemplo:
char a= Hola;
Se reduce a:
a[0]=H; a[1]=o; a[2]=l; a[3]=a;
2.3.5 Funciones
Las funciones pueden reducir a en lnea, lo que se hace que expandir el cdigo
original de la funcin.
Las funciones se descomponen simplificando los parmetros de manera individual
al igual que el valor de retorno.
Ejemplo:
donde siguiente es una etiqueta que tendr que generar el compilador. El bloque de
condicin saltar a esa etiqueta si la condicin es falsa y a las instrucciones del
bloque si es cierta. Podemos hacer esto en el mtodo de generacin de cdigo de
la siguiente manera:
Objeto NodoSi:
Mtodo generaCdigo()
siguiente:=nuevaEtiqueta();
condicin.c-odigoControl(None, siguiente);
para s en sentencias hacer
s.generaC-odigo();
fin para
emite(siguiente:);
fin generaCdigo
...
fin NodoSi
Si tenemos la sentencia completa:
si condicin entonces
sentenciassi
si no
sentenciassino
fin si
el esquema es el siguiente:
Iteracin
Veremos primero el bucle mientras. Si tenemos una estructura como:
mientras condicin hacer
sentencias
fin mientras
podemos pensar en un esquema similar a:
Seleccin mltiple
Terminaremos con la instruccin de seleccin multiple. Esta estructura se puede
implementar de varias maneras con distintos grados de eficiencia. La forma general
de la estructura es:
opcion expresion
v1: accion1;
v2:accion2;
otro accion x;
fin opcion
La implementacion mas directa es transformar en una serie de sentencias si:
t:=expresion;
si t=v1 entonces
accion1;
si no si t=v2 entonces
accion2;
si no
accion x;
donde t es una variable temporal
Bucles anidados:
Son aquellos que incluyen instrucciones for, while o do-while unas dentro de otras.
Debemos tener en cuenta que las variables de control que utilicemos deben ser
distintas.
Los anidamientos de estructuras tienen que ser correctos, es decir, que una
estructura
anidada
dentro
de
otra
lo
debe
estar
totalmente.
Ejemplo de programa Java con bucles anidados:
/*
* Programa que dibuja un rectngulo slido de asteriscos.
* El nmero de filas y columnas se pide por teclado
*/
import java.util.*;
public class Ejemplo1BuclesAnidados {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int filas, columnas;
//leer nmero de filas hasta que sea un nmero > 0
do{
System.out.print("Introduce nmero de filas: ");
filas = sc.nextInt();
}while(filas<1);
//leer nmero de columnas hasta que sea un nmero > 0
do{
System.out.print("Introduce nmero de columnas: ");
columnas = sc.nextInt();
}while(columnas<1);
for(int i = 1; i<=filas; i++){
//filas
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
Ejemplo de programa Java que contiene una una instruccin switch: Programa que
lee dos nmeros enteros por teclado y un operador (de tipo carcter) y muestra el
resultado de la operacin.
/*
* Programa que pide dos nmeros y un operador y muestra el resultado
*/
import java.util.*;
import java.io.*;
public class Ejemplo1Switch {
public static void main(String[] args) throws IOException{
int A,B, Resultado = 0 ;
char operador;
boolean calculado = true;
Scanner sc = new Scanner(System.in);
System.out.print("Introduzca un numero entero:");
A = sc.nextInt();
System.out.print("Introduzca otro numero entero:");
B = sc.nextInt();
System.out.print("Introduzca un operador (+,-,*,/):");
operador = (char)System.in.read();
switch (operador) {
case '-' : Resultado = A - B;
break;
Ejemplo 2:
/*
* programa que lee una nota y escribe la calificacin correspondiente
*/
import java.util.*;
public class Ejemplo3If {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double nota;
/*
* programa que pide un nmero por teclado y calcula si es par o impar
*/
import java.util.*;
public class EjemploIf {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num;
System.out.println("Introduzca numero: ");
num = sc.nextInt();
if ((num%2)==0)
System.out.println("PAR");
else
System.out.println("IMPAR");
}
}
System.out.println("Hora no vlida");
}
}
.
ACTIVIDADES A REALIZAR
Estructura if
Elaborar un programa que lea un nmero entero por teclado y calcule si es par o
impar. Podemos saber si un nmero es par si el resto de dividir el nmero entre 2
es igual a cero. En caso contrario el nmero es impar. Nota se recomienda el
empleo de una sentencia if
System.out.println("Ingrese el numero");
numero=sc.nextInt();
if (numero%2==0) {
System.out.println("El numero es par: "+numero );
}
else {
System.out.println("El numero es impar: "+numero);
}
}
Estructura switch
Elaborar un programa que simule el funcionamiento de una calculadora que puede
realizar las cuatro operaciones aritmticas bsicas (suma, resta, multiplicacin y
divisin) con valores numricos enteros. El usuario debe especificar la operacin
con el primer carcter del primer parmetro de la lnea de comandos: S o s para la
suma, R o r para la resta, M o m para el producto y D o d para la divisin.
Nota: Se recomienda el empleo de una sentencia switch.
*/ public class Calcula {
public static void main (String [] args) {
char c;
int a,b;
c=args[0].charAt(0);
a = Integer.parseInt(args[1]);
b = Integer.parseInt(args[2]);
switch (c) {
case 'S':
System.out.println("Resultado de la suma: " + (a+b));
break;
case 'R':
System.out.println("Resultado de la resta: " + (a-b));
break;
case 'M':
System.out.println("Resultado del producto: " + a*b);
break;
case 'D':
System.out.println("Resultado de la division: " + a/b);
break;
default:
System.out.println("Por favor, indica la operacion");
break; }
}
}
Estructura For
Crea una aplicacin que dibuje una escalera de nmeros, siendo cada lnea un
nmero. Nosotros le pasamos la altura por teclado.
public class cantidaddefilas {
public static void main(String[] args) {
String t=JOptionPane.showInputDialog("Escribe una altura");
int altura=Integer.parseInt(texto);
dibujaEscaleraNumeros(altura);
}
public static void dibujaEscaleraNumeros (int altura){
for (int numero=1;numero<=altura;numero++){
//Este bucle muestra los numeros en cada fila
for(int i=0;i<numero;i++){
System.out.print(numero);
}
//Saltamos de linea
System.out.println("");
}}}
Estructura while
Muestra los nmeros del 1 al 100 (ambos incluidos). Usa un bucle while.
public static void main(String[] args) {
int num=1;
//Definimos el bucle, incluye el 100
while (num<=100){
System.out.println(num);
//Incrementamos num
num++;
}
}
Estructura Do
Elaborar un programa que muestre los nmeros del 1 al 100 utilizando un bucle do
while
public class Main {
public static void main(String[] args) {
int i = 1;
System.out.println("Numeros del 1 al 100: ");
do{
System.out.println(i);
i++;
}while(i<=100);
}
}
ACTIVIDAD DE LA EXPOSICIN 3
1) Declara 5 variables y 5 constantes
String nombre=;
Int num=56;
Float c=555552;
Int cont=0;
Double x=5.5;
Final int pi=3.1416;
Final String nombre=Maribel;
Final float c=5;
Final double x=85;
Final String c=hola;
2) Int edad=5; //menciona si es variable o constante y porque
Es una variable ya que para que sea una constante se debe de poner la
palabra reservada final.
3) Int aprobado = x; // menciona si es variable o constante y por qu
Es una variable ya que el valor de x no es conocido y su valor puede
cambiar durante su ejecucin.
4) Realiza una expresin de cdigo intermedio
3+58*8
8 -- 64
56
5) X = 1 + 2 3 + 4 * 5 6 / 7 - 8 //menciona si es una expresin de cdigo
intermedio y porqu
Si es una expresin de cdigo intermedio ya que las operaciones se van a
realizar una por una segn la jerarqua de los operadores y va generando
temporales. a
=
b
*
c
/
d
+
e
Temp1
ANEXOS
UNIDAD II
2.1.2 Infija
La expresin o notacin infija es la forma ms comn que
utilizamos para escribir expresiones matemticas, esta notacin se
refiere a que el operador esta entre los operadores. La notacin
infija puede estar completamente parentizada o puede basarse en
un esquema de precedencia de operadores, as como el uso de
parntesis para invalidar los arreglos al expresar el orden de
evaluacin de una expresin:
3*4 = 12
3*4+ = 14
3*(4+2) = 18
La notacin infija tiene el problema de que en expresiones con
ms de un operador existe ambigedad sobre cul es el orden de
evaluacin. Por ejemplo, la expresin 8/4/2 se puede interpretar
como (8/4) /2 o bien 8/ (4/2). Las otras notaciones no sufren este
problema.
La notacin habitual. El orden es primer operando, operador,
segundo operando.
2.1.3 Posfija
Como su nombre lo indica se refiere a que el operador ocupa la
posicin despus de los operandos sus caractersticas principales
son:
El orden de los operandos se conserva igual que la
expresin infija equivalente no utiliza parntesis ya que no
es una operacin ambigua.
La operacin posfija no es exactamente lo inverso a la
operacin prefija equivalente.
El orden es primer operando, segundo operando, operando.
(A+B)*C AB+C*
Ejemplo:
Si deseamos representar las expresiones (2+(3*4)) = xy ((2+3)*4)
= x en las tres notaciones mencionadas, el resultado sera:
(2+(3*4)) = x
((2+3)*4) = x
Notacin postfija
234*+x=
23+4*x=
2.2 Representaciones de cdigo intermedio
2.2.1 Notacin Polaca
La notacin polaca es la originada por un Autmata con pila, en la
que los operadores siempre preceden a los operandos sobre los
que actan, y que tiene la ventaja de no necesitar parntesis:
Se utiliza principalmente para la representacin de
expresiones aritmticas.
Expresin a notacin polaca inversa.
Algoritmo
Representa la expresin en forma de rbol sintctico.
Recorrer el rbol en postorden
Ejemplo: a + b * c-d
Cdigo a b c * + dVentajas
y
notacin polaca
desventajas
de
la
Generacin
de cdigo: simple, no
utiliza registros.
Optimizacin: es difcil de reordenar ya que hay que
considerar el contenido de la pila.
Interpretacin rpida: es muy fcil de interpretar ya que solo
necesita una pila.
Transportable: si, ya que todos los procesadores
implementan una pila.
2.2.2 Cdigo P
El cdigo P comenz como un cdigo ensamblador objetivo estndar
producido por varios compiladores Pascal en la dcada de 1970 y
principios de la de 1980. Fue diseado para cdigo real para una
mquina de pila hipottica la idea era hacer que los compiladores de
Pascal se transportaran fcilmente requiriendo solo que se volviera a
escribir el intrprete de la maquina P para una plataforma, el cdigo
P tambin ha probado ser til como cdigo intermedio y sean
utilizado varias extensiones y modificaciones del mismo en diversos
compiladores de cdigo nativo, la mayor parte para lenguaje tipo
Pascal.
Como el cdigo P fue diseado para ser directamente ejecutable,
contiene una descripcin implcita de un ambiente de ejecucin
particular que incluye tamaos de datos, adems de mucha
informacin especfica para la maquina P, que debe conocer si se
desea que un programa de cdigo P se comprensible. La mquina P
est compuesta por una memoria de cdigo, una memoria de datos
no especfica para variables nombre das y una pila para datos
temporales, junto como cualquiera registro que sea necesario para
mantener la pila y apoyar la ejecucin.
2.2.3 Triplos
<Operador>, <operando1>, <operando2>
El resultado se asocia al nmero de tripleta
Ejemplo: W * X + (Y + Z)
1. *, W, X
2. +, Y, Z
3. +, (1), (2)
Control de flujo:
IF X>Y THEN Z=X ELSE Z=Y+1
1. >, X, Y
2. Saltar si falso, (1), 5
3. =, Z, X
4. Saltar,, 7
5. +, Y, 1
6. =, Z, (5)
2.2.4 Cudruplos
<Operacin>, <operando1>, <operando2>, <resultado>
Ejemplo:
(A+B)*(C+D)-E
+, A, B, T1
+, C, D, T2
*, T1, T2, T3
-, T3, E, T4
Las cudruplas facilitan la aplicacin de muchas optimizaciones,
pero hay que tener un algoritmo para la reutilizacin de las
variables temporales (reutilizacin de registros del procesador).
2.3 Esquema de generacin
Los esquemas de generacin son las estrategias o acciones que se
debern realizarse y tomarse en cuenta en el momento de generar
cdigo intermedio.
Los esquemas de generacin dependen de cada lenguaje. Tomaremos
algunos esquemas de generacin del lenguaje C.
2.3.1 Variables y constantes
Las variables y constantes deben separarse de tal manera que
queden las expresiones una por una de manera simple.
Por ejemplo int a,b,c; se descompone a int a; int b; intc;
respectivamente.
2.3.2 Expresiones
En esta funcin recibe una cadena que representa una lnea de
cdigo intermedio y toma las medidas oportunas para que ese
cdigo se utilice. Estas medidas pueden ser escribir la lnea en un
fichero adecuado, almacenar la instruccin en una lista que
despus se pasar a otros mdulos, o cualquier otra que
necesitemos en nuestro compilador.
Mtodo generaCdigo()
siguiente:=nuevaEtiqueta();
condicin.c-odigoControl(None, siguiente);
para s en sentencias hacer
s.generaC-odigo();
fin para
emite(siguiente:);
fin generaCdigo
...
fin NodoSi
Si tenemos la sentencia completa:
si condicin entonces
sentenciassi
si no
sentenciassino
fin si
el esquema es el siguiente:
Iteracin
Veremos primero el bucle mientras. Si tenemos una estructura
como:
mientras condicin hacer
sentencias
fin mientras
podemos pensar en un esquema similar a:
Seleccin mltiple
Terminaremos con la instruccin de seleccin multiple. Esta
estructura se puede implementar de varias maneras con distintos
grados de eficiencia. La forma general de la estructura es:
opcion expresion
v1: accion1;
v2:accion2;
otro accion x;
fin opcion
La implementacion mas directa es transformar en una serie de
sentencias si:
t:=expresion;
si t=v1 entonces
accion1;
si no si t=v2 entonces
accion2;
si no
accion x;
donde t es una variable temporal
Bucles anidados:
Son aquellos que incluyen instrucciones for, while o do-while unas
dentro de otras.
UNIDAD 3
OPTIMIZACIN
UNIDAD 3
3.1
3.1.1
3.1.2
3.1.3
3.1.4
3.2
3.2.1
3.2.2
3.2.3
OPTIMIZACIN
Tipos de optimizacin
Locales
Ciclos
Globales
De mirilla
Costos
Costos de ejecucin (memoria, registros, pilas)
Criterios para manejar el cdigo
Herramientas para el anlisis del flujo de datos
CRITERIOS DE EVALUACIN
Optimizacin
Sea el ejemplo:
while(a == b) {
int c = a;
c = 5;
}
En este caso es mejor pasar el Int c =a; fuera del ciclo de ser posible.
El problema de la optimizacin en ciclos y en general radica es que muy difcil
saber el uso exacto de algunas instrucciones. As que no todo cdigo de proceso
puede ser optimizado. Otros usos de la optimizacin pueden ser el mejoramiento
de consultas en SQL o en aplicaciones remotas (sockets, E/S, etc.)
3.1.3 Globales
Los costos de ejecucin son aquellos que vienen implcitos al ejecutar el programa.
En algunos programas se tiene un mnimo para ejecutar el programa, por lo que el
espacio y la velocidad de los microprocesadores son elementos que se deben
optimizar para tener un mercado potencial ms amplio.
Las aplicaciones multimedia como los videojuegos tienen un costo de ejecucin
alto por lo cual la optimizacin de su desempeo es crtica, la gran mayora de las
veces requieren de procesadores rpidos (e.g. tarjetas de video) o de mucha
memoria. Otro tipo de aplicaciones que deben optimizarse son las aplicaciones
para dispositivos mviles.
Los dispositivos mviles tienen recursos ms limitados que un dispositivo de
cmputo convencional razn por la cual, el mejor uso de memoria y otros recursos
de hardware tiene mayor rendimiento. En algunos casos es preferible tener la
lgica del negocio ms fuerte en otros dispositivos y hacer uso de arquitecturas
descentralizadas como cliente/servidor o P2P.
Muchos de estos criterios pueden modificarse con directivas del compilador desde
el cdigo o de manera externa. Este proceso lo realizan algunas herramientas del
sistema como los ofuscadores para cdigo mvil y cdigo para dispositivos
mviles.
UNIDAD 4
GENERACIN
DE CDIGO
OBJETO
UNIDAD 4 GENERACIN DE CDIGO OBJETO
4.1
Registros
4.2
Lenguaje ensamblador
4.3
Lenguaje maquina
4.4
Administracin de memoria
CRITERIOS DE EVALUACIN
Proyecto final de la unidad 1 y 2 terminado 50%
Asistencia 10%
Proyecto de la unidad 3 terminado 50%
4.1 Registro
Los registros son la memoria principal de la computadora. Existen diversos
registros de propsito general y otros de uso exclusivo.
Algunos registros de propsito general son utilizados para cierto tipo de funciones.
Existen registros acumuladores, puntero de instruccin, de pila, etc.
Distribucin
La distribucin es el proceso en el que el programa generado puede ejecutarse en
otras mquinas.
Con respecto al ensamblador, la mayora del direccionamiento se hace relativo
para que el programa sea relocalizable por un programa llamado cargador.
En el caso de programas compilados se necesitan de las libreras, si son estticas
se incluyen en el ejecutable por lo que el programa se hace grfico, si son
dinmicas no pero el programa es ms pequeo.
Debido a la complejidad del software actual se necesitan de asistentes para poder
instalar y ejecutar un programa.
Operar sobre registros es ms rpido y eficiente que operar sobre memoria. Por
ello, la adjudicacin eficiente de registros tiene un gran impacto en la performance.
El uso de registros puede dividirse en dos sub-problemas:
Caractersticas
Ejemplo:
Un procesador x86 puede ejecutar la siguiente instruccin binaria como se expresa
en cdigo maquina:
Ensambladores
Ensambladores bsicos: Son de muy bajo nivel, y su tarea consiste bsicamente
en ofrecer nombres simblicos a las distintas instrucciones, parmetros y cosas
tales como los modos de direccionamiento.
Ensambladores modulares, o macro ensambladores: Descendientes de los
ensambladores bsicos, fueron muy populares en las dcadas de los 50 y los 60,
antes de la generalizacin de los lenguajes de alto nivel. Un macroinstruccin es el
equivalente a una funcin en un lenguaje de alto nivel.
Almacenamiento
Una de las principales ventajas del uso del ensamblador, es que se encarga de
administrar de manera transparente para el usuario la creacin de memoria, las
bifurcaciones y el paso de parmetros.
Adems, nos permite acceder directamente a los recursos de la mquina
para un mejor desempeo.
Direccionamiento
Es la forma en cmo se accede a la memoria. Recordar que un programa no puede
ejecutarse sino se encuentra en memoria principal. La forma de acceder a la
memoria depende del microprocesador, pero en general existen dos tipos de
direccionamiento: directo e indirecto.
El direccionamiento directo tambin recibe el nombre de direccionamiento absoluto
y el acceso a las direcciones se hace de manera directa. El direccionamiento
indirecto tambin recibe el nombre de direccionamiento relativo y se basa a partir
de una direccin genrica, generalmente el inicio del programa.
Para acceder a una direccin relativa se suma a la direccin base el nmero de
espacios de memorias necesarias.
El direccionamiento relativo hace a los programas relocalizables e independientes.
Si la direccin base es el inicio de la memoria fija el direccionamiento pasa a ser
una variante de direccionamiento absoluto.
Ejemplo.
Lenguaje de mquina del intel 8088. El cdigo de mquina en hexadecimal se
resalta en rojo, el equivalente en lenguaje ensamblador en magenta, y las
direcciones de memoria donde se encuentra el cdigo, en azul. Abajo se ve un
texto en hexadecimal y ASCII.