You are on page 1of 13

1

Compiladores. Gua 1




Tema: Introduccin a compiladores y MUSIM/0




En esta gua se presenta una breve introduccin a los
conceptos bsicos que se utilizan en el mbito de los
compiladores y se familiarizara al alumno con el lenguaje al
cual se le desarrollar un compilador a lo largo de las
prcticas.



Entender los conceptos bsicos de compiladores.
Conocer los lenguajes que se utilizaran en las
siguientes prcticas.





Gua de Laboratorio N 1.
Computadora con DevC++




Lenguajes de Programacin
La programacin de computadoras se realiza en los llamados
lenguajes de programacin, stos posibilitan la comunicacin
entre el programador y la computadora, a travs de un
conjunto de instrucciones u rdenes especificadas por el
lenguaje.

Un lenguaje de programacin puede definirse como una
notacin formal para describir algoritmos o funciones que
sern ejecutados por el ordenador.
Segn su grado de independencia de la maquina, los lenguajes
de programacin se clasifican en:

Introduccin Terica

Gua 3

Gua 4

fa
Facultad: Ingeniera
Escuela: Computacin
Asignatura: Compiladores
Contenido
Objetivos Especficos
Material y Equipo
Compiladores. Gua 1
2
Lenguaje maquina: Es la notacin que entiende
directamente el ordenador, por eso sus instrucciones
estn escritas con cdigo binario. El repertorio de sus
instrucciones, as como la estructura de estas, estn
ligadas directamente a la arquitectura de la maquina.
Lenguaje ensamblador: es esencialmente una versin
simblica de un lenguaje maquina. Cada cdigo de
operacin se indica por un cdigo simblico. Por ejemplo
ADD para adicin y MUL para multiplicacin.
Lenguajes de nivel medio: tienen algunas de las
caractersticas de los lenguajes de bajo nivel (por
ejemplo acceso directo a posiciones de memoria),
aadidas a posibilidades de manejo de estructuras de
control y de datos de lenguajes de alto nivel.
Lenguajes de alto nivel: facilitan la escritura de
programas con estructuras de datos complejas, la
utilizacin de bloques, y procedimientos o subrutinas.
Dentro de estos lenguajes destacan un tipo de lenguajes,
denominados lenguajes orientados a objetos, que permiten
definir tipos abstractos de datos.
Lenguajes de orientados a problemas concretos: se
utilizan para la resolucin de problemas en un campo
especfico.

Procesadores de lenguaje
Procesadores de lenguajes es el nombre genrico que reciben
todas las aplicaciones informticas en las cuales uno de los
datos fundamentales de entrada es un lenguaje. La definicin
anterior afecta una gran variedad de herramientas software,
entre las cuales tenemos:

Traductores: Es un programa que procesa un texto fuente
y genera un texto objeto
Ensamblador: Si el lenguaje fuente es el lenguaje
ensamblador y el lenguaje objeto es el lenguaje maquina,
entonces al traductor se le llama ensamblador.
Compiladores: Un traductor que transforma texto fuente
de lenguajes de alto nivel a lenguajes de bajo nivel se
le denomina compilador.
Intrprete: Son programas que simplemente ejecutan las
instrucciones que se encuentran en el texto fuente.

Traductores
Como ya se menciono, un traductor es un programa que procesa
un texto fuente y genera un texto objeto. El traductor est
escrito en lenguaje de implementacin (LI) o tambin
Compiladores. Gua 1

3
denominado lenguaje host. El texto fuente est escrito en
lenguaje fuente (LF), por ejemplo un lenguaje de alto nivel.
El texto objeto est escrito en lenguaje objeto (LO), por
ejemplo un lenguaje de mquina, ensamblador u otro lenguaje
de alto nivel. Se suele utilizar la notacin T, la cual se
muestra en la siguiente figura



La notacin T tambin se puede representar de forma abreviada
como: LF
LI
LO.

Estructura general de un traductor

Todas las fases de un traductor se pueden agrupar en dos
reas: el anlisis del programa fuente y su sntesis en el
correspondiente programa objeto.

