Compilador concatenacion

jessy Cueva
jessy CuevaRepresentante um municipio de paltas

Creacion de un compilador

PFM-CIS-IXB
UNIVERSIDAD
NACIONAL
DE LOJA
´Area de la Energ´ıa las Industrias y los Recursos Naturales No
Renovables
Carrera de Ingenier´ıa en Sistemas
COMPILADORES
PROBLEMA: “CONCATENACION
DE PALABRAS”
Noveno B
Alumna:
• Cueva Riofrio, Jessica Mercedes
Docente: Henry, Paz
Loja-Ecuador
Septiembre 2014-Febrero 2015
´Indice
A. DESARROLLO 3
1 . PROBLEMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 . ANALIZADOR L´EXICO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 .1. LIBRERIA jflex.jar . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 .2. ARCHIVO FLEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 . ANALIZADOR SINT´ACTICO . . . . . . . . . . . . . . . . . . . . . . . . 5
3 .1. LIBRER´IA CUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 .2. ARCHIVO CUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
B. Conclusiones 9
C. Recomendaciones 9
2
A. DESARROLLO
1 . PROBLEMA
CONCATENACI´ON DE PALABRAS
El compilador resuelve la uni´on de palabras formadas por may´usculas,min´usculas y
n´umeros.
1 La sintaxis que admite el compilador es: (palabra1+palabra2)
2 El par´entesis ( al inicio indica que inicia la expresi´on.
3 El s´ımbolo + indica la concatenaci´on o uni´on de las palabras.
4 El par´entesis ) al final indica el final de la expresi´on.
5 Al momento de unir dos palabras se ignora los espacios.
2 . ANALIZADOR L´EXICO
El analizador l´exico es la base para crear un compilador, para poder generar el ana-
lizador l´exico en nuestro proyecto necesitamos descargar la librer´ıa jFlex.jar, adem´as de
crear el archivo .flex.
2 .1. LIBRERIA jflex.jar
Esta librer´ıa nos permite crear el archivo .java del analizador l´exico sin errores.
La librer´ıa jflex.jar la podemos descargar del siguiente link: http://www.java2s.com/
Code/Jar/j/DownloadJFlexjar.htm
Una vez descargada la libreria jflex.jar la a˜nadimos al proyecto.
2 .2. ARCHIVO FLEX
El archivo .flex es la base para poder construir nuestro analizador l´exico, este archivo
en el compilador se llama analiLex.flex y est´a estructurado por 3 partes:
Secci´on de importaciones
% %
Secci´on de opciones y declaraciones
% %
Secci´on de reglas l´exicas
3
Secci´on de importaciones
En esta secci´on colocamos en la primera l´ınea en c´odigo java el paquete en el que
se encuentra nuestro archivo analiLex.flex, luego procedemos a importar las clases que
vamos a utilizar para crear nuestro compilador, en nuestro caso son las siguientes:
Creamos el paquete donde se encuentra el archivo analiLex.flex
/* Codigo de Usuario*/
package archivojflex;
Importamos java cup.runtime.* con la finalidad que exista comunicaci´on instant´anea
con el analizador sint´actico.
import java_cup.runtime.*;
import java.io.Reader;
Secci´on de opciones y declaraciones
Aqu´ı colocamos el nombre de la clase java que va a tomar nuestro analizador l´exico %class
AnalizadorFlex, acceso a la columna y fila de an´alisis CUP %line y %column, habilitamos
la compatibilidad con la interfaz CUP para el generador sint´actico %cup, quedando esta
secci´on de la siguiente manera:
%%
%class AnalizadorFlex
%line
%column
%cup
Declaraciones: son m´etodos en c´odigo java para identificar los s´ımbolos o token del
compilador
%{
private Symbol symbol(int type) {
return new Symbol(type, yyline, yycolumn);
}
private Symbol symbol(int type, Object value) {
return new Symbol(type, yyline, yycolumn, value);
}
%}
Macro declaraciones: son declaraci´on de variables que se utilizaran en la siguiente
secci´on, para determinar las reglas l´exicas del compilador:
4
Salto = r|n|rn
Espacio = {Salto} | [ tf]
Dig = 0 | [1-9][0-9]*
Letras = [a-zA-Z_]
Por ´ultimo en nuestro archivo analiLex.flex colocamos la tercera secci´on:
Secci´on de reglas l´exicas
Esta secci´on se refiere a las reglas l´exicas que va a tener el compilador. Las que permi-
ten identificar los s´ımbolos retornando un valor dependiendo del s´ımbolo que ingresemos
y si ingresamos una palabra retornara PALABRA:
%%
/*Seccion de reglas lexicas*/
<YYINITIAL> {
"+" {return new Symbol(sym.MAS);}
"(" {return new Symbol(sym.ABPARENT);}
")" {return new Symbol(sym.CEPARENT);}
({Letras}|{Dig})*{Letras} |({Letras}|{Dig})*{Dig} {return symbol(sym.PALABRA,
new String(yytext()));}
{Espacio} { /* ignora el espacio */ }
}
[ˆ] { throw new Error("Caracter ilegal <"+yytext()+">"); }
Una vez que hayamos construido el archivo analiLex.flex procedemos a generar la clase
AnalizadorLexico.java de la siguiente manera:
1. Creamos en nuestro proyecto una clase ejecutora denominada jlflex 2. Digitamos en
el main lo siguiente:
String [] flex = {"srcarchivosanaliLex.flex"};
jflex.Main.main(flex);
3. Lo ejecutamos
3 . ANALIZADOR SINT´ACTICO
El analizador sint´actico determina la sintaxis que va a tener el compilador, para crear
el analizador sint´actico necesitamos descargar la librer´ıa java-cup.jar, adem´as de la crea-
ci´on del archivo .cup.
5
3 .1. LIBRER´IA CUP
La librer´ıa java-cup.jar la podemos descargar del siguiente link: http://www2.cs.tum.
edu/projects/cup/.
Una vez descargada la librer´ıa java-cup.jar la a˜nadimos al proyecto en el que estamos
trabajando.
3 .2. ARCHIVO CUP
El archivo palabras.cup es la base para construir el analizador sint´actico y sem´antico,
est´a conformado por 5 partes que son las siguientes:
1 Especificaciones de “package” e “imports”.
2 Componentes de c´odigo de usuario.
3 Declaraci´on de s´ımbolos terminales y no terminales.
4 Declaraciones de precedencia.
5 Especificaci´on de la gram´atica.
1. Especificaciones de “package” e “imports”.
En esta parte se colocan: el paquete en el que se encuentra el archivo palabras.cup e
importaciones de clases de la librer´ıa java-cup.jar a utilizar en el proyecto, ademas estas
importaciones son necesaria dentro del c´odigo.
package ejemplocup;
import java_cup.runtime.*;
import java.io.FileReader;
2. Componentes de c´odigo de usuario
En el parser code{: :} de esta secci´on ponemos el c´odigo java de las acciones que va a
realizar el compilador, es decir, en este caso se realizaran dos m´etodos para la captura de
errores (n´umero de fila, n´umero de columna, el texto del error).
parser code {:
/* Reporte de error encontrado. */
public void report_error(String message, Object info) {
StringBuilder m = new StringBuilder("Error");
if (info instanceof java_cup.runtime.Symbol) {
java_cup.runtime.Symbol s = ((java_cup.runtime.Symbol) info);
if (s.left >= 0) {
6
m.append(" in line "+(s.left+1));
if (s.right >= 0)
m.append(", column "+(s.right+1));
}
}
if("#5".equals(info.toString())){
message=("Revise PARENTESIS del INICIO");
}
if("#0".equals(info.toString())){
message=("Revise PARENTESIS del FINAL");
}
if("#4".equals(info.toString())){
message=("Falta simbolo de SUMA");
}
m.append(" : "+message);
System.err.println(m);
}
public void report_fatal_error(String message, Object info) {
report_error(message, info);
System.exit(1);
}
:};
3. Declaraci´on de s´ımbolos terminales y no terminales
En los terminales colocamos los tokens o s´ımbolos que sirven para formar la expresi´on
gramatical del compilador.
/* Declaraci´on de s´ımbolos terminales y no terminales */
terminal MAS, ABPARENT, CEPARENT;
terminal String PALABRA;
En los no terminales se colocan las variables que van a componer la expresi´on grama-
tical, en este caso se hace de la siguiente manera:
non terminal Object expr_list, expr_part;
non terminal String palabra, expr;
donde:
expr list: es de tipo Object porque almacena un conjunto de expr part .
expr part: es de tipo Object porque almacena dos expr encerradas en par´entesis
expr
7
expr: es de tipo String porque almacena la uni´on o concatenaci´on de dos palabras
ejemplo palabra + palabra
palabra : es de tipo String, y es una palabra normal
4.Declaraciones de precedencia
Esta parte es opcional, en este caso no las necesitamos.
Por ´ultimo realizamos la quinta secci´on o parte del archivo palabras.cup.
5. Especificaci´on de la gram´atica
/*Expresiones gramaticales*/
expr_list ::= expr_list expr_part
|
expr_part
;
expr_part ::= ABPARENT expr:e CEPARENT
{:
System.out.println("");
:}
;
expr ::= palabra:e MAS palabra:v
{:
System.out.print("Concatenado: "+e+v);
:}
;
palabra ::= PALABRA:e
{:
RESULT = e;
:}
;
Una vez construido el archivo palabras.cup procedemos a generar AnalizadorSin-
tac.java de la siguiente manera:
1. Creamos en nuestro proyecto una clase ejecutora denominada MainCup
2. Digitamos en el main lo siguiente:
8
String [] option=new String [5];
option[0]="-destdir";
option[1]="src" +File.separator+"archivos";
option[2]="-parser";
option[3]="AnalizadorSintac";
option[4]="src"+File.separator+"archivos"+File.separator+"palabras.cup";
try {
java_cup.Main.main(option);
} catch (Exception e) {
System.out.println("Error en: "+ e);
}
3. Lo ejecutamos
El c´odigo del compilador para la concatenaci´on de palabras lo podr´an encontrar en el
siguiente link: https://github.com/mechasjessy/CompiladorConcatencion/
B. Conclusiones
- Para crear compiladores de debe tener conocimiento e investigar la estructura de
cada archivo (Lex y Cup).
- El compilador esta compuesto por: analizador l´exico, analizador sint´actico y ana-
lizador sem´antico, de los cuales se debe tener un conocimiento de la funci´on que
realizan estos en el compilador.
- Hay que tener muy en claro el compilador que deseamos construir para no tener
problemas en el transcurso de la construcci´on de los analizadores.
C. Recomendaciones
- Nunca olvidar a˜nadir las librer´ıas jflex.jar y java-cup.jar al proyecto.
- En los archivo lex y cup en la primera parte no olvidar colocar el nombre de la
carpeta donde se va a generar el java de nuestros analizadores.
9
Referencias
[1] “Breve Introducci´on a CUP”. Fundamentos de Ordenadores I. Disponible en: http:
//www.it.uc3m.es/˜luis/fo1/p/CUP.html
[2] R. A. Vega Castro.(Octubre-2008). “Integraci´on de JFlex y CUP”. Disponible en:
http://www.rafaelvega.com/wp-content/uploads/Articulo.pdf
[3] Open Fecks. Estructura del Archivo JLex. Disponible en: https://openfecks.
wordpress.com/jlex-y-cup/plantilla-archivo-jlex/
10

