Você está na página 1de 6

VI Congreso de Investigacin de Ctedra Universidad de Sonsonate.

CICUSO 2014

Diseo de un prototipo de un nuevo lenguaje de


programacin en espaol (LPES) y construccin
del compilador para el lenguaje a travs de Java y
de las herramientas JFlex/CUP Javacc.
Arias Jaco Daro Cristian, Gonzales Figueroa Mario Alberto, Quilizapa Argueta Mario Jorge, Ramrez Vides Jaime Adilson.
E-mail: dc.ariasjaco@gmail.com, mario.gonza@gmail.com, mario.quilizapa@gmail.com, jaimeramirez14611@gmail.com,
Ctedra: Compiladores
Catedrtico: Ing. lvaro Hernn Zavala.
Facultad de Ingeniera y CCNN. Universidad de Sonsonate
Sonsonate, El Salvador C.A
Anlisis de los resultados. Aqu se presenta la descripcin
y la gramtica necesaria para el prototipo del nuevo lenguaje
adems de una descripcin de los tipos de datos admitidos y
del compilador desarrollado.

ResumenEn el presente documento se realiza un


estudio sobre la construccin de compiladores a travs
de las herramientas JFlex/CUP Javacc de Java adems
de construir el prototipo de un nuevo lenguaje de
programacin con sintaxis en espaol denominado LPES
(Lenguaje de programacin en espaol), as como
tambin el diseo y construccin de un compilador para
dicho lenguaje.

Conclusiones y recomendaciones. Se presentan las


conclusiones y recomendaciones pertinentes a la
investigacin.
Anexos. Aqu se muestra un ejemplo de programa creado a
partir de la sintaxis de lenguaje de programacin
denominado LPES.

Palabras ClaveCompilador, cdigo, gramtica, lxico,


sintaxis, semntica, JFlex, CUP, Javacc, expresin, smbolos,
tipos.

I.

PLANTEAMIENTO DEL PROBLEMA

1.1 Antecedentes y situacin problemtica especfica.


Existe una gran diversidad de compiladores los cuales
se han creado a partir del surgimiento de un nuevo lenguaje,
la tarea de realizar un compilador no es una tarea fcil, el
primer compilador de FORTRAN tardo 18 aos en
realizarse y era muy sencillo. Entre los diversos
compiladores existentes podemos mencionar: Para el
lenguaje C-C++; dev C++ y para java; Eclipse y Netbeans.

INTRODUCCIN
El presente estudio muestra los fundamentos bsicos en la
construccin de compiladores adems de las fases a seguir
para esto, es importante destacar que el atractivo del estudio
es el diseo de un prototipo de un nuevo lenguaje de
programacin con sintaxis en espaol denominado LPES,
adems de un compilador para poder programar en este
lenguaje.

Un compilador es un programa muy complejo con un


nmero de lneas de cdigo que puede variar de 10,000 a 1,
000,000. Escribir un programa de esta naturaleza, o incluso
comprenderlo, no es una tarea fcil, y la mayora de los
profesionales de la computacin nunca escribirn un
compilador completo. No obstante, los compiladores se
utilizan en casi todas las formas de la computacin, y
cualquiera que est involucrado profesionalmente con las
computadoras debera conocer la organizacin y el
funcionamiento bsicos de un compilador. Adems, una
tarea frecuente en las aplicaciones de las computadoras es el
desarrollo de programas de interfaces e intrpretes de
comandos, que son ms pequeos que los compiladores pero
utilizan las mismas tcnicas. Por lo tanto, el conocimiento de
estas tcnicas tiene una aplicacin prctica importante.

A continuacin se presenta una breve resea capitular.


Planteamiento del problema. Se muestra los antecedentes
y la situacin actual de los compiladores, adems de abordar
el propsito de la investigacin.
Fundamentacin terica. En esta fase se muestra la
fundamentacin terica general de un compilador.
Metodologa de la investigacin. Se muestra la forma en
que fue realizada la investigacin, adems del anlisis de la
informacin recopilada en la misma.

VI Congreso de Investigacin de Ctedra Universidad de Sonsonate. CICUSO 2014


