Anda di halaman 1dari 111

LENGUAJES Y AUTMATAS II

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

GENERACIN DE CDIGO INTERMEDIO


Notaciones
Prefija
Infija
Posfija
Representacin de cdigo intermedio
Notacin polaca
Cdigo P
Triplos
Cudruplos
Esquema de generacin
Variables y constantes
Expresiones
Introduccin de asignacin
Instrucciones de control
Funciones
Estructuras

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

Proyecto final de unidad 50%


Apuntes en digital 20%
Ejercicios 10%
Asistencia 10%

UNIDAD 4
4.1
4.2
4.3
4.4

GENERACIN DE CDIGO OBJETO


Registros
Lenguaje ensamblador
Lenguaje maquina
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%

EXAMEN DIAGNOSTICO
LENGUAJES Y AUTMATAS ll
30/06/16

NOMBRE DE ALUMNO: Maribel Isidoro Pichardo


1. Qu es un error semntico?
Un error semntico se produce cuando la sintaxis del cdigo es correcta,
pero la semntica o significado no es el que se pretenda. La construccin
obedece las reglas del lenguaje, y por ello el compilador o intrprete no
detectan los errores semnticos. Los compiladores e intrpretes slo se
ocupan de la estructura del cdigo que se escribe, y no de su significado. Un
error semntico puede hacer que el programa termine de forma anormal, con
o sin un mensaje de error. Hablando en trminos coloquiales, puede hacer
que el equipo se quede "colgado".
2. Define que es un operador y un operando
Operadores:
Un operador es el smbolo que determina el tipo de operacin o relacin
que habr de establecerse entre los operandos para alcanzar un
resultado, se clasifican en tres grupos:
Aritmticos.
Relacionales.
Lgicos.
Operandos:
Permiten realizar comparaciones de valores de tipo numrico o carcter.
Estos operadores sirven para expresar las condiciones en los algoritmos.
Proporcionan resultados lgicos.
3. Concepto de rbol binario
Es un rbol en el que ningn nodo puede tener ms de dos subrboles. En
un rbol binario cada nodo puede tener cero, uno o dos hijos (subrboles).
4. Que significa AVL
Son las iniciales de los hombres que idearon este tipo de rbol AdelsonVelskii y Landis en 1962.
Bsicamente un rbol AVL es un rbol binario de bsqueda al que se le
aade una condicin de equilibrio. Esta condicin es que para todo nodo
la altura de sus subrboles izquierdo y derecho pueden diferir a lo sumo
en 1.

5. Realiza un ejemplo de cdigo donde se visualice la optimacin.


int n1 = 5;
int n2 = 10;
suma = n1 + n2;
System.out.println(suma = + suma);
Optimizacin
int n1 = 5;
int n2 = 10;
System.out.println(suma = + (n1 + n2));
6. Define el concepto de altura en un rbol
La altura de un rbol se define como el nivel del nodo de mayor nivel. Como
cada nodo de un rbol puede considerarse a su vez como la raz de un
rbol, tambin podemos hablar de altura de ramas. El rbol del ejemplo tiene
altura 3, la rama 'B' tiene altura 2, la rama 'G' tiene altura 1, la 'H' cero, etc.
7. Concepto de estructura de datos estticos
Memoria esttica es cuando no puede modificarse en tiempo de
ejecucin.
Consideraciones:
Errores en tiempo de ejecucin, ndice fuera de rango
Se debe conocer con anticipacin el tamao de la estructura
Ejemplo: V[3]; M[2][2] ; C[3][5][8] ;
8. Concepto estructura de datos dinmicos.
Memoria dinmica si puede modificarse en tiempo de ejecucin, se
puede aumentar o reducir el tamao de la estructura sin ningn problema
Consideraciones:
Manejo transparente del tamao de la estructura
No se guarda necesariamente en memoria adyacente
Se guarda donde encuentra espacio
9. Escribe la clasificacin que tiene la estructura de datos.
1. Estructuras primitivas y/o simples. Las estructuras de datos primitivas
son aquellas que no estn compuestas por otras estructuras de datos, por
ejemplo: enteros, booleanos y caracteres; las estructuras simples son las
que se construyen de una o ms estructuras, por ejemplo: cadenas, arreglos
y registros.
2. Estructuras lineales y no lineales. Se pueden con binar de varias
maneras para formar estructuras de datos ms complejas. Las 2 clases
principales de estructura de datos complejas son:
Pilas, colas y listas de enlace.

no lineales: Arboles y grafos.


10. Realiza un ejemplo donde explica cmo funciona una lista.
Nos permite almacenar datos de una forma organizada, al igual que los
vectores, pero, a diferencia de estos, esta estructura es dinmica, por lo que
no tenemos que saber "a priori" los elementos que puede contener.
Cada elemento apunta al siguiente excepto el ltimo que no tiene sucesor y
el valor del enlace es null.

11. Explica en que


consiste los siguientes
mtodos:
a) public Nodo (int datos)
Inserta datos en el nodo actual, esto depende en donde este apuntando
el ndice actual.
b) public void establecerDatos(int datos)
Establece la cantidad de datos que contendr la lista.
c) public int ObtenerDatos( )
Regresa los que contiene el nodo de la lista, esto depende en donde
apunte el ndice actual.
d) public void establecerSiguiente( Nodo siguiente)
Recibe un objeto tipo nodo y lo inserta en la lista.
e) public Nodo ObtenerSiguiente ( )
Retorna un objeto tipo nodo dependiendo en donde se encuentre el
ndice actual.
12. Explica cmo se lleva la asignacin dinmica de memoria
En las listas podemos ingresar los datos que nosotros deseemos ya que al
utilizar o punteros podemos enlazar infinidad de nodos como a nosotros nos
convenga. Un nodo que apunta a NULL no va hacia ningn lado, pero si este
nodo apunta a otro nodo tenemos la posibilidad de que en ese nuevo nodo
apunte a otro y as infinitamente
13. Qu es un cdigo muerto?
Es una tcnica de optimizacin de software comnmente llevada a cabo de
forma automtica por un compilador optimizador que consta en eliminar
cualquier tipo de cdigo muerto, cdigo inalcanzable, cdigo redundante y
almacenamiento muerto.
14. Realiza un diagrama de flujo de datos del funcionamiento de un traductor,
representando los nodos como unidades de procesamiento entre crculos o

rectngulos, flechas se denotan el flujo de datos y un par de lneas


horizontales arriba y abajo donde se almacenan las bases de datos.
15. Qu es una declaracin local?