El anlisis consiste en verificar la correccin del programa
fuente, para lo cual se descompone el programa fuente en
trozos elementales o unidades mnimas sintcticas denominadas
componentes lxicos o tokens. Los tokens se pueden agrupar
para comprobar su disposicin correcta en las distintas
construcciones y sentencias del lenguaje a analizar (anlisis
sintctico y semntico). Comprobndose de esta forma la
validez sintctica y semntica del programa fuente. En caso
contrario se emiten los errores oportunos (manejo de
errores). La informacin tambin se utiliza durante la fase
de anlisis (por ejemplo ara comprobar si una variable se
intent declarar dos veces).

La tarea de sntesis tiene por objeto la generacin del
cdigo del lenguaje objeto. En el caso particular de los
compiladores suele incluirse tambin la generacin de cdigo
intermedio, como un medio para garantizar la
transportabilidad entre distintas maquina objeto o como
mtodo para poder utiliza el mismo back-end, entre
compiladores de lenguajes diferentes.

La generacin de cdigo intermedia se apoya directamente en
la informacin recogida en la tabla de smbolos durante la
fase de anlisis. La generacin de cdigo para la mquina
objeto definitiva tan solo se apoya en el cdigo intermedio.
Tambin es necesario un tratamiento de errores para la fase
de sntesis.
Compiladores. Gua 1
4

La siguiente figura muestra las fases de un traductor:





MUSIM/0

Los componentes lxicos o tokens que conforman el lenguaje
son los siguientes:

Identificadores, que solo son nombres de variables y
estn compuestos por una nica letra minscula de rango
a-z.
Constantes numricas de un solo digito, de rango 0-9.
Operadores: +,-,*,/, y %.
Procedimiento

Gua 3

Gua 4

fa
Compiladores. Gua 1

5
Smbolo de asignacin: = (igual).
Parntesis: ( y ).
Separador de sentencias: ; (punto y coma).
Indicadores de principio y fin de bloque: { y }.
Palabras reservadas que estn formadas por una letra
mayscula. Tan solo son tres: R (lectura), W(escritura)
y
M (programa principal).

Puede observarse que este lenguaje solo permite tres tipos de
sentencias: lectura, asignacin y escritura. Tiene un solo
tipo de datos: entero. Las variables estn formadas por una
nica letra minscula, y las constantes son de un dgito.

Tiene cinco operadores +(adicin), -(diferencia),
*(producto), /(divisin entera), y %(modulo). Se permite el
uso de parntesis.

Ejemplo 1:



Analicemos lo que hace este programa:

R a y R b indica que le leen las variables a y b.

c = a + b indica que en la variable c se asignara el
resultado de la suma de a y b.

W c indica que se escribir la variable c.

En pocas palabras, este programa leer dos variables, las
sumara y finalmente mostrar el resultado en pantalla.







M
{
R a;
R b;
c = a + b;
W c;
}
Compiladores. Gua 1
6
Ejercicio 1



Describa lo que hace el programa anterior segn las
definiciones del lenguaje:
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________

Ejercicio 2



Describa lo que hace el programa anterior:
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________

Ejercicio 3

Escriba un programa en MUSIM/0 que lea un nmero, calcule y
muestre en pantalla cuanto es ese nmero elevado al cubo.
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________






M
{
R a;
R b;
r = (a * a) + (b * b);
W r;
}
M
{
R a; R b; R c;
p = (a + b + c)/3;
W p;
}
Compiladores. Gua 1

7
Ejercicio 4
Escriba un programa en MUSIM/0 que lea 5 nmeros, calcule y
muestre en pantalla: la suma, promedio y multiplicin de los
5 nmeros.
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________

Ejercicio 5
Escriba un programa en MUSIM/0 que lea un nmero y determine
si este es par o impar. Si es par deber mostrar 0 en
pantalla, mientras que si es impar deber mostrar 1
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________


ENSAMPOCO/0

Como lenguaje objeto se utiliza un lenguaje intermedio que es
un pequeo ensamblador, que se denomina ENSAMPOCO/0. Este
ensamblador trabaja sobre una maquina abstracta, en este caso
particular es una mquina de pila. La maquina tendr una
memoria de 26 celdas cuyas direcciones se nombrarn con las
letras de la a a la z, y una pila LIFO donde se
realizarn las operaciones aritmticas.