El propsito de esta investigacin no slo es el de obtener
este conocimiento bsico. Sino tambin el de conocer las
herramientas necesarias, as como la experiencia prctica,
para disear y programar un compilador real para un
prototipo de lenguaje de programacin en espaol diseado
por el grupo investigador.

interfaces se traducen antes o despus a secuencias de


comandos que son ejecutadas como si hubieran sido
introducidas por teclado. Por otro lado, y desde el punto de
vista del profesional de la Informtica, el trabajo que ste
realiza sobre el ordenador se encuentra plagado de
situaciones en las que se produce una comunicacin textual
directa con la mquina: utilizacin de un intrprete de
comandos (Shell), construccin de ficheros de trabajo por
lotes, programacin mediante diversos lenguajes, etc.
Incluso los procesadores de texto como MS Word
almacenan los documentos escritos por el usuario mediante
una codificacin textual estructurada que, cada vez que se
abre el documento, es reconocida, recorrida y presentada en
pantalla.

1.2 Objetivos de investigacin.


Conocer los fundamentos de los compiladores y su
estructura bsica.
Establecer un prototipo de un nuevo lenguaje de
programacin en espaol.
Disear un prototipo de compilador para un nuevo
lenguaje en espaol a travs del uso de las herramientas
JFlex/CUP - Javacc.

III. METODOLOGA DE LA INVESTIGACIN


1.3 Preguntas de Investigacin.
Cules son los fundamentos de los compiladores y cul es
su estructura bsica?
Cules la gramtica necesaria para un nuevo prototipo de
lenguaje de programacin en espaol?
Cmo disear un compilador a travs del uso de las
herramientas JFlex/CUP-Javacc?

3.1 Tipo de Investigacin.


La investigacin es de tipo descriptiva debido a que el
estudio est encaminado a identificar y describir las fases
necesarias para el diseo y construccin de un compilador
para un nuevo lenguaje de programacin en espaol, adems
esta ser apoyada en su totalidad por investigacin
documental la cual apoyara de gran manera el desarrollo de
la misma y por ltimo se realizaran entrevistas informales a
profesionales de la materia con el fin de obtener parmetros
importantes para la diseo del nuevo
lenguaje de
programacin y para el construccin del ya mencionado
compilador.

1.4 Justificacin.
Los lenguajes de programacin usualmente son de
propsito general y por ende no se adecuan a las necesidades
de los usuarios, es por esta causa que se hace necesario la
creacin de un nuevo lenguaje en conjunto con su
compilador, que sea diseado especficamente para
satisfacer dichas necesidades.
Por esta razn sea planteado desarrollar un prototipo de
lenguaje de programacin, que si bien no es extenso en su
uso con otros lenguajes existentes, se adapta a las
necesidades de los usuarios teniendo en cuenta que su
sintaxis est en espaol.

3.2 Unidades de anlisis.


Un nuevo lenguaje de programacin con sintaxis en
espaol y su respectivo compilador.
3.3 Indicadores.
Los indicadores ms importantes para un lenguaje de
programacin es la economa de estos que se resume en las
siguientes interrogantes.

II. FUNDAMENTACIN TERICA


Un compilador es un programa informtico que traduce un
programa escrito en un lenguaje de programacin a otro
lenguaje de programacin, generando un programa
equivalente que la mquina ser capaz de interpretar.
Usualmente el segundo lenguaje es lenguaje de mquina,
pero tambin puede ser un cdigo intermedio, o
simplemente texto. Este proceso de traduccin se conoce
como compilacin.

Por qu hay tantos lenguajes de programacin?


Es difcil disear un lenguaje que cubra todos los aspectos
de los diferentes dominios de las aplicaciones adems la
necesidades en cada dominio son diferentes e integrar todo
en un solo lenguaje sera demasiado complejo y que adems
el rendimiento sea alto

Uno de los principales mecanismos de comunicacin entre


un ordenador y una persona viene dado por el envo y
recepcin de mensajes de tipo textual: el usuario escribe una
orden mediante el teclado, y el ordenador la ejecuta
devolviendo como resultado un mensaje informativo sobre
las acciones llevadas a cabo.
Aunque la evolucin de los ordenadores se encuentra
dirigida actualmente hacia el empleo de novedosas y
ergonmicas interfaces de usuario (como el ratn, las
pantallas tctiles, las tabletas grficas, etc.), podemos decir
que casi todas las acciones que el usuario realiza sobre estas