Una variable local es aquella cuyo mbito se restringe a la funcin que la ha


declarado se dice entonces que la variable es local a esa funcin. Esto
implica que esa variable slo va a poder ser manipulada en dicha seccin, y
no se podr hacer referencia fuera de dicha seccin. Cualquier variable que
se defina dentro de las llaves del cuerpo de una funcin se interpreta como
una variable local a esa funcin.
16. Escribe las etapas de un traductor y explica cada una de ellas.
Un traductor es un programa que tiene como entrada un texto escrito en un
lenguaje (lenguaje fuente) y como salida produce un texto escrito en un
lenguaje (lenguaje objeto) que preserva el significado de origen. Ejemplos de
traductores son los ensambladores y los compiladores.

En el proceso de traduccin se identifican dos fases principales:

Fase de anlisis

Fase de Sntesis

UNIDAD 1

ANALIZADOR SEMNTICO

01/07/16

LA FASE DE ANLISIS SEMNTICO


Contiene lo siguientes:
La construccin de la tabla de smbolos para llevar un seguimiento del significado
de los indicadores en el programa. (variables, funciones, tipos, parmetros y
mtodos de paso en funciones).
Realizar la comprobacin e inferencia de los tipos en expresiones y sentencias por
ejemplo que ambos lados de una asignacin tengan tipos adecuados, que no se
declaren variables con el mismo nombre, que los parmetros de llamada a una
funcin tengan tipos adecuados, nmeros de parmetros correctos.

UNIDAD 1

Consideremos la gramtica para la generacin de expresin aritmticas simples


Qu atributos nos interesan en esta gramtica?
EJEMPLO:

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

Realizar las siguientes producciones


L E \ n
PRODUCCIN

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

Ejemplo de rbol semntico

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.

Los mecanismos de reequilibrado de los rboles AVL son:


Rotacin simple
Rotacin doble

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.

Cuando hemos eliminado el nodo

Si el equilibrio del padre del nodo eliminado cambia de 0 a +-1 el algoritmo


concluye.
Si el padre del nodo eliminado cambio de +-1 a 0, la altura del rbol ha
cambiado y se afecte el equilibrio de su abuelo.
Si el equilibrio del padre del nodo eliminado cambia de +-1 a +-2 hay que
hacer una rotacin. Despus de concluirla, el equilibrio del padre podra
cambiar, lo que, a su vez, podra forzarnos a hacer otros cambios (y
probables rotaciones) en toda la ruta hacia arriba a medida que ascendemos
hacia la raz. Si encontramos en la ruta un nodo que cambie de 0 a +-1
entonces terminamos.

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.

Existen 2 tipos de rotaciones:


Rotacin simple a la derecha.
De un rbol de raz (r) y de hijos izquierdo (i) y derecho (d), lo que haremos
ser formar un nuevo rbol cuya raz sea la raz del hijo izquierdo, como hijo
izquierdo, colocamos el hijo izquierdo de i (nuestro i) y como hijo derecho
construimos un nuevo rbol que tendr como raz, la raz del rbol (r), el hijo
derecho de i (d) ser el hijo izquierdo y el hijo derecho ser el hijo derecho
del rbol (d).

Rotacin simple a la izquierda.


De un rbol de raz (r) y de hijos izquierdo (i) y derecho (d), consiste en
formar un nuevo rbol cuya raz sea la raz del hijo derecho, como hijo
derecho colocamos el hijo derecho de d (nuestro d) y como hijo izquierdo
construimos un nuevo rbol que tendr como raz la raz del rbol (r), el hijo
izquierdo de d ser el hijo derecho (i) y el hijo izquierdo ser el hijo del rbol
(i).

Rotacin doble a la derecha.


Esta operacin consta de dos rotaciones simples; el proceso que se sigue es
primero la rotacin simple a la izquierda y luego la rotacin simple a la
derecha.

Rotacin doble a la izquierda.


En esta tambin se emplean dos rotaciones simples solo que el orden de
ellas cambia a primero se realiza la rotacin de la derecha y luego la de la
izquierda.

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

Para insertar un nmero, lo primero que es la raz posterior:


a) Insertar la raz
b) Nmero menor a la izquierda
c) Nmero mayor a la derecha
BALANCE
Los valores posibles de balance pueden ser:

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

Realizar los siguientes AVL


a) 65,50,23,70,82,68,39
65

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

CDIGO FUENTE: Se coloca el cdigo que ser analizado por el compilador.


ANLISIS LXICO: analiza la sintaxis del cdigo que se ha ingresado para poder
continuar con la compilacin en caso de que la sintaxis no sea correcta mandara un
error.
ANLISIS SINTCTICO: ya que el cdigo fue procesado por el analizador lxico,
el cdigo pasa a ser depurado y se empieza a depurar para saber que parte del
cdigo es lgica.
ANLISIS SEMNTICO: este es el analizador ms complejo ya que verifica que
los operadores sean los correctos para poder arrojar un resultado.

GENERACIN DE CDIGO INTERMEDIO: este mdulo se encarga de convertir el


lenguaje de alto nivel a bajo nivel para ser procesado por la computadora.
OPTIMIZACIN: optimiza el cdigo de bajo nivel para que sea ms rpido
procesarlo.
GENERACIN DE CDIGO OBJETO: se crea un archivo con el cdigo de bajo
nivel.
MANEJO DE TABLAS DE SMBOLOS: Se necesita una tabla de smbolos propia
de cada lenguaje para poder analizar el cdigo esta pueden contener smbolos y
palabras reservadas.
MANEJO DE ERRORES: los errores deben de ser tratados y arrojan la informacin
del programa para poder saber qu tipo de error es el que se est generando y
tratar de resolverlo.

EJEMPLO DE CDIGO

class datos{

// inicia la clase datos

String nombre;

// declara variable de tipo cadena

Int edad;

// declara variable de tipo entero

String direccin;

// declara variable de tipo cadena

Void setNombre (String n){

// mtodo que recibe el nombre introducido


y lo guarda en una variable

Nombre = n;
}
String getNombre(){

// retorna el valor del nombre

Return nombre;
}
Void setEdad( int e){
Edad = e;
}

// mtodo que recibe la edad introducida y


la guarda en una variable

Int getEdad(){

// retorna el valor de la edad

Return edad;
}

Void setDireccion(String d){

// mtodo que recibe la direccion


introducida y la guarda en una variable

Direccin = d;
}
String getDireccion(){

// retorna el valor de la direccion

Return direccin;
}
}