A continuacin se describe la forma de trabajo de las
distintas instrucciones.

Instruccin Descripcin
.CODE Indica el comienzo del cdigo.
PUSHC Coloca una constante en la pila. El operando es
una constante.
PUSHA Coloca en la pila la direccin de una variable.
El operando es una variable, dado que las
direcciones se denominan con el nombre de las
variables.
LOAD Asume que el ltimo valor insertado en la pila
es una direccin. Esta direccin es extrada de
la pila y en su lugar se pone el valor ubicado
en dicha direccin. No tiene operando.
Compiladores. Gua 1
8
STORE Usa los dos ltimos elementos de la pila. Uno es
la direccin de una celda y memoria y el otro el
valor a almacenar en dicha celda. El ltimo
elemento de la pila es el valor y el otro la
direccin. Despus de ejecutada la instruccin,
los dos elementos implicados son extrados de la
pila, dejndolos en el mismo lugar. No tiene
operando.
NEG Cambia el signo del ltimo valor introducido en
la pila, dejndolo en el mismo lugar. No tiene
operando.
ADD Opera con los dos ltimos elementos introducidos
la pila, extrayndolos y dejando en su lugar la
suma del resultado. Por tanto la pila habr
disminuido en un elemento. No tiene operando.
MUL Opera con los dos ltimos elementos introducidos
en la pila, extrayndolos y dejando en su lugar
el producto. Por tanto la pila habr disminuido
en un elemento. No tiene operando.
DIV Opera con los dos ltimos elementos introducidos
en la pila, extrayendo primero el denominador y
despus el numerador y dejando en su lugar la
divisin entera. Por tanto la pila habr
disminuido en un elemento.
No tiene operando.
MOD Opera con los dos ltimos elementos introducidos
en la pila, extrayendo primero el denominador y
despus el numerador y dejando en su lugar el
modulo. Por tanto, la pila habr disminuido en
un elemento. No tiene operando.
INPUT Toma el valor del buffer de entrada, en este
caso el teclado, y lo coloca en la direccin
asignada a la variable. La pila no sufre
cambios.
OUTPUT Toma el valor de la direccin indicada y lo
lleva al buffer de salida, en este caso la
pantalla. La pila no sufre cambios.
END Indica el fin de programa.









Compiladores. Gua 1

9
Ejemplo 3

A continuacin se muestran un programa fuente en MUSIM/0, y
su traduccin al cdigo intermedio ENSAMPOCO/0

Cdigo en MUSIM/0



Traduccin a ENSAMPOCO/0



Ejercicio 6
Traducir el siguiente cdigo en MUSIM/0 A ENSAMPOCO/0


Traduccin a ENSAMPOCO/0
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
M
{
R a;
R b;
z = a + b - 2;
W z;
}
.CODE
INPUT a
INPUT b
PUSHA z
PUSHA a
LOAD
PUSHA b
LOAD
ADD
STORE
OUTPUT z
END
M
{
R a;
R b;
z = a + b;
W z;
}
Compiladores. Gua 1
10
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________

Ejercicio 7
Traducir el siguiente cdigo en MUSIM/0 a ENSAMPOCO/0



_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________

Anlisis de resultados

Lenguaje Micro C o C-:

El lenguaje Micro C es un subconjunto pequeo del lenguaje de
programacin C. Como referencia utilice el Apndice A
Proyecto de Compilador del libro Construccin de
Compiladores de Kenneth C. Louden, el cual define al lenguaje
de programacin denominado C Minus o C-.

Micro-C es un lenguaje case sensitive, es decir que el
compilador de este lenguaje trata a las letras maysculas y
minsculas como caracteres diferentes.

Los comentarios y caracteres ignorados.

Los comentarios son secuencias de carcter incluido dentro de
par de secuencias de /**/ pareados. Los comentarios pueden
extender sobre varias lneas, pero los comentarios anidados
M{ R a; R b; R c;
q = (a * a) + (b * b) + (c * c);
W q; }
Compiladores. Gua 1