Qu significa ser un buen lenguaje de programacin?


No existe una mtrica establecida para esto, es decir esto
depender de la visin del programador y de la relacin
costo de formacin versus el beneficio.

Por qu hay nuevos lenguajes de programacin?


Primero mencionar que los lenguajes ampliamente usados
sufren cambios de manera muy lenta y que en vista a nuevas
necesidades surgen los nuevos lenguajes de programacin

En este punto decir que el costo de formacin para conocer


la sintaxis de LPES es relativamente bajo en contrapuesto
con los beneficios que se pueden obtener de este adems el-

VI Congreso de Investigacin de Ctedra Universidad de Sonsonate. CICUSO 2014


lenguaje LPES como prototipo de lenguaje de programacin
surge como oferta a la demanda de un lenguaje con sintaxis
en espaol es decir la mayor parte de los lenguajes
ampliamente conocidos son ingles lo que dificulta de forma
directa o indirecta la lgica de programacin.
El prrafo anterior justifica el nacimiento de un nuevo
lenguaje que pueda cumplir con las expectativas de los
usuarios.

Esto es semejante a realizar el anlisis gramatical sobre una


frase en un lenguaje natural. El anlisis sintctico determina
los elementos estructurales del programa y sus relaciones.
Los resultados del anlisis sintctico por lo regular se
representan como un rbol de anlisis gramatical o un rbol
sintctico que es una estructura dinmica que almacena en
sus nodos informacin necesaria para continuar la
compilacin.

3.4 Procesamiento y anlisis de la informacin.


Un compilador se compone internamente de vanas etapas,
o fases, que realizan distintas operaciones lgicas. Es til
pensar en estas fases como en piezas separadas dentro del
compilador, y pueden en realidad escribirse como
operaciones codificadas separadamente aunque en la
prctica a menudo se integren juntas. Las fases de un
compilador se ilustran en la figura 1.1.

Anlisis semntico.
La semntica de un programa es su "significado", en
oposicin a su sintaxis, o estructura. La semntica de un
programa determina su comportamiento durante el tiempo
de ejecucin, pero la mayora de los lenguajes de
programacin tienen caractersticas que se pueden
determinar antes de la ejecucin e incluso no se pueden
expresar de manera adecuada como sintaxis y analizarse
mediante el analizador sintctico. Se hace referencia tales
caractersticas como semntica esttica, y el anlisis de tal
semntica es la tarea del analizador semntico. (La
semntica "dinmica" de un programa, es decir, aquellas
propiedades del programa que solamente se pueden
determinar al ejecutarlo, no se pueden determinar mediante
un compilador porque ste no ejecuta el programa.) Las
caractersticas tpicas de la semntica esttica en los
lenguajes de programacin comunes incluyen las
declaraciones y la verificacin de tipos. Las partes extra de
la informacin (como los tipos de datos) que se calculan
mediante el analizador semntico se llaman atributos y con
frecuencia se agregan al rbol como anotaciones o
"decoraciones". (Los atributos tambin se pueden introducir
en la tabla de smbolos.)

Generacin de cdigo intermedio.


El generador de cdigo toma el cdigo intermedio o RI y
genera el cdigo par3 la mquina objetivo. En este texto
escribiremos el cdigo objetivo en la forma de lenguaje
ensamblador para facilitar su comprensin, aunque la
mayora de los compiladores generan el cdigo objeto de
manera directa. Es en esta fase de la compilacin en la que
las propiedades de la mquina objetivo se convierten en el
factor principal. No slo es necesario emplear instrucciones
que existan en la mquina objetivo, sino que las decisiones
respecto a la representacin de los datos desempearn
ahora tambin un papel principal, tal como cuntos bytes o
palabras de memoria ocuparn las variables de tipos de datos
enteros y de punto flotante.

Figura 1. Estructura y fases de un compilador.

A continuacin se describe cada una de estas fases y sus