Recomendados

Analizador de una matriz utilizando compiladores von
Analizador de una matriz utilizando compiladoresAnalizador de una matriz utilizando compiladores
Analizador de una matriz utilizando compiladoresChristian Lara
545 views22 Folien
Weka von
WekaWeka
WekaYIMMI ARTURO MATEO UBILLA
195 views44 Folien
Weka von
WekaWeka
WekaRichyBriones
623 views44 Folien
Reporte unidad3 von
Reporte unidad3Reporte unidad3
Reporte unidad3Adrián Vega Segura
218 views8 Folien
Python boloñesa von
Python boloñesa Python boloñesa
Python boloñesa Álvaro León Santiago
396 views44 Folien
Practicas en matlab von
Practicas en matlabPracticas en matlab
Practicas en matlabbachispasaca
2.4K views28 Folien

Más contenido relacionado

Similar a Compilador concatenacion

Raúl A Gómez A -> Compilador Cambia de Color a una palabra ingresada von
Raúl  A Gómez A -> Compilador Cambia de Color  a una palabra ingresadaRaúl  A Gómez A -> Compilador Cambia de Color  a una palabra ingresada
Raúl A Gómez A -> Compilador Cambia de Color a una palabra ingresadaRaul
613 views19 Folien
Compilador Convertidor de Divisas von
Compilador Convertidor de DivisasCompilador Convertidor de Divisas
Compilador Convertidor de DivisasUniversidad Nacional de Loja
256 views16 Folien
Documeto compilardorcontadorletras von
Documeto compilardorcontadorletrasDocumeto compilardorcontadorletras
Documeto compilardorcontadorletrasSebastian Ocampo Vélez
258 views19 Folien
Compilador Usando Jflex y Cup von
Compilador Usando Jflex y CupCompilador Usando Jflex y Cup
Compilador Usando Jflex y Cupditopo
17.1K views13 Folien
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand... von
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...Diego Paúl Cuenca Quezada
2.7K views19 Folien
Compilador para la generación de código a partir de las iniciales de los nomb... von
Compilador para la generación de código a partir de las iniciales de los nomb...Compilador para la generación de código a partir de las iniciales de los nomb...
Compilador para la generación de código a partir de las iniciales de los nomb...Ana Mora
633 views18 Folien

