Вы находитесь на странице: 1из 13

Compiladores.

Gua 1 1

Facultad: Ingeniera
Escuela: Computacin
Asignatura: Compiladores

Tema: Introduccin a compiladores y MUSIM/0

Contenido
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.

Objetivos Especficos

Entender los conceptos bsicos de compiladores.


Conocer los lenguajes que se utilizaran en las
siguientes prcticas.

Material y Equipo

Gua de Laboratorio N 1.
Computadora con DevC++

Introduccin Terica

Lenguajes de Programacin
Gua
La 3
programacin de computadoras se realiza en los llamados
lenguajes de programacin, stos posibilitan la comunicacin
entre
Gua 4el programador y la computadora, a travs de un
conjunto de instrucciones u rdenes especificadas por el
lenguaje.
fa
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:
2 Compiladores. Gua 1
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: LFLILO.

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.
4 Compiladores. Gua 1

La siguiente figura muestra las fases de un traductor:

Procedimiento

MUSIM/0
Gua 3
Los componentes lxicos o tokens que conforman el lenguaje
son los4 siguientes:
Gua
Identificadores, que solo son nombres de variables y
fa estn compuestos por una nica letra minscula de rango
a-z.
Constantes numricas de un solo digito, de rango 0-9.
Operadores: +,-,*,/, y %.
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:

M
{
R a;
R b;
c = a + b;
W c;
}

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.
6 Compiladores. Gua 1
Ejercicio 1

M
{
R a; R b; R c;
p = (a + b + c)/3;
W p;
}

Describa lo que hace el programa anterior segn las


definiciones del lenguaje:
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________

Ejercicio 2

M
{
R a;
R b;
r = (a * a) + (b * b);
W r;
}

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.
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
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.
8 Compiladores. Gua 1
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 Cambia el signo del ltimo valor introducido en
la pila, dejndolo en el mismo lugar. 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.

Ejemplo 3
A continuacin se muestran un programa fuente en MUSIM/0, y
su traduccin al cdigo intermedio ENSAMPOCO/0
Compiladores. Gua 1 9

Cdigo en MUSIM/0

M
{
R a;
R b;
z = a + b;
W z;
}

Traduccin a ENSAMPOCO/0

.CODE
INPUT a
INPUT b
PUSHA z
PUSHA a
LOAD
PUSHA b
LOAD
ADD
STORE
OUTPUT z
END

Ejercicio 6
Traducir el siguiente cdigo en MUSIM/0 A ENSAMPOCO/0
M
{
R a;
R b;
z = a + b - 2;
W z;
}

Traduccin a ENSAMPOCO/0
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
_____________________________________________________________
10 Compiladores. Gua 1

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

M{ R a; R b; R c;
q = (a * a) + (b * b) + (c * c);
W q; }

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

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
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.
12 Compiladores. Gua 1
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

Gua 1: Introduccin
compiladores y MUSIM/0
a Hoja de cotejo: 1
Docente: 1
Tema: Presentacin
Alumno: del programa MquinaMquina
No: No:
Alumno: Mquina No:
Docente: GL: GL: Fecha:

Docente: GL: a

EVALUACION

% 1-4 5-7 8-10 Nota

CONOCIMIENTO Del 20 Conocimie Conocimiento Conocimiento


al 30% nto y explicacin completo y
deficient incompleta de explicacin
e de los los clara de los
fundament fundamentos fundamentos
os tericos tericos
tericos

APLICACIN Del 40%


DEL al 60%
CONOCIMIENTO

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

Вам также может понравиться