componentes.
Anlisis lxico (Scanner).
Esta fase del compilador efecta la lectura real del programa
fuente, el cual generalmente est en la forma de un flujo de
caracteres. El rastreador realiza lo que se conoce como
anlisis lxico: recolecta secuencias de caracteres en
unidades significativas denominadas Token, las cuales son
como las palabras de un lenguaje natural, como el ingls. De
este modo, se puede imaginar que un rastreador realiza una
funcin similar al deletreo. Cabe mencionar que esta fase es
muy importante la utilizacin de expresiones regulares que
son una herramienta esencial para el anlisis de cadenas
simples de caracteres.

Optimizar cdigo.
Los compiladores a menudo incluyen varias etapas para el
mejoramiento, u optimizacin, del cdigo. El punto ms
anticipado en el que la mayora de las etapas de
optimizacin se pueden realizar es precisamente despus del
anlisis semntico, y puede haber posibilidades para el
mejoramiento del cdigo que dependern slo del cdigo
fuente. Indicamos esta posibilidad al proporcionar esta
operacin como una fase por separado en el proceso de
compilacin. Los compiladores individuales muestran una-

Anlisis sintctico (Parser).


El analizador sintctico recibe el cdigo fuente en la forma
de Token proveniente del analizador lxico y realiza el
anlisis sintctico, que determina la estructura del programa.
3

VI Congreso de Investigacin de Ctedra Universidad de Sonsonate. CICUSO 2014


amplia variacin no slo en los tipos de optimizaciones
realizadas sino tambin en la colocacin de las fases de
optimizacin.

CUP:
El generador de analizadores sintcticos Cup es un
analizador sintctico LALR desarrollado en el Instituto de
Tecnologa de Georgia (EE.UU.) que genera cdigo Java y
que permite introducir acciones semnticas escritas en dicho
lenguaje. Utiliza una notacin bastante parecida a la de
PCYacc e igualmente basada en reglas de produccin.

Generador de cdigo.
La fase final de un compilador es la generacin de cdigo
objeto, que por lo general consiste en cdigo mquina
reubicable o cdigo ensamblador. Cada una de las variables
usadas por el programa se traduce a una direccin de
memoria (esto tambin se ha podido hacer en la fase de
generacin de cdigo intermedio). Despus, cada una de las
instrucciones intermedias se traduce a una secuencia de
instrucciones de mquina que ejecuta la misma tarea. Un
aspecto decisivo es la asignacin de variables a registros.

Javacc:
JavaCC (Java Compiler Compiler - Metacompilador en
Java) es el principal metacompilador en JavaCC, tanto por
sus posibilidades, como por su mbito de difusin. Se trata
de una herramienta que facilita la construccin de
analizadores lxicos y sintcticos por el mtodo de las
funciones recursivas, aunque permite una notacin relajada
muy parecida a la BNF. De esta manera, los analizadores
generados utilizan la tcnica descendente a la hora de
obtener el rbol sintctico.

Tabla de smbolos.
Una funcin esencial de un compilador es registrar los
identificadores de usuario (nombres de variables, de
funciones, de tipos, etc.) utilizados en el programa fuente y
reunir informacin sobre los distintos atributos de cada
identificador. Estos atributos pueden proporcionar
informacin sobre la memoria asignada a un identificador, la
direccin de memoria en que se almacenar en tiempo de
ejecucin, su tipo, su mbito (la parte del programa donde es
visible), etc.

IV. ANLISIS Y DISCUSIN DE LOS RESULTADOS


El resultado de la investigacin es bsicamente un prototipo
de un nuevo lenguaje de programacin denominado LPES
que se caracteriza y distingue de los que se conocen
actualmente en que su sintaxis es en espaol.
El prototipo de lenguaje actualmente propuesto tiene las
sentencias bsicas de programacin; declaracin de
variables, For, While, Do While, If, Else If, Switch, adems
de contar con expresiones y operaciones matemticas
bsicas como la suma, resta multiplicacin y divisin,
comentarios de usuario de una lnea y multilinea. Por ultimo
mencionar que el lenguaje acepta tipos de datos enteros,
decimales, cadenas y caracteres.

Manejo de errores.
Esta fase es muy importante en todas las fases del
compilador ya que este deber notificar de los diferentes
tipos de errores que pueden ocurrir durante la compilacin
de un programa.
Para construir un compilador se pueden utilizar las
siguientes herramientas:

En la siguiente figura se muestra el logo del prototipo del


lenguaje denominado LPES.

JFlex:
El generador de analizadores lexicogrficos JFlex es un
generador de analizadores lexicogrficos desarrollado por
Gerwin Klein como extensin a la herramienta Jlex
desarrollada en la Universidad de
Princeton. JFlex est desarrollado en Java y genera cdigo
Java.
Los programas escritos para JFlex tienen un formato
parecido a los escritos en PCLex; de hecho todos los
patrones regulares admisibles en Lex tambin son admitidos
por JFlex, por lo que en este apartado nos centraremos tan
slo en las diferencias y extensiones, tanto de patrones como
del esqueleto que debe poseer el fichero de entrada a JFlex.
La instalacin y ejecucin de JFlex es trivial. Una vez
descomprimido el fichero jflex-1.3.5.zip, dispondremos del
fichero JFlex.jar que tan slo es necesario en tiempo de
meta-compilacin, siendo el analizador generado totalmente
independiente. La clase Main del paquete JFlex es la que se
encarga de metacompilar nuestro programa .jflex de entrada;
de esta manera, una invocacin tpica es de la forma: java
JFlex.Main fichero.jflex lo que generar un fichero
Yylex.java que implementa al analizador lexicogrfico.

Figura 2. Logo del prototipo del nuevo lenguaje.

La gramtica utilizada para el nuevo lenguaje es la mostrada


a continuacin:
Programa() :
<PROGRAMA><IDENTIFIER><LBRACE>Bloque()<RB
RACE><EOF>
Bloque():
LOOKAHEAD(2)VariablesGlobales() | Principal()
VariablesGlobales():
(<PRIVATE>|<PUBLIC>)(<INT>|<DEC>|<STR>|<CHR>)
<IDENTIFIER>(<COMMA><IDENTIFIER>)*
<SEMICOLON> Bloque()
4

VI Congreso de Investigacin de Ctedra Universidad de Sonsonate. CICUSO 2014