Similar a Compilador concatenacion(20)

Raúl A Gómez A -> Compilador Cambia de Color a una palabra ingresada von Raul
Raúl  A Gómez A -> Compilador Cambia de Color  a una palabra ingresadaRaúl  A Gómez A -> Compilador Cambia de Color  a una palabra ingresada
Raúl A Gómez A -> Compilador Cambia de Color a una palabra ingresada
Raul 613 views
Compilador Usando Jflex y Cup von ditopo
Compilador Usando Jflex y CupCompilador Usando Jflex y Cup
Compilador Usando Jflex y Cup
ditopo17.1K views
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand... von Diego Paúl Cuenca Quezada
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...
Compilador para la generación de código a partir de las iniciales de los nomb... von Ana Mora
Compilador para la generación de código a partir de las iniciales de los nomb...Compilador para la generación de código a partir de las iniciales de los nomb...
Compilador para la generación de código a partir de las iniciales de los nomb...
Ana Mora633 views
Proyecto de compiladores Sentencia While con Java CUP y JFLEX von Ivan Luis Jimenez
Proyecto de compiladores Sentencia While con Java CUP y JFLEXProyecto de compiladores Sentencia While con Java CUP y JFLEX
Proyecto de compiladores Sentencia While con Java CUP y JFLEX
Informe compilador divisor von Soraya Lara
Informe compilador divisorInforme compilador divisor
Informe compilador divisor
Soraya Lara616 views
Compilador (divisor de cantidades ) von Soraya Lara
Compilador (divisor de cantidades )Compilador (divisor de cantidades )
Compilador (divisor de cantidades )
Soraya Lara342 views
Compilador divisor de cantidades con Jflex y Cup von Soraya Lara
Compilador divisor de cantidades con Jflex y CupCompilador divisor de cantidades con Jflex y Cup
Compilador divisor de cantidades con Jflex y Cup
Soraya Lara6.6K views
Compilador - Área de trapecio von Byron Cabrera
Compilador - Área de trapecioCompilador - Área de trapecio
Compilador - Área de trapecio
Byron Cabrera372 views
Inf 10 (operaciones por pantalla) get von Carlos Guzmán
Inf 10 (operaciones por pantalla) getInf 10 (operaciones por pantalla) get
Inf 10 (operaciones por pantalla) get
Carlos Guzmán40 views
Cap3 von CJAO
Cap3Cap3
Cap3
CJAO548 views
Manual de Compiladores Léxico y Sintáctico.pdf von DavidErnestoT
Manual de Compiladores Léxico y Sintáctico.pdfManual de Compiladores Léxico y Sintáctico.pdf
Manual de Compiladores Léxico y Sintáctico.pdf
DavidErnestoT20 views