Public void lex(){

// declaracin del mtodo lex

String cadena=jTextArea1.getTex();
y la asigna a un text area

// declara una variable de tipo string

String smbolos=1234567890abcdefghijklmnopqrstuvwxyz.:,;=; // declara


una variable de tipo string a la cual le da una cadena de caracteres
permitidos

For(int n=0;n<smbolos.lenth();n++){
For(int i=0;i<cadena.lenth();i++){
cdigo introducido por el usuario

// crea un ciclo for para recorrer la


tabla de simbolos
// crea un ciclo for para recorrer el

If(simbolos.chartAt(n)==(cadena.chartAt(i))){ //se compara la


table de simbolos con el codigo introduciodo por el usuario
JTextArea2.append(Se reconoce el simbolo
cadena.chartAt(i) + \n); // se imprime el caracter
}

}
}

String salida=;

// se declara una variable de salida

StringTokenizer st;

// se declara un objeto de tokens

St = new StringTokenizer (cadena, 1234567890abcdefghijklmnopqrstuvwxyz.:,;=);


// se crea el Nuevo objeto de token y reviza que la cadena cuente con los
requerimientos
For(int i=0;i<cadena.lenth();i++){ //se recorre con el ciclo for la cadena introducida
por el usuario
If(st.hasMoreTokens()){
Salida+=st.nextToken()+\n;

// se reviza si hay mas tokens


//se guarda el token en la variable de salida

If(salida==null){ ){// si la salida es nula no se hace nada

Sin();
//se llama a un mtodo que realiza una accin si la salida es nula
}
Else{

// si no reconoce el carcter pasa al else

JOptionPane.showMessageDialog(null,No puedes pasar a la siguiente etapa); //


se muestra un mensaje emergente al usuario indicndole que no se pudo pasar a
la siguiente etapa
}
}
JTextArea2.append(No se reconoce + salida + \n); // se imprime en el textArea
que no se reconoce dicho carcter

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 2: HACER UN PROGRAMA UTILIZANDO ARREGLOS


package lenguajes_y_automatas_ii;
public class practica_2 {
public static void main(String[] args) {
String grupos[]= {"Heroes del silencio","Caifanes","San Pacualito Rey","Cafe
tacuva","Fobia","Carla
Morrison"};
System.out.println("los grupos musicales son: ");
for (int i = 0; i < 6; i++) {
System.out.println(grupos[i]);
}
}
}

PRACTICA 3 Tokenizer

07/07/16

Objetivo: Aprender a utilizar la clase StringTokenizer, con la finalidad de aplicarla


en mtodo del anlisis lxico.

import java.util.StringTokenizer;

//
importamos
la
StringTokenizer para
utilizar sus metodos

public class practica_3 {

// inicio de la clase

public static void main(String[] args) {

// se declara una
cadena
de
caracteres
los
cuales
seran
analizados por el
metodo tokenizer

StringTokenizer token = new StringTokenizer(string,"=");

// 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

// se inicia un ciclo para


recorrer la cadena de
caracteres

String st1 = token.nextToken();

// retorna el primer token

String st2 = token.nextToken ();

// retorna el segundo token

System.out.println(st1 + "\t" + st2);

//
imprime
los
tokens
marcando un espacio, cada
que
encuentra
una
coincidencia con un =

Diagrama de flujo de datos de un analizador lxico

Diagrama de flujo de datos de compaeros

PRACTICA 4

GENERACIN DE LA TABLA DE SMBOLO Y DE DIRECCIONES.

MANEJO DE ERRORES SEMNTICOS.

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

Identificador Smbolo especial


Palabra reservada
Smbolo especi
b3
;
termina
;

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.

1.2 Acciones semnticas de un analizador sintctico.


Definicin de un analizador sintctico: es la fase del analizador que se
encarga de chequear el texto de entrada en base a una gramtica dada. Y
en caso de que el programa de entrada sea vlido, suministra el rbol
sintctico que lo reconoce.
En teora, se supone que la salida del analizador sintctico es alguna
representacin del rbol sintctico que reconoce la secuencia de Token
suministrada por el analizador lxico.
En la prctica, el analizador sintctico tambin hace:
Acceder a la tabla de smbolos (para hacer parte del trabajo del
analizador semntico).
Chequeo de tipos (del analizador semntico).
Generar cdigo intermedio.

Generar errores cuando se producen.


En definitiva, realiza casi todas las operaciones de la compilacin.
Este mtodo de trabajo da lugar a los mtodos de compilacin
dirigidos por sintaxis.
Manejo de errores sintcticos
Los errores sintcticos son dados por una expresin aritmtica o parntesis
no equilibrados.
El manejo de errores de sintaxis es el ms complicado desde el punto de
vista de la creacin de compiladores. Nos interesa que cuando el compilador
encuentre un error, se recupere y siga buscando errores. Por lo tanto, el
manejador de errores de un analizador sintctico tiene como objetivos:
o Indicar los errores de forma clara y precisa. Aclarar el tipo de error y
su localizacin.
o Recuperarse del error, para poder seguir examinando la entrada.
o No ralentizar significativamente la compilacin.
Tipo de gramtica que acepta un analizador sintctico
Nosotros nos centraremos en el anlisis sintctico para lenguajes basados
en gramticas formales, ya que de otra forma se hace muy difcil la
comprensin del compilador, y se pueden corregir, quizs ms fcilmente,
errores de muy difcil localizacin, como es la ambigedad en el
reconocimiento de ciertas sentencias.
La gramtica que acepta el analizador sintctico es una gramtica de
contexto libre:

Gramtica: G (N, T, P, S)
o
o
o
o

N = No terminales.
T = Terminales.
P = Reglas de Produccin.
S = Axioma Inicial.

1.3 Comprobaciones de tipos de expresiones


La labor de comprobacin de tipos consiste en conferir a las construcciones
sintcticas del lenguaje la semntica de tipificacin y en realizar todo tipo de
comprobaciones de dicha ndole. Por su naturaleza, sin embargo, sta se

encuentra repartida entre la fase de anlisis semntico y la generacin de


cdigo intermedio.
Comprobaciones estticas
Las comprobaciones estticas recogen el compendio de todas
aquellas tareas de carcter semntico que, por su naturaleza, pueden
ser realizadas directamente durante la fase de compilacin mediante
el uso de los artefactos y mecanismos propios de dicha fase. Este tipo
de comprobaciones son beneficiosas puesto que confieren seguridad
a la ejecucin del programa.
Comprobaciones dinmicas
Las comprobaciones dinmicas son aquellas que no se realizan
durante la fase de compilacin y se delegan al momento de la
ejecucin del programa. Ello requiere generar cdigo ejecutable
especficamente diseado para realizar tales comprobaciones. Los
lenguajes con una carga excesiva de comprobaciones dinmicas
generan programas ms largos, lentos e inseguros en ejecucin.
Verificacin de tipos
Comprueba la compatibilidad de tipos de todas las expresiones del
cdigo fuente recuperando la informacin durante la gestin de
declaraciones. Adems, se asegura de que no existe en el programa
ninguna referencia a ningn smbolo no declarado.
Inferencia de tipos
En lenguajes sin tipificacin de variables o con sobrecarga se aplican
tareas de inferencia de tipos en el nivel gramatical de las expresiones
para resolver el tipo de datos de la expresin resultante en funcin del
contexto de evaluacin.

1.4 Pila semntica en un analizador sintctico


Las pilas y colas son estructuras de datos que se utilizan generalmente para
simplificar ciertas operaciones de programacin. Estas estructuras pueden
implementarse mediante arrays o listas enlazadas.
Pila: coleccin de datos a los cuales se les puede acceder mediante un
extremo, que se conoce generalmente como tope. Las pilas tienen dos
operaciones bsicas:
Push (para introducir un elemento)
Pop (para extraer un elemento)
Sus caractersticas fundamentales es que al extraer se obtiene siempre el
ltimo elemento que acabe de insertarse. Por esta razn tambin se conoce
como estructuras de datos LIFO, una posible implementacin mediante listas
enlazadas seria insertando y extrayendo siempre por el principio de la lista.

Las pilas se utilizan en muchas aplicaciones que utilizamos con frecuencia.


Las pilas y colas son estructuras de datos que se utilizan generalmente para
simplificar ciertas operaciones de programacin. Estas estructuras pueden
implementarse mediante arrays o listas enlazadas. Un analizador sintctico
es un autmata de pila que reconoce la estructura de una cadena de
componentes lxicos.
En general, el analizador sintctico inicializa el compilador y para cada
smbolo de entrada llama al analizador morfolgico y proporciona el
siguiente smbolo de entrada.
1.5 Esquema de traduccin
Un esquema de traduccin es una gramtica independiente de contexto en
la que se asocian atributos con los smbolos gramaticales y se insertan
acciones semnticas encerradas entre llaves { } dentro de los lados
derechos de las producciones. Los esquemas de traduccin pueden tener
tantos atributos sintetizados como heredados.
Cuando se disea un esquema de traduccin, se deben respetar algunas
limitaciones para asegurarse de que el valor de un atributo est disponible
cuando una accin se refiera a l. Estas limitaciones, motivadas por las
definiciones con atributos por la izquierda, garantizan que las acciones no
hagan referencia a un atributo que an no haya sido calculado. El ejemplo
ms sencillo ocurre cuando slo se necesitan atributos sintetizados, en este
caso, se puede construir el esquema de traduccin creando una accin que
conste de una asignacin para cada regla semntica y colocando esta
accin al final del lado derecho de la produccin asociada.

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.

Eliminacin de la recursividad izquierda de un esquema de


traduccin
Como la mayora de los operadores aritmticos son asociativos por la
izquierda, es natural utilizar gramticas recursivas por la izquierda
para las expresiones. La transformacin se aplica a esquemas de
traduccin con atributos sintetizados.
Para el anlisis sintctico descendente, se supone que una accin se
ejecuta en el mismo momento en que se expandira un smbolo en la
misma posicin. Un atributo heredado de un smbolo debe ser
calculado por una accin que aparezca antes que el smbolo, y un

atributo sintetizado del no terminal de la izquierda se debe calcular


despus de que hayan sido calculados todos los atributos de los que
depende.
Un atributo heredado de un smbolo debe ser calculado por una
accin que aparezca antes que el smbolo, y un atributo sintetizado
del no terminal de la izquierda se debe calcular despus de que hayan
sido calculados todos los atributos de los que depende. Los
fragmentos de cdigo as insertados se denominan acciones
semnticas. Dichos fragmentos actan, calculan y modifican los
atributos asociados con los nodos del rbol sintctico. El orden en que
se evalan los fragmentos es el de un recorrido primero-profundo del
rbol de anlisis sintctico. Obsrvese que, en general, para poder
aplicar un esquema de traduccin hay que construir el rbol sintctico
y despus aplicar las acciones empotradas en las reglas en el orden
de recorrido primero-profundo. Por supuesto, si la gramtica es
ambigua una frase podra tener dos rboles y la ejecucin de las
acciones para ellos podra dar lugar a diferentes resultados. Si se
quiere evitar la multiplicidad de resultados (interpretaciones
semnticas) es necesario precisar de qu rbol sintctico concreto se
est hablando.
1.6 Generacin de la tabla de smbolo y de direcciones
Las tablas de smbolos (tambin llamadas tablas de identificadores y tablas
de nombres), realizan dos importantes funciones en el proceso de
traduccin: verificar que la semntica sea correcta y ayudar en la generacin
apropiada de cdigo. Ambas funciones se realizan insertando o recuperando
desde la tabla de smbolos los atributos de las variables usadas en el
programa fuente. Estos atributos, tales como: el nombre, tipo, direccin de
almacenamiento y dimensin de una variable, usualmente se encuentran
explcitamente en las declaraciones o ms implcitamente a travs del
contexto en que aparecen los nombres de variables en el programa. Una de
las estructuras de datos que se encuentran relacionadas con las fases del
proceso de compilacin es la tabla de smbolos, la cual tiene como propsito
registrar informacin que se comparte entre varias etapas y que permite
administrar los recursos asociados a las entidades que manipular el
programa. La tabla de smbolos tiene tpicamente la siguiente estructura:
Una tabla de smbolos puede conceptualizarse como una serie de renglones,
cada uno de los cuales contiene una lista de valores de atributos que son
asociados con una variable en particular. Las clases de los atributos que
aparecen en una tabla de smbolos dependen en algn grado de la
naturaleza del lenguaje de programacin para el cual se escribe el
compilador. Por ejemplo, un lenguaje puede ser sin tipos, y por lo tanto el

atributo tipo no necesita aparecer en la tabla. Similarmente, la organizacin


de la tabla de smbolos variar dependiendo de las limitaciones de memoria
y tiempo de acceso.
1.7 Manejo de errores semnticos
Es una de las misiones ms importantes de un compilador, aunque, al
mismo tiempo, es lo que ms dificulta su realizacin. A veces unos errores
ocultan otros. A veces un error provoca una avalancha de muchos errores
que se solucionan con el primero. Es conveniente un buen manejo de
errores, y que el compilador detecte todos los errores que tiene el programa
y no se pare en el primero que encuentre. Hay, pues, dos criterios a seguir a
la hora de manejar errores: Pararse al detectar el primer error. Detectar
todos los errores de una pasada. El anlisis semntico es posterior al
sintctico y mucho ms difcil de formalizar que ste. Se trata de determinar
el tipo de los resultados intermedios, comprobar que los argumentos que
tiene un operador pertenecen al conjunto de los operadores posibles, y si
son compatibles entre s, etc. En definitiva, comprobar que el significado de
lo que se va leyendo es vlido. La salida "terica" de la fase de anlisis
semntico sera un rbol semntico. Consiste en un rbol sintctico en el
que cada una de sus ramas ha adquirido el significado que debe tener. En el
caso de los operadores polimrficos (un nico smbolo con varios
significados), el anlisis semntico determina cul es el aplicable.

PROYECTO UNIDAD 1 (PRIMERA PARTE)


Diseo y solucin al compilador.

El frame principal va a contener 4 jTextAreas los cuales van a desempear 4


funciones distintas y un botn con una imagen tipo play.

jTextArea (cdigo): Este va a servir como contenedor del cdigo principal


del usuario.
Cdigo: Los tokens que confirmaran la estructura de nuestro
lenguaje son los siguientes:
Carcter
a
b
c
d
e
f
g
h
i
j
k
l
m
n

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

Nuestro lenguaje no necesita indicar un inicio o un final, ejecuta y


compila el cdigo introducido as sin ms.

jTextArea (lxico): Este va a servir como contenedor del proceso de la


verificacin de los tokens antes mencionados, si se encuentra un token raro
este primer mdulo nos indicar que hay un error y no permitir la ejecucin
del siguiente modulo (sintctico).
jTextArea (sintctico): Este va a servir como contenedor del proceso
sintctico ya que pasa el primer mdulo (lxico) este proceso es llamado y
comienza la segunda etapa del compilador.
jTextArea (semntico): Este va a servir como contenedor del proceso
semntico ya que pasa el segundo mdulo (sintctico) este proceso es
llamado y comienza la tercera etapa del compilador.

Botn play: Comienza con el proceso de compilacin del cdigo fuente.

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

GENERACIN DE CDIGO INTERMEDIO


Notaciones
Prefija
Infija
Posfija
Representacin de cdigo intermedio
Notacin polaca
Cdigo P
Triplos
Cudruplos
Esquema de generacin
Variables y constantes
Expresiones
Introduccin de asignacin
Instrucciones de control
Funciones
Estructuras

CRITERIOS DE EVALUACIN

Asistencia 10%
Segunda parte del programa 40%
Examen 15%
Apuntes en digital 20%
Ejercicios 15%

EXPRESIN INFIJA CONVERTIR

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

Infijas a prefijas y posfijas


A*B/(A+C)
A*B/A+C
(A-B)*C+D

De infija a prefija (de derecha a izquierda)


Procedimiento
Cont
tope

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=

PRACTICA 1 CONVERSIN INFIJA A PREFIJA / INFIJA A POSFIJA

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){

// variable que se retornara al final


var final=-1;
// if que verifica si el carcter es un numero o una letra
//si esto se cumple retorna 0
if((caracter.charCodeAt()>=48&&caracter.charCodeAt()<=57)||
(caracter.charCodeAt()>=65&&caracter.charCodeAt()<=90)||
(caracter.charCodeAt()>=97&&caracter.charCodeAt()<=122)){
final=0;
// if que verifica si el carcter es un operador para entrar a la pila
// si esto se cumple retorna 1
}else
if((caracter.charCodeAt()>=40&&caracter.charCodeAt()<=43)||
caracter.charCodeAt()==45||caracter.charCodeAt()==47||
caracter.charCodeAt()==61){
final=1;
var pila=PILA.split(",");
// se verifica que el carcter entrante cumpla con
// la regla de los parntesis si esto se cumple
// retorna -1 para que la pila sea vaciada
for (var i = pila.length - 1; i >= 0; i--) {
if((caracter.charAt(0).charCodeAt()==40&&pila[i].charAt(0).charCodeAt()==41)||
(pila[i].charAt(0).charCodeAt()==40&&caracter.charCodeAt()==41)){
final=-1;
}
}
}
//se retorna la variable con la orden a ejecutar
return final;
}
// funcin que vaca la pila
function vaciarPila(){
var pila=PILA.split(",");
// iteracion de la pila para guardarla en el arreglo
for (var i = pila.length - 1; i >= 0; i--) {
// si el caracter es diferente a () guarda el
//caracter en el arreglo
if(pila[i].charAt(0).charCodeAt()!
=40&&pila[i].charAt(0).charCodeAt()!=41){
ARREGLO+=pila[i];
}

}
//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

Lo que nos representa la imagen, es el cmo se va ejecutando el cdigo de alto


nivel en un compilador, a partir de un cdigo fuente, este tiene que ir pasando por
diversas etapas. En cada una de las etapas nos va generando un cdigo en
lenguaje mquina o ensamblador, para que as pueda ser interpretado y se genere
el programa ejecutable con el cual quedara finalizado nuestro software.
El software es dividido en dos partes el frontend (es la parte del diseo de la
aplicacin), que puede ser reutilizado y el backend (parte lgica de la aplicacin).
En cada etapa se tiene que ir generando un tiempo de compilacin, pero esto
depender de cada compilador y del procesador con el cual se est trabajando. El
mismo cdigo fuente se puede llevar a distintos compiladores.

ACTIVIDAD: Del siguiente cdigo fuente realizar clculos intermedios y clculos


finales.

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

expra representa a IDa


expr3 representa a NUM3
exprb representa a IDb
exprtmp1 representa a expr3 + exprb
expr7 representa a NUM7
exprtem2 representa a exprtmp1 + expr7
exprc representa a IDC
exprtemp3 representa a exprtemp2 + exprc
asiga representa a expra = exprtmp3

ACTIVIDAD 2: Realizar las Asignaciones mltiples y el cdigo generado


equivalente y sus clculos intermedios y clculos finales del siguiente cdigo
fuente.

:=

a
Asiga

exprc

tem1

Asig=a=b

Asigb

Asigc

tem2

20/07/16

Realizar resultados intermedios y resultados finales del sig cdigo terceto:


tem3
x := a * b + c * d e * f

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.

a) La clase se debe de llamar SentenciasControl


b) El programa debe de pedir al usuario que ingrese 10 calificaciones y al
final debe de dar el promedio.
package unidad_2;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class SentenciasControl {
public static void main(String[] args) {
Scanner m = new Scanner(System.in);

String calf; //variable que a


int c=0,t=0;
JOptionPane.showMessageDialog(null, "Escriba las 10 calificaciones");
for (int i = 0; i < 10; i++) {
calf = JOptionPane.showInputDialog((i+1) + " Calificacin");
c += Integer.parseInt(calf);
t = c/10;
}
JOptionPane.showMessageDialog(null,"tu promedio es: \n" + t);
}
}

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++;
}
}

JOptionPane.showMessageDialog(null,"APROBADOS: " + c1 + "\n


REPROBADOS: " + c2);
}
}

