Escolar Documentos
Profissional Documentos
Cultura Documentos
CICUSO 2014
I.
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.
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.
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.)
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-
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.
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:
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.
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():
AGRADECIMIENTOS
REFERENCIAS
[1]
[2]