Último

Misión en favor de los necesitados von
Misión en favor de los necesitadosMisión en favor de los necesitados
Misión en favor de los necesitadoshttps://gramadal.wordpress.com/
248 views16 Folien
5°_GRADO_-_ACTIVIDAD_DEL_22_DE_NOVIEMBRE.doc von
5°_GRADO_-_ACTIVIDAD_DEL_22_DE_NOVIEMBRE.doc5°_GRADO_-_ACTIVIDAD_DEL_22_DE_NOVIEMBRE.doc
5°_GRADO_-_ACTIVIDAD_DEL_22_DE_NOVIEMBRE.docjosetejada220380
122 views39 Folien
primer clase y diferencias comunicacion e informacion.pptx von
primer clase y diferencias comunicacion e informacion.pptxprimer clase y diferencias comunicacion e informacion.pptx
primer clase y diferencias comunicacion e informacion.pptxNohemiCastillo14
42 views11 Folien
Narrar historias a través de mapas digitales: Story Maps. El proyecto BIOMAPS von
Narrar historias a través de mapas digitales: Story Maps. El proyecto BIOMAPSNarrar historias a través de mapas digitales: Story Maps. El proyecto BIOMAPS
Narrar historias a través de mapas digitales: Story Maps. El proyecto BIOMAPSIsaac Buzo
263 views55 Folien
0 - Organología - Presentación.pptx von
0 - Organología - Presentación.pptx0 - Organología - Presentación.pptx
0 - Organología - Presentación.pptxVICENTEJIMENEZAYALA
122 views10 Folien
Sesión: Misión en favor de los necesitados von
Sesión: Misión en favor de los necesitadosSesión: Misión en favor de los necesitados
Sesión: Misión en favor de los necesitadoshttps://gramadal.wordpress.com/
241 views4 Folien