UNIDAD II GENERACIN DE
CDIGO INTERMEDIO

LEON RUEDA FAUSTO ARMANDO


ISIDORO PICHARDO MARIBEL
GRAVIOTO OROPEZA CLAUDIA
MARTINEZ HERRERA SOCORRO
RODRIGUEZ HERNANDEZ ADRIAN
IBEZ MUOZ SERGIO IVAN
JUSTO DOMINGUEZ RODRIGO
JURADO MEDINA JORGE ALBERTO

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:

arg1, arg2 y resultado pueden ser constantes, identificadores y variables


temporales definidos por el compilador.
El operador representa una operacin arbitraria.

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

rea = (base *altura) / 2


OPERADO
R
*
/
=

OPERAND
O1
base
Temp1
Temp2

OPERAND
O2
altura
2

Diferencias entre triplos y cudruplos.

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

2.4 Esquema 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.

2.3.1 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; int c;

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:

Tipo identificador1, identificador2..ident n;


Ejemplos:
Algunos ejemplos de cmo definir variables son los siguientes:
int alumnos, contador;
float A,B,C;
char Letra;
Declaracin de Constantes.
Para declarar constantes en el lenguaje C, slo basta anteponer el
calificador const seguido del tipo de dato que manejar esa constante (int,char,etc),
y por ltimo el valor que tomar esa variable.
Ejemplo:
const int k = 12
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.
Expresiones aritmticas
Son aquella donde los operadores que intervienen en ella son numricos, el
resultado es un nmero y los operadores son aritmticos. Los operadores
aritmticos ms comnmente utilizados son: +, - , * , / y %.
Comenzamos el estudio por las expresiones aritmticas. Lo que tendremos que
hacer es crear por cada tipo de nodo un mtodo que genere el cdigo para calcular
la expresin y lo emita. Ese cdigo dejar el resultado en un registro, cuyo nombre
devolver el mtodo como resultado.
Para reservar estos registros temporales, utilizaremos una funcin, reserva.
En principio bastar a con que esta funcin devuelva un registro distinto cada vez
que se la llame.