11
no se reconocen, es decir que el primer encontrado */ dentro
de un comentario lo cierra. Otros caracteres ignorados
incluyen el newline, la tabulacin horizontal, el CR, y el
espacio blanco.

Tokens

Las secuencias de caracteres encerrados dentro de dos
apstrofes (') son smbolos terminales. Cualquier otra
secuencia de caracteres denota el nombre de una clase lxica,
por ejemplo:

En secciones posteriores utilizaremos las definiciones
lxicas siguientes:

letra = ' _ ' | ' a ' | ' b ' |... | ' z ' | ' A ' | ' B '
|... | ' Z '
dgito = ' 0 ' | ' 1 ' |... | ' 9 '

Observe que el carcter underscore o guion bajo (_) es
tratando como una letra.

Identificadores:

Un identificador es una secuencia finita de letras y de
dgitos que comienzan con una letra. Los identificadores
pueden ser de cualquier longitud, sin embargo, los
identificadores sin diferencia en sus primeros 8 caracteres
correspondientes se consideran iguales.

Identificador = (letra) (letra | dgito) *.

Constantes numricas

Un integer_constant es una secuencia de dgitos (no debe
comenzar con un 0, a menos que sea el nmero 0).
integer_constant = digit+
Una constante numrica se debe separar de un identificador o
de una palabra clave.


Constantes de carcter.

Un chat_constant se define como una comilla simple de
apertura (), un carcter ASCII extendido imprimible y una
comilla simple de cierre.

Compiladores. Gua 1
12
Strings Constantes.

Una constante de string es una secuencia de los caracteres
incluidos dentro de dos comillas dobles ("). Una constante de
string puede incluir la secuencia \ que representa un
carcter de comillas doble en la secuencia en la cual ocurre,
tal que no termina el string. La secuencia \n representa el
carcter del NEWLINE, mientras que la secuencia \ \
representa el carcter del backslash y se puede incluir en un
string tambin. Una secuencia consistente de un backslash
seguido por cualquier carcter a excepcin de 'n', '\ ', o '
" ' es ilegal. Por consiguiente, un string constante no debe
extenderse ms all del extremo de la lnea. Un par de /**/
dentro de un string constante no se trata como comentario.

Operadores
add_op = ' + ' | ' - '
mul_op = ' * ' | '/'
eq_op = ' = = ' | '! = '
rel_op = ' < ' | ' < = ' | ' > = ' | ' > '

Ejercicio 8

Desarrollar en el IDE DevC++ los ejercicios 3, 4 y 5
utilizando el lenguaje Micro C.

Investigacin complementaria

a) Escribir un programa fuente en MICRO C que lea una
temperatura en grados Celsius, lo convierta a
temperatura absoluta y este resultado lo muestre en
pantalla.
b) Escribir un programa en MICRO C que calcule el factorial
de un nmero.
c) Investigar que es lxico y en qu consiste el anlisis
lxico de un traductor.


Bibliografa

Cueva, J. (1998). Conceptos bsicos de procesadores de
lenguaje. Universidad de Oviedo, Espaa.


Compiladores. Gua 1

13




















EVALUACION
% 1-4 5-7 8-10 Nota
CONOCIMIENTO

Del 20
al 30%
Conocimie
nto
deficient
e de los
fundament
os
tericos

Conocimiento
y explicacin
incompleta de
los
fundamentos
tericos
Conocimiento
completo y
explicacin
clara de los
fundamentos
tericos

APLICACIN
DEL
CONOCIMIENTO
Del 40%
al 60%




ACTITUD


Del 15%
al 30%
No tiene
actitud
proactiva
.
Actitud
propositiva y
con
propuestas no
aplicables al
contenido de
la gua.
Tiene actitud
proactiva y sus
propuestas son
concretas.

TOTAL 100%
Mquina No:

Mquina No:
Alumno:

Alumno:
Docente:

Docente:
GL:

GL:
Fecha:
Gua 1: Introduccin a
compiladores y MUSIM/0

Tema: Presentacin del programa
Hoja de cotejo:

Docente:

Mquina No:

GL:

a
1
1

You might also like