Último(20)

5°_GRADO_-_ACTIVIDAD_DEL_22_DE_NOVIEMBRE.doc von josetejada220380
5°_GRADO_-_ACTIVIDAD_DEL_22_DE_NOVIEMBRE.doc5°_GRADO_-_ACTIVIDAD_DEL_22_DE_NOVIEMBRE.doc
5°_GRADO_-_ACTIVIDAD_DEL_22_DE_NOVIEMBRE.doc
josetejada220380122 views
primer clase y diferencias comunicacion e informacion.pptx von NohemiCastillo14
primer clase y diferencias comunicacion e informacion.pptxprimer clase y diferencias comunicacion e informacion.pptx
primer clase y diferencias comunicacion e informacion.pptx
NohemiCastillo1442 views
Narrar historias a través de mapas digitales: Story Maps. El proyecto BIOMAPS von Isaac Buzo
Narrar historias a través de mapas digitales: Story Maps. El proyecto BIOMAPSNarrar historias a través de mapas digitales: Story Maps. El proyecto BIOMAPS
Narrar historias a través de mapas digitales: Story Maps. El proyecto BIOMAPS
Isaac Buzo263 views
Presentación de Proyecto Creativo Doodle Azul.pdf von LauraJuarez87
Presentación de Proyecto Creativo Doodle Azul.pdfPresentación de Proyecto Creativo Doodle Azul.pdf
Presentación de Proyecto Creativo Doodle Azul.pdf
LauraJuarez8725 views
Herramientas para Educación a Distancia.pptx von a2223810028
Herramientas para Educación a Distancia.pptxHerramientas para Educación a Distancia.pptx
Herramientas para Educación a Distancia.pptx
a222381002837 views
Infografia María Fuenmayor S _20231126_070624_0000.pdf von mariafuenmayor20
Infografia María Fuenmayor S _20231126_070624_0000.pdfInfografia María Fuenmayor S _20231126_070624_0000.pdf
Infografia María Fuenmayor S _20231126_070624_0000.pdf
mariafuenmayor2029 views
Contrato de aprendizaje y evaluación von LauraJuarez87
Contrato de aprendizaje y evaluación Contrato de aprendizaje y evaluación
Contrato de aprendizaje y evaluación
LauraJuarez8774 views