Cada nodo generar el cdigo de la siguiente manera:

Por cada uno de sus operandos, llamara al mtodo correspondiente para


que se evale la sub expresin. Si es necesario, reservara un registro para
guardar su resultado.
Emitir las instrucciones necesarias para realizar el clculo a partir de los
operandos.

2.3.3 Instrucciones de asignacin


La sintaxis general de la instruccin de asignacin es:
nombre_de_la_variable = valor
El valor a la derecha del signo igual puede ser una constante, otra variable o una
expresin que combine constantes y variables, pero siempre la variable y su valor
deben ser del mismo tipo de dato.
Ejemplos:
edad% = 5
area! = 12.3
nombre$ = Pedro
Instrucciones de asignacin compuesta
Las instrucciones de asignacin compuesta realizan primero una operacin en una
expresin antes de asignarla a un elemento de programacin.
Una instruccin de asignacin asigna el valor de una expresin a una variable. En
general, si la variable que se va a asignar es una propiedad, la propiedad debe ser
de lectura y escritura o de slo escritura; en caso contrario, se produce un error de
compilacin. Si la variable es una variable de slo lectura, la asignacin debe
producirse en un constructor Shared o un constructor de instancia apropiado para
el tipo de la variable; en caso contrario, se producir un error de compilacin.
Estatuto de asignacin.
Las operaciones de asignacin deben quedar expresadas por una expresin
sencilla, si est es compleja se debe reducir hasta quedar un operador sencillo.
Ejemplo:
x = a+b/5; debe quedar de la
forma y = b/5; z = a+y; x=z

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:

L1: if A>B goto L2


goto L3
L2: T1:= 2*B
T2:= T1-5
if A
goto L3
L4: A:= A+B
goto L1
L3: . . .

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:

cuadrado(); //Declaramos la funcin


// regresar el cuadrado de un nmero
double cuadrado(double n)
{
return n*n;
}

2.3.6 Estructuras condicionales


Comenzamos por la instruccin condicional.
Tenemos dos versiones distintas segn si existe o no la parte else. Si slo
tenemos la parte si,
si condicion entonces
sentencias
fin si
tendremos que generar una estructura similar a esta:

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:

Sin embargo, puede ser ms eficiente una estructura como la siguiente:

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

for(int j = 1; j<=columnas; j++){ //columnas


System.out.print(" * ");
}
System.out.println();
}
}

La salida de este programa para filas = 6 y columnas = 10 es:

* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *

Ejemplo de programa Java que contiene una instruccin while:


Programa que lee nmeros por teclado. La lectura acaba cuando el nmero
introducido sea negativo. El programa calcula y muestra la suma de los nmeros
ledos.
/*
* Programa que lee nmeros hasta que se lee un negativo y muestra la
* suma de los nmeros ledos
*/
import java.util.*;
public class Ejemplo1While {
public static void main(String[] args) {
int suma = 0, num;
Scanner sc = new Scanner(System.in);

System.out.print("Introduzca un nmero: ");


num = sc.nextInt();
while (num >= 0){
suma = suma + num;
System.out.print("Introduzca un nmero: ");
num = sc.nextInt();
} System.out.println("La suma es: " + suma )
} }

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;

case '+' : Resultado = A + B;


break;
case '*' : Resultado = A * B;
break;
case '/' : if(B!=0)
Resultado = A / B;
else{
System.out.println("\nNo se puede dividir por cero");
calculado = false;
}
break;
default : System.out.println("\nOperador no valido");
calculado = false;
}
if(calculado){
System.out.println("\nEl resultado es: " + Resultado);
}
}
}

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;

System.out.println("Introduzca una nota entre 0 y 10: ");