<WHILE> <LPAREN> Comparaciones() <RPAREN>
<LBRACE> Sentencias() <RBRACE>
SentenciaAsignacion():
<IDENTIFIER> (<ASIGNACION>
(TiposAsignaciones()) (LOOKAHEAD(2)OpAritmetico()
TiposAsignaciones() | (<INCR>|<DECR>)

Principal():
<MAIN><LBRACE>Sentencias()<RBRACE>
VariablesLocales():
<IDENTIFIER> <COMMA> <SEMICOLON> |
<IDENTIFIER> <SEMICOLON>

TiposAsignaciones():
<IDENTIFIER> | <NUMBER> | <DECIMAL> |
<CADENA> | <CARAC>

Sentencias():
VariablesLocales() | SentenciaIf() | SentenciaFor()|
SentenciaDo() |
LOOKAHEAD(2)SentenciaAsignacion()<SEMICOLON>
| SentenciaWrite() | SentenciaRead()<SEMICOLON> |
SentenciaSwitch()

SentenciaWrite():
<WRITE> <LPAREN>
(Expresion()(<PLUS><CADENA>)*|<CADENA>(<PLUS
>Expresion())*)* <RPAREN> <SEMICOLON>

SentenciaIf():
<IF><LPAREN> A() <RPAREN> <LBRACE>
Sentencias() <RBRACE> (Sino())*

//Sentencia READ
SentenciaRead():
<READ><LPAREN><RPAREN>

Sino():
<ELSE><LBRACE> Sentencias() <RBRACE> | <ELSEIF>
<LPAREN> A() <RPAREN> <LBRACE> Sentencias()
<RBRACE>

SentenciaSwitch():
<SWITCH><LPAREN><IDENTIFIER><RPAREN><LBR
ACE>(<CASE>(<IDENTIFIER>|<CADENA>|<CARAC>|
<NUMBER>|<DECIMAL>)<DOUBLEPOINT>(Sentencia
Asignacion()<SEMICOLON>)+
<BREAK><SEMICOLON>)+[<DEFAUL><DOUBLEPOI
NT>(SentenciaAsignacion()<SEMICOLON>)<BREAK><S
EMICOLON>]<RBRACE>

A():
Comparaciones() ([(<AND>|<OR>)] Comparaciones())*
Comparaciones():
Valor()Operadores()Valor()

Todo esto del lado del lenguaje, pero para poder programar
en el lenguaje LPES, necesitamos contar con una IDE de
programacin.
En la investigacin se cre una interfaz de desarrollo
llamada Anexis v.1.0 que es un compilador para el nuevo
lenguaje desarrollado, este posee caractersticas bsicas de
un editor de texto as como tambin la opcin de compilar el
cdigo, mostrando los errores de compilacin del ya
mencionado nuevo lenguaje.

Valor():
LOOKAHEAD(2) (<IDENTIFIER> | <NUMBER>) |
Expresion()
Expresion():
LOOKAHEAD(2)(<NUMBER> | <IDENTIFIER>)
|(<IDENTIFIER>|<NUMBER>) OpAritmetico()
(<IDENTIFIER>|<NUMBER>)
Operadores():
<EQ> | <LE> | <GE> | <NE> | <GR> | <MN>
| (<PLUS>) | (<MINUS>)| (<MULTIPLY>) | (<DIVIDE>)

V. CONCLUSIONES Y RECOMENDACIONES

SentenciaFor():
<FOR><LPAREN>(DeclaracionUnaVariable()|SentenciaAs
ignacion())<SEMICOLON> Comparaciones()
<SEMICOLON> SentenciaAsignacion() <RPAREN>
<LBRACE> Sentencias() <RBRACE>

Conclusiones.
Se concluye que de construir un nuevo lenguaje de
programacin se debe tomar en cuenta diversos aspectos
dentro de los que destaca el objetivo de este, es decir por qu
o para qu se va a disear, adems de pensar en el soporte
que se le dar en el futuro y la construccin de un
compilador para este.
Se concluye que para construir un compilador con las
herramientas JFlex/CUP Javacc de Java se debe seguir
una serie de fases en las cuales se debe tener el debido
cuidado para poder enlazar cada una de estas.

SentenciaDo():
<DO> <LBRACE>Sentencias() <RBRACE> <WHILE>
<LPAREN> Comparaciones() <RPAREN> |
SentenciaWhile()

Recomendaciones.
Se recomienda que a la hora de construir una gramtica
para un nuevo lenguaje de programacin, esta sea libre de
contexto, adems de evitar la redundancia en esta.

TiposDatos():
<INT> |<DEC> |<STR> |<CHR>

SentenciaWhile():

VI Congreso de Investigacin de Ctedra Universidad de Sonsonate. CICUSO 2014


VI. ANEXOS

AGRADECIMIENTOS

Ejemplo de la sintaxis de un programa escrito en


LPES.
Programa nombredelprograma
{
public static void inicio()
{
//declaracin de variables
cadena s1 = "Hola";
entero n1 = 0, n2 = 2, n3 = 2, x;
//sentencia for
repetirm(n2 = 0; n2 < 10; n2++ )
{
//imprimir un mensaje
imprimir(n2);
}
//sentencia if
si( n1 >= 0 )
{
n1 = n3 / n2;
}
//sentencia elseif
sino-si(n1 < 10)
{
n1 = n2 - n3;
}
//sentencia else
sino
{
imprimir("Ninguna opcion");
}
//sentencia do while
hacer
{
x = x + 1;
imprimir(x);
}
mientras(x < 5)
//sentencia while
mientras(n1 <= 20)
{
n1++;
imprimir(n1);
}
//sentencia switch
alternativa(n3)
{
opcion 4:
n1 = 2 + 2;
terminaop; //break
opcion 5:
n1 = 2 + 2;
terminaop;
default:
n1 = 10;
terminaop;
}
}
}

Se agradece la colaboracin del ing. lvaro Zavala quien


ha asesorado y contribuido con sus observacin y o
correcciones al presente estudio y quien adems es el
encargado de la ctedra.

REFERENCIAS
[1]
[2]

Kenneth Clouden (2004), Construccin de


compiladores principios y prcticas.
Sergio Glvez Rojas, Mora Mata Miguel ngel
(2005), Java a tope; Traductores y compiladores con
Lex/Yacc, JFlex/cup y Javacc, Universidad de
Mlaga.

Você também pode gostar