Compilador concatenacion

  • 1. PFM-CIS-IXB UNIVERSIDAD NACIONAL DE LOJA ´Area de la Energ´ıa las Industrias y los Recursos Naturales No Renovables Carrera de Ingenier´ıa en Sistemas COMPILADORES PROBLEMA: “CONCATENACION DE PALABRAS” Noveno B Alumna: • Cueva Riofrio, Jessica Mercedes Docente: Henry, Paz Loja-Ecuador Septiembre 2014-Febrero 2015
  • 2. ´Indice A. DESARROLLO 3 1 . PROBLEMA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 . ANALIZADOR L´EXICO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 .1. LIBRERIA jflex.jar . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 .2. ARCHIVO FLEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 . ANALIZADOR SINT´ACTICO . . . . . . . . . . . . . . . . . . . . . . . . 5 3 .1. LIBRER´IA CUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3 .2. ARCHIVO CUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 B. Conclusiones 9 C. Recomendaciones 9 2
  • 3. A. DESARROLLO 1 . PROBLEMA CONCATENACI´ON DE PALABRAS El compilador resuelve la uni´on de palabras formadas por may´usculas,min´usculas y n´umeros. 1 La sintaxis que admite el compilador es: (palabra1+palabra2) 2 El par´entesis ( al inicio indica que inicia la expresi´on. 3 El s´ımbolo + indica la concatenaci´on o uni´on de las palabras. 4 El par´entesis ) al final indica el final de la expresi´on. 5 Al momento de unir dos palabras se ignora los espacios. 2 . ANALIZADOR L´EXICO El analizador l´exico es la base para crear un compilador, para poder generar el ana- lizador l´exico en nuestro proyecto necesitamos descargar la librer´ıa jFlex.jar, adem´as de crear el archivo .flex. 2 .1. LIBRERIA jflex.jar Esta librer´ıa nos permite crear el archivo .java del analizador l´exico sin errores. La librer´ıa jflex.jar la podemos descargar del siguiente link: http://www.java2s.com/ Code/Jar/j/DownloadJFlexjar.htm Una vez descargada la libreria jflex.jar la a˜nadimos al proyecto. 2 .2. ARCHIVO FLEX El archivo .flex es la base para poder construir nuestro analizador l´exico, este archivo en el compilador se llama analiLex.flex y est´a estructurado por 3 partes: Secci´on de importaciones % % Secci´on de opciones y declaraciones % % Secci´on de reglas l´exicas 3
  • 4. Secci´on de importaciones En esta secci´on colocamos en la primera l´ınea en c´odigo java el paquete en el que se encuentra nuestro archivo analiLex.flex, luego procedemos a importar las clases que vamos a utilizar para crear nuestro compilador, en nuestro caso son las siguientes: Creamos el paquete donde se encuentra el archivo analiLex.flex /* Codigo de Usuario*/ package archivojflex; Importamos java cup.runtime.* con la finalidad que exista comunicaci´on instant´anea con el analizador sint´actico. import java_cup.runtime.*; import java.io.Reader; Secci´on de opciones y declaraciones Aqu´ı colocamos el nombre de la clase java que va a tomar nuestro analizador l´exico %class AnalizadorFlex, acceso a la columna y fila de an´alisis CUP %line y %column, habilitamos la compatibilidad con la interfaz CUP para el generador sint´actico %cup, quedando esta secci´on de la siguiente manera: %% %class AnalizadorFlex %line %column %cup Declaraciones: son m´etodos en c´odigo java para identificar los s´ımbolos o token del compilador %{ private Symbol symbol(int type) { return new Symbol(type, yyline, yycolumn); } private Symbol symbol(int type, Object value) { return new Symbol(type, yyline, yycolumn, value); } %} Macro declaraciones: son declaraci´on de variables que se utilizaran en la siguiente secci´on, para determinar las reglas l´exicas del compilador: 4
  • 5. Salto = r|n|rn Espacio = {Salto} | [ tf] Dig = 0 | [1-9][0-9]* Letras = [a-zA-Z_] Por ´ultimo en nuestro archivo analiLex.flex colocamos la tercera secci´on: Secci´on de reglas l´exicas Esta secci´on se refiere a las reglas l´exicas que va a tener el compilador. Las que permi- ten identificar los s´ımbolos retornando un valor dependiendo del s´ımbolo que ingresemos y si ingresamos una palabra retornara PALABRA: %% /*Seccion de reglas lexicas*/ <YYINITIAL> { "+" {return new Symbol(sym.MAS);} "(" {return new Symbol(sym.ABPARENT);} ")" {return new Symbol(sym.CEPARENT);} ({Letras}|{Dig})*{Letras} |({Letras}|{Dig})*{Dig} {return symbol(sym.PALABRA, new String(yytext()));} {Espacio} { /* ignora el espacio */ } } [ˆ] { throw new Error("Caracter ilegal <"+yytext()+">"); } Una vez que hayamos construido el archivo analiLex.flex procedemos a generar la clase AnalizadorLexico.java de la siguiente manera: 1. Creamos en nuestro proyecto una clase ejecutora denominada jlflex 2. Digitamos en el main lo siguiente: String [] flex = {"srcarchivosanaliLex.flex"}; jflex.Main.main(flex); 3. Lo ejecutamos 3 . ANALIZADOR SINT´ACTICO El analizador sint´actico determina la sintaxis que va a tener el compilador, para crear el analizador sint´actico necesitamos descargar la librer´ıa java-cup.jar, adem´as de la crea- ci´on del archivo .cup. 5
  • 6. 3 .1. LIBRER´IA CUP La librer´ıa java-cup.jar la podemos descargar del siguiente link: http://www2.cs.tum. edu/projects/cup/. Una vez descargada la librer´ıa java-cup.jar la a˜nadimos al proyecto en el que estamos trabajando. 3 .2. ARCHIVO CUP El archivo palabras.cup es la base para construir el analizador sint´actico y sem´antico, est´a conformado por 5 partes que son las siguientes: 1 Especificaciones de “package” e “imports”. 2 Componentes de c´odigo de usuario. 3 Declaraci´on de s´ımbolos terminales y no terminales. 4 Declaraciones de precedencia. 5 Especificaci´on de la gram´atica. 1. Especificaciones de “package” e “imports”. En esta parte se colocan: el paquete en el que se encuentra el archivo palabras.cup e importaciones de clases de la librer´ıa java-cup.jar a utilizar en el proyecto, ademas estas importaciones son necesaria dentro del c´odigo. package ejemplocup; import java_cup.runtime.*; import java.io.FileReader; 2. Componentes de c´odigo de usuario En el parser code{: :} de esta secci´on ponemos el c´odigo java de las acciones que va a realizar el compilador, es decir, en este caso se realizaran dos m´etodos para la captura de errores (n´umero de fila, n´umero de columna, el texto del error). parser code {: /* Reporte de error encontrado. */ public void report_error(String message, Object info) { StringBuilder m = new StringBuilder("Error"); if (info instanceof java_cup.runtime.Symbol) { java_cup.runtime.Symbol s = ((java_cup.runtime.Symbol) info); if (s.left >= 0) { 6
  • 7. m.append(" in line "+(s.left+1)); if (s.right >= 0) m.append(", column "+(s.right+1)); } } if("#5".equals(info.toString())){ message=("Revise PARENTESIS del INICIO"); } if("#0".equals(info.toString())){ message=("Revise PARENTESIS del FINAL"); } if("#4".equals(info.toString())){ message=("Falta simbolo de SUMA"); } m.append(" : "+message); System.err.println(m); } public void report_fatal_error(String message, Object info) { report_error(message, info); System.exit(1); } :}; 3. Declaraci´on de s´ımbolos terminales y no terminales En los terminales colocamos los tokens o s´ımbolos que sirven para formar la expresi´on gramatical del compilador. /* Declaraci´on de s´ımbolos terminales y no terminales */ terminal MAS, ABPARENT, CEPARENT; terminal String PALABRA; En los no terminales se colocan las variables que van a componer la expresi´on grama- tical, en este caso se hace de la siguiente manera: non terminal Object expr_list, expr_part; non terminal String palabra, expr; donde: expr list: es de tipo Object porque almacena un conjunto de expr part . expr part: es de tipo Object porque almacena dos expr encerradas en par´entesis expr 7
  • 8. expr: es de tipo String porque almacena la uni´on o concatenaci´on de dos palabras ejemplo palabra + palabra palabra : es de tipo String, y es una palabra normal 4.Declaraciones de precedencia Esta parte es opcional, en este caso no las necesitamos. Por ´ultimo realizamos la quinta secci´on o parte del archivo palabras.cup. 5. Especificaci´on de la gram´atica /*Expresiones gramaticales*/ expr_list ::= expr_list expr_part | expr_part ; expr_part ::= ABPARENT expr:e CEPARENT {: System.out.println(""); :} ; expr ::= palabra:e MAS palabra:v {: System.out.print("Concatenado: "+e+v); :} ; palabra ::= PALABRA:e {: RESULT = e; :} ; Una vez construido el archivo palabras.cup procedemos a generar AnalizadorSin- tac.java de la siguiente manera: 1. Creamos en nuestro proyecto una clase ejecutora denominada MainCup 2. Digitamos en el main lo siguiente: 8
  • 9. String [] option=new String [5]; option[0]="-destdir"; option[1]="src" +File.separator+"archivos"; option[2]="-parser"; option[3]="AnalizadorSintac"; option[4]="src"+File.separator+"archivos"+File.separator+"palabras.cup"; try { java_cup.Main.main(option); } catch (Exception e) { System.out.println("Error en: "+ e); } 3. Lo ejecutamos El c´odigo del compilador para la concatenaci´on de palabras lo podr´an encontrar en el siguiente link: https://github.com/mechasjessy/CompiladorConcatencion/ B. Conclusiones - Para crear compiladores de debe tener conocimiento e investigar la estructura de cada archivo (Lex y Cup). - El compilador esta compuesto por: analizador l´exico, analizador sint´actico y ana- lizador sem´antico, de los cuales se debe tener un conocimiento de la funci´on que realizan estos en el compilador. - Hay que tener muy en claro el compilador que deseamos construir para no tener problemas en el transcurso de la construcci´on de los analizadores. C. Recomendaciones - Nunca olvidar a˜nadir las librer´ıas jflex.jar y java-cup.jar al proyecto. - En los archivo lex y cup en la primera parte no olvidar colocar el nombre de la carpeta donde se va a generar el java de nuestros analizadores. 9
  • 10. Referencias [1] “Breve Introducci´on a CUP”. Fundamentos de Ordenadores I. Disponible en: http: //www.it.uc3m.es/˜luis/fo1/p/CUP.html [2] R. A. Vega Castro.(Octubre-2008). “Integraci´on de JFlex y CUP”. Disponible en: http://www.rafaelvega.com/wp-content/uploads/Articulo.pdf [3] Open Fecks. Estructura del Archivo JLex. Disponible en: https://openfecks. wordpress.com/jlex-y-cup/plantilla-archivo-jlex/ 10