nota = sc.nextDouble();
System.out.println("La calificacin del alumno es ");
if(nota < 0 || nota > 10)
System.out.println("Nota no vlida");
else if(nota==10)
System.out.println("Matrcula de Honor");
else if (nota >= 9)
System.out.println("Sobresaliente");
else if (nota >= 7)
System.out.println("Notable");
else if (nota >= 6)
System.out.println("Bien");
else if (nota >= 5)
System.out.println("Suficiente");
else
System.out.println("Suspenso");
}
}

/*
* 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");
}
}

Cada else se corresponde con el if ms prximo que no haya sido emparejado.


Una vez que se ejecuta un bloque de instrucciones, la ejecucin contina en la
siguiente instruccin que aparezca despus de las sentencias if .. else anidadas.
Ejemplo de programa Java que contiene una estructura condicional mltiple:
Programa que lee una hora (nmero entero) y muestra un mensaje segn la hora
introducida.
/*
* Programa que muestra un saludo distinto segn la hora introducida
*/
import java.util.*;
public class Ejemplo2If {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int hora;
System.out.println("Introduzca una hora (un valor entero): ");
hora = sc.nextInt();
if (hora >= 0 && hora < 12)
System.out.println("Buenos das");
else if (hora >= 12 && hora < 21)
System.out.println("Buenas tardes");
else if (hora >= 21 && hora < 24)
System.out.println("Buenas noches");
else

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 2 ANLISIS SINTCTICO

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

6) Realiza el siguiente cdigo intermedio: a = b * c / d + e


Temp2
Temp3
asig

7) Declara 8 instrucciones de asignacin


Double pi=3.1416;
String nom = M;
Float d = 5489621;
Double p = 5.2;
int c =0;
String grupos = heroes;
Int o =5;
Char l =b;
8) Edad = 78; //menciona si es una instruccin de asignacin y porqu
Si es una instruccin de asignacin ya que dice a edad se le asigna el valor
de 78
9) 4 + 5 //menciona si es una instruccin de asignacin y porqu
Esta no es una instruccin de asignacin ya que el operador es de una
adicin.

ANEXOS
UNIDAD II

2. GENERACIN DE CDIGO INTERMEDIO


2.1 Notaciones
Las notaciones son una forma especial en la que se pueden expresar una
expresin matemtica y puedan ser de 3 formas: infija, prefija y posfija.
Los prefijos, Pre Pos - In se refieren a la posicin relativa del operador
con respecto a los dos operandos.
2.1.1 Prefija
La expresin o notacin prefija nos indica que el operador va antes
de los operandos sus caractersticas principales son:
Los operadores conservan el mismo orden que la notacin
infija equivalente.
No requiere de parntesis para indicar el orden de
precedencia de operadores ya que l es una operacin.
Se evala de izquierda a derecha hasta que encuentra el
primer operador seguido inmediatamente de un par de
operando.
Se evala la expresin binaria y el resultado se cambia
como un nuevo operando. Se repite hasta que nos quede
un solo resultado.
El orden es operador, primer operando, segundo operando.

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.

Expresiones aritmticas Son aquella donde los operadores que


intervienen en ella son numricos, el resultado es un nmero y los
operadores son aritmticos. Los operadores aritmticos ms
comnmente utilizados son: +, - , * , / y %.
Comenzamos el estudio por las expresiones aritmticas. Lo que
tendremos que hacer es crear por cada tipo de nodo un mtodo
que genere el cdigo para calcular la expresin y lo emita. Ese
cdigo dejar el resultado en un registro, cuyo nombre devolver el
mtodo como resultado.
Para reservar estos registros temporales, utilizaremos una funcin,
reserva. En principio bastar a con que esta funcin devuelva un
registro distinto cada vez que se la llame.
Cada nodo generar el cdigo de la siguiente manera:
Por cada uno de sus operandos, llamara al mtodo
correspondiente para que se evale la sub expresin. Si es
necesario, reservara un registro para guardar su resultado.
Emitir las instrucciones necesarias para realizar el clculo a
partir de los operandos.
2.3.3 Instrucciones de asignacin
La sintaxis general de la instruccin de asignacin es:
nombre_de_la_variable = valor
El valor a la derecha del signo igual puede ser una constante, otra
variable o una expresin que combine constantes y variables, pero
siempre la variable y su valor deben ser del mismo tipo de dato.
Ejemplos:
edad% = 5
area! = 12.3
nombre$ = Pedro

Instrucciones de asignacin compuesta


Las instrucciones de asignacin compuesta realizan primero
una operacin en una expresin antes de asignarla a un
elemento de programacin. En el siguiente ejemplo se
muestra uno de estos operadores, +=, que incrementa
el valor de la variable del lado izquierdo del operador con el
valor de la expresin de la derecha.
Una instruccin de asignacin asigna el valor de una
expresin a una variable. En general, si la variable que se va
a asignar es una propiedad, la propiedad debe ser de lectura
y escritura o de slo escritura; en caso contrario, se produce
un error de compilacin. Si la variable es una variable de
slo lectura, la asignacin debe producirse en un constructor
Shared o un constructor de instancia apropiado para el tipo

de la variable; en caso contrario, se producir un error de


compilacin.
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.
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.
2.3.6 Estructuras
Comenzamos por la instruccin condicional.

Tenemos dos versiones distintas segn si existe o no la parte


else. Si slo tenemos la parte si,
si condicion entonces
sentencias
fin si
tendremos que generar una estructura similar a esta:

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:

Sin embargo, puede ser ms eficiente una estructura como la


siguiente:

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.

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

Proyecto final de unidad 50%


Apuntes en digital 20%
Ejercicios 10%
Asistencia 10%

Optimizacin

Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se


realizan en base al alcance ofrecido por el compilador.
La optimizacin va a depender del lenguaje de programacin y es directamente
proporcional al tiempo de compilacin; es decir, entre ms optimizacin mayor
tiempo de compilacin.
La optimizacin es un proceso que tiene a minimizar o maximizar alguna variable
de rendimiento, generalmente tiempo, espacio, procesador, etc.
3.1 Tipos de optimizacin

Dentro de los tipos de optimizacin se derivan los tipos de optimizacin local,


optimizacin de ciclo, optimizacin global y optimizacin de mirilla.
3.1.1 Locales
La optimizacin local se realiza sobre mdulos del programa. En la mayora de las
ocasiones a travs de funciones, mtodos, procedimientos, clases, etc.
La caracterstica de las optimizaciones locales es que solo se ven reflejados en
dichas secciones.
La optimizacin local sirve cuando un bloque de programa o seccin es crtico por
ejemplo: E/S, la concurrencia, la rapidez y confiabilidad de un conjunto de
instrucciones. Como el espacio de soluciones es ms pequeo la optimizacin local
es ms rpida. Como el espacio de soluciones es ms pequeo la optimizacin
local es ms rpida.
3.1.2 Ciclos
Los ciclos son una de las partes ms esenciales en el rendimiento de un programa
dado que realizan acciones repetitivas, y si dichas acciones estn mal realizadas,
el problema se hace N veces ms grandes. La mayora de las optimizaciones sobre
ciclos tratan de encontrar elementos que no deben repetirse en un ciclo.

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

La optimizacin global se da con respecto a todo el cdigo. Este tipo de


optimizacin es ms lenta, pero mejora el desempeo general de todo programa.
Las optimizaciones globales pueden depender de la arquitectura de la mquina.
En algunos casos es mejor mantener variables globales para agilizar los procesos
(el proceso de declarar variables y eliminarlas toma su tiempo) pero consume ms
memoria. Algunas optimizaciones incluyen utilizar como variables registros del
CPU, utilizar instrucciones en ensamblador.
3.1.4 De mirilla
La optimizacin de mirilla trata de estructurar de manera eficiente el flujo del
programa, sobre todo en instrucciones de bifurcacin como son las decisiones,
ciclos y saltos de rutinas.
La idea es tener los saltos lo ms cerca de las llamadas, siendo el salto lo ms
pequeo posible.
Instrucciones de bifurcacin
Interrumpen el flujo normal de un programa, es decir que evitan que se ejecute
alguna instruccin del programa y salta a otra parte del programa.
Por ejemplo: el break
Switch (expresin que estamos evaluando)
{
Case 1: cout << Hola ;
Break;
Case 2: cout << amigos;
Break;
}
3.2 Costos
Los costos son el factor ms importante a tomar en cuenta a la hora de optimizar
ya que en ocasiones la mejora obtenida puede verse no reflejada en el programa
final, pero si ser perjudicial para el equipo de desarrollo. La optimizacin de una
pequea mejora tal vez tenga una pequea ganancia en tiempo o en espacio, pero
sale muy costosa en tiempo en generarla.
Pero en cambio si esa optimizacin se hace por ejemplo en un ciclo, la mejora
obtenida puede ser N veces mayor por lo cual el costo se minimiza y es benfico la
mejora.
Por ejemplo:
for(int i=0; i < 10000; i++); si la ganancia es de 30 ms 300s

3.2.1 Costo de ejecucin (Memoria, registros, pilas)

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.

3.2.2 Criterios para mejorar el cdigo


La mejor manera de optimizar el cdigo es hacer ver a los programadores que
optimicen su cdigo desde el inicio, el problema radica en que el costo podra ser
muy grande ya que tendra que codificar ms y/o hacer su cdigo ms legible. Los
criterios de optimizacin siempre estn definidos por el compilador.

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.

3.2.3 Herramientas para el anlisis del flujo de datos


Existen algunas herramientas que permiten el anlisis de los flujos de datos, entre
ellas tenemos los depuradores y desambladores. La optimizacin al igual que la
programacin es un arte y no se ha podido sistematizar del todo.

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%

Generacin de cdigo objeto

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:

Durante la reserva de registros (allocation), se seleccionan el conjunto de


variables que vivir en registros en un punto del programa.
Durante la (posterior) asignacin de registros (assignation), se elige el
registro especfico para cada variable.

4.2 Lenguaje ensamblador


El ensamblador (del ingls assembler) es un traductor de un cdigo de bajo nivel a
un cdigo, ejecutable directamente por la mquina para la que se ha generado.
Fue la primera abstraccin de un lenguaje de programacin, posteriormente
aparecieron los compiladores.

Caractersticas

El programa lee un archivo escrito en lenguaje ensamblador y sustituye cada


uno de los cdigos mnemotcnicos por su equivalente cdigo mquina.
Los programas se hacen fcilmente portables de mquina a mquina y el
clculo de bifurcaciones se hace de manera fcil.

Ejemplo:
Un procesador x86 puede ejecutar la siguiente instruccin binaria como se expresa
en cdigo maquina:

Esta instruccin significa' mueva el valor hexadecimal 61 (97 decimal) al registro


al. El mnemnico mov es un cdigo de operacin u opcode, elegido por los
diseadores de la coleccin de instrucciones para abreviar mov (mover).- El
opcode es seguido por una lista de argumentos o parmetros, completando una
instruccin de ensamblador tpica.

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.

4.3 Lenguaje mquina


El lenguaje mquina slo es entendible por las computadoras. Se basa en una
lgica binaria de 0 y 1, generalmente implementada por mecanismos elctricos.
En general el lenguaje mquina es difcil de entender para los humanos por este
motivo hacemos uso de lenguajes ms parecidos a los lenguajes naturales.
Caractersticas

El lenguaje mquina realiza un conjunto de operaciones predeterminadas


llamadas micro operaciones.
Las micro operaciones slo realizan operaciones del tipo aritmtica (+,-,*, /),
lgicas (AND, OR, NOT) y de control (secuencial, decisin, repetitiva).
El lenguaje mquina es dependiente del tipo de arquitectura. As un
programa mquina para una arquitectura Intel x86 no se ejecutar en una
arquitectura Power PC de IBM (al menos de manera nativa).
Algunos microprocesadores implementan ms funcionalidades llamado
CISC, pero son ms lentos que los RISC ya que estos tienen registros ms
grandes.

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.

Todas las instrucciones preparadas en cualquier lenguaje de mquina tienen por lo


menos dos partes. La primera es el comando u operacin, que dice a la
computadora cul es la funcin que va a realizar.

4.4 Administracin de memoria


Consiste en determinar la posicin de memoria en la que los diferentes smbolos
del programa almacenan la informacin.
Depende de la estrategia utilizada para la gestin de memoria, el mecanismo
puede variar.

La administracin de la memoria es un proceso hoy en da muy importante, de tal


modo que su mal o buen uso tiene una accin directa sobre el desempeo de
memoria.
En general un ensamblador tiene un administrador de memoria ms limitado que
un compilador.
En la mayora de los lenguajes de programacin el uso de punteros no estaba
vigilado por lo que se tienen muchos problemas con el uso de memoria. Los
lenguajes ms recientes controlan el uso de punteros y tienen un programa
denominado recolector de basura que se encarga de limpiar la memoria no
utilizada mejorando el desempeo

Anda mungkin juga menyukai