View
391
Download
0
Category
Preview:
Citation preview
CIS-IXB-001UNIVERSIDADNACIONALDE LOJA
Area de la Energıa las Industrias y los Recursos Naturales No Renovables
Carrera de Ingenierıa en Sistemas
ldquoCOMPILADOR DIVISOR DECANTIDADESrdquo
MODULO IX B
Autores
SORAYA ISAMAR LARA TAPIA
DocenteING HENRY PAZ
Fecha13 FEBRERO 2014
Loja-EcuadorSeptiembre 2014 - Julio 2015
1
Indice1 Problema 3
11 Ejemplos 3
2 Automata 3
3 Desarrollo 3
4 JFlex 341 Codigo de usuario 442 Directivas JFLex 443 Reglas lexicas 6
5 CUP 751 Definicion de paquete e importacion de paquetes necesarios 752 Codigo de usuario 853 Declaracion de sımbolos terminales y no terminales 1154 Definicion del sımbolo inicial de la gramatica y las reglas de produccion 11
6 Sym 13
7 Control de errores 14
8 Funcionamiento del compilador 14
9 Ejecucion de Errores 15
10Conclusiones 19
11Recomendaciones 19
12Referencia del codigo fuente 20
13Bibliografica 21
2
1 ProblemaUn compilador que permita dividir en partes iguales el total de una cantidad de dinero
para un numero determinado de personas las cuales tienen que ser diferentes de cero
11 EjemplosEl Ingreso de datos debe ser 357 y el resultado obtenido sera igual 2833333
2 AutomataA continuacion presentamos la representacion del automata que es la estructura del
compilador Figura 1
Figura 1 Automata del compilador
3 DesarrolloPara el desarrollo del compilador se esa utilizando la librerıa JFLEX y CUP que son
la parte lexica y sintactica del compilador
4 JFlexEs desarrollada en Java la cual genera un programa en Java a partir de una especifi-
cacion en el que se indican los tokens permitidos por nuestro lenguaje
Un archivo de especificacion para JFLex esta organizado en tres secciones separadaspor ldquo rdquo
3
41 Codigo de usuarioEn esta seccion se crean las clases necesarias para nuestro analizador lexico las cuales
seran copiadas directamente al inicio del archivo de salida y se importan los paquetesnecesarios Primero se declara el nombre del paquete en el cual esta contenido y la librerıasa utilizar Figura 2
Figura 2 Codigo de usuario
42 Directivas JFLexEn esta seccion se incluyen algunas reglas propias de JFLex Tambien se pueden definir
macros que resuman ciertas expresiones regulares que nos seran utiles al momento deidentificar tokens en la siguiente seccion y estados Figura 3
Figura 3 Directivas de Jflex
4
Cambiamos el nombre de la clase del analizador a Lexer class AnalizadorLexico
Realizamos la activacion del contador de lineas variable yyline y el contador de co-lumna variable yycolumnlinecolumn
Luego hay que activar la compatibilidad con Java CUP para analizadores sintacticos cup
Generamos un java cupSymbol para guardar el tipo de token encontrado
private Symbol symbol(int type) return new Symbol(type yyline yycolumn)
Tambien generamos un Symbol para el tipo de token encontrado junto con su valor
private Symbol symbol(int type Object value) return new Symbol(type yyline yycolumn value)
Las Macro declaraciones Figura 4
Figura 4 Las Macro declaraciones
Un salto de linea es un n r
Salto = r|n|rn
Espacio es un espacio en blanco tabulador t salto de linea o avance de pagina fnormalmente son ignoradosEspacio = Salto | [ tf]
para que reconozca numeros enteros
Entero = 0 | [1-9][0-9]
5
43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en
Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente
Figura 5 Reglas lexicas
YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial
ltYYINITIALgt
Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)
return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)
return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)
return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero
que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado
6
Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)
return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio
Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal
[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))
5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el
analizador sintactico de nuestro lenguaje
CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6
Figura 6 Paquetes e importaciones
package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-
ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7
Figura 7 Metodo report error
Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8
8
Figura 8 Metodo Main y division
Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main
parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto
public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol
if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador
Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol
if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))
Este if verifica el identificador es igual a 2 entonces
9
se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero
al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)
Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)
try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))
Object result = asinparse()value catch (Exception ex)
Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)
Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)
Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo
10
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
Indice1 Problema 3
11 Ejemplos 3
2 Automata 3
3 Desarrollo 3
4 JFlex 341 Codigo de usuario 442 Directivas JFLex 443 Reglas lexicas 6
5 CUP 751 Definicion de paquete e importacion de paquetes necesarios 752 Codigo de usuario 853 Declaracion de sımbolos terminales y no terminales 1154 Definicion del sımbolo inicial de la gramatica y las reglas de produccion 11
6 Sym 13
7 Control de errores 14
8 Funcionamiento del compilador 14
9 Ejecucion de Errores 15
10Conclusiones 19
11Recomendaciones 19
12Referencia del codigo fuente 20
13Bibliografica 21
2
1 ProblemaUn compilador que permita dividir en partes iguales el total de una cantidad de dinero
para un numero determinado de personas las cuales tienen que ser diferentes de cero
11 EjemplosEl Ingreso de datos debe ser 357 y el resultado obtenido sera igual 2833333
2 AutomataA continuacion presentamos la representacion del automata que es la estructura del
compilador Figura 1
Figura 1 Automata del compilador
3 DesarrolloPara el desarrollo del compilador se esa utilizando la librerıa JFLEX y CUP que son
la parte lexica y sintactica del compilador
4 JFlexEs desarrollada en Java la cual genera un programa en Java a partir de una especifi-
cacion en el que se indican los tokens permitidos por nuestro lenguaje
Un archivo de especificacion para JFLex esta organizado en tres secciones separadaspor ldquo rdquo
3
41 Codigo de usuarioEn esta seccion se crean las clases necesarias para nuestro analizador lexico las cuales
seran copiadas directamente al inicio del archivo de salida y se importan los paquetesnecesarios Primero se declara el nombre del paquete en el cual esta contenido y la librerıasa utilizar Figura 2
Figura 2 Codigo de usuario
42 Directivas JFLexEn esta seccion se incluyen algunas reglas propias de JFLex Tambien se pueden definir
macros que resuman ciertas expresiones regulares que nos seran utiles al momento deidentificar tokens en la siguiente seccion y estados Figura 3
Figura 3 Directivas de Jflex
4
Cambiamos el nombre de la clase del analizador a Lexer class AnalizadorLexico
Realizamos la activacion del contador de lineas variable yyline y el contador de co-lumna variable yycolumnlinecolumn
Luego hay que activar la compatibilidad con Java CUP para analizadores sintacticos cup
Generamos un java cupSymbol para guardar el tipo de token encontrado
private Symbol symbol(int type) return new Symbol(type yyline yycolumn)
Tambien generamos un Symbol para el tipo de token encontrado junto con su valor
private Symbol symbol(int type Object value) return new Symbol(type yyline yycolumn value)
Las Macro declaraciones Figura 4
Figura 4 Las Macro declaraciones
Un salto de linea es un n r
Salto = r|n|rn
Espacio es un espacio en blanco tabulador t salto de linea o avance de pagina fnormalmente son ignoradosEspacio = Salto | [ tf]
para que reconozca numeros enteros
Entero = 0 | [1-9][0-9]
5
43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en
Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente
Figura 5 Reglas lexicas
YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial
ltYYINITIALgt
Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)
return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)
return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)
return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero
que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado
6
Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)
return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio
Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal
[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))
5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el
analizador sintactico de nuestro lenguaje
CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6
Figura 6 Paquetes e importaciones
package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-
ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7
Figura 7 Metodo report error
Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8
8
Figura 8 Metodo Main y division
Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main
parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto
public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol
if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador
Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol
if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))
Este if verifica el identificador es igual a 2 entonces
9
se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero
al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)
Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)
try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))
Object result = asinparse()value catch (Exception ex)
Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)
Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)
Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo
10
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
1 ProblemaUn compilador que permita dividir en partes iguales el total de una cantidad de dinero
para un numero determinado de personas las cuales tienen que ser diferentes de cero
11 EjemplosEl Ingreso de datos debe ser 357 y el resultado obtenido sera igual 2833333
2 AutomataA continuacion presentamos la representacion del automata que es la estructura del
compilador Figura 1
Figura 1 Automata del compilador
3 DesarrolloPara el desarrollo del compilador se esa utilizando la librerıa JFLEX y CUP que son
la parte lexica y sintactica del compilador
4 JFlexEs desarrollada en Java la cual genera un programa en Java a partir de una especifi-
cacion en el que se indican los tokens permitidos por nuestro lenguaje
Un archivo de especificacion para JFLex esta organizado en tres secciones separadaspor ldquo rdquo
3
41 Codigo de usuarioEn esta seccion se crean las clases necesarias para nuestro analizador lexico las cuales
seran copiadas directamente al inicio del archivo de salida y se importan los paquetesnecesarios Primero se declara el nombre del paquete en el cual esta contenido y la librerıasa utilizar Figura 2
Figura 2 Codigo de usuario
42 Directivas JFLexEn esta seccion se incluyen algunas reglas propias de JFLex Tambien se pueden definir
macros que resuman ciertas expresiones regulares que nos seran utiles al momento deidentificar tokens en la siguiente seccion y estados Figura 3
Figura 3 Directivas de Jflex
4
Cambiamos el nombre de la clase del analizador a Lexer class AnalizadorLexico
Realizamos la activacion del contador de lineas variable yyline y el contador de co-lumna variable yycolumnlinecolumn
Luego hay que activar la compatibilidad con Java CUP para analizadores sintacticos cup
Generamos un java cupSymbol para guardar el tipo de token encontrado
private Symbol symbol(int type) return new Symbol(type yyline yycolumn)
Tambien generamos un Symbol para el tipo de token encontrado junto con su valor
private Symbol symbol(int type Object value) return new Symbol(type yyline yycolumn value)
Las Macro declaraciones Figura 4
Figura 4 Las Macro declaraciones
Un salto de linea es un n r
Salto = r|n|rn
Espacio es un espacio en blanco tabulador t salto de linea o avance de pagina fnormalmente son ignoradosEspacio = Salto | [ tf]
para que reconozca numeros enteros
Entero = 0 | [1-9][0-9]
5
43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en
Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente
Figura 5 Reglas lexicas
YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial
ltYYINITIALgt
Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)
return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)
return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)
return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero
que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado
6
Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)
return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio
Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal
[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))
5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el
analizador sintactico de nuestro lenguaje
CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6
Figura 6 Paquetes e importaciones
package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-
ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7
Figura 7 Metodo report error
Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8
8
Figura 8 Metodo Main y division
Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main
parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto
public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol
if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador
Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol
if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))
Este if verifica el identificador es igual a 2 entonces
9
se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero
al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)
Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)
try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))
Object result = asinparse()value catch (Exception ex)
Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)
Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)
Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo
10
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
41 Codigo de usuarioEn esta seccion se crean las clases necesarias para nuestro analizador lexico las cuales
seran copiadas directamente al inicio del archivo de salida y se importan los paquetesnecesarios Primero se declara el nombre del paquete en el cual esta contenido y la librerıasa utilizar Figura 2
Figura 2 Codigo de usuario
42 Directivas JFLexEn esta seccion se incluyen algunas reglas propias de JFLex Tambien se pueden definir
macros que resuman ciertas expresiones regulares que nos seran utiles al momento deidentificar tokens en la siguiente seccion y estados Figura 3
Figura 3 Directivas de Jflex
4
Cambiamos el nombre de la clase del analizador a Lexer class AnalizadorLexico
Realizamos la activacion del contador de lineas variable yyline y el contador de co-lumna variable yycolumnlinecolumn
Luego hay que activar la compatibilidad con Java CUP para analizadores sintacticos cup
Generamos un java cupSymbol para guardar el tipo de token encontrado
private Symbol symbol(int type) return new Symbol(type yyline yycolumn)
Tambien generamos un Symbol para el tipo de token encontrado junto con su valor
private Symbol symbol(int type Object value) return new Symbol(type yyline yycolumn value)
Las Macro declaraciones Figura 4
Figura 4 Las Macro declaraciones
Un salto de linea es un n r
Salto = r|n|rn
Espacio es un espacio en blanco tabulador t salto de linea o avance de pagina fnormalmente son ignoradosEspacio = Salto | [ tf]
para que reconozca numeros enteros
Entero = 0 | [1-9][0-9]
5
43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en
Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente
Figura 5 Reglas lexicas
YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial
ltYYINITIALgt
Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)
return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)
return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)
return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero
que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado
6
Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)
return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio
Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal
[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))
5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el
analizador sintactico de nuestro lenguaje
CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6
Figura 6 Paquetes e importaciones
package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-
ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7
Figura 7 Metodo report error
Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8
8
Figura 8 Metodo Main y division
Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main
parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto
public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol
if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador
Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol
if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))
Este if verifica el identificador es igual a 2 entonces
9
se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero
al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)
Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)
try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))
Object result = asinparse()value catch (Exception ex)
Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)
Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)
Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo
10
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
Cambiamos el nombre de la clase del analizador a Lexer class AnalizadorLexico
Realizamos la activacion del contador de lineas variable yyline y el contador de co-lumna variable yycolumnlinecolumn
Luego hay que activar la compatibilidad con Java CUP para analizadores sintacticos cup
Generamos un java cupSymbol para guardar el tipo de token encontrado
private Symbol symbol(int type) return new Symbol(type yyline yycolumn)
Tambien generamos un Symbol para el tipo de token encontrado junto con su valor
private Symbol symbol(int type Object value) return new Symbol(type yyline yycolumn value)
Las Macro declaraciones Figura 4
Figura 4 Las Macro declaraciones
Un salto de linea es un n r
Salto = r|n|rn
Espacio es un espacio en blanco tabulador t salto de linea o avance de pagina fnormalmente son ignoradosEspacio = Salto | [ tf]
para que reconozca numeros enteros
Entero = 0 | [1-9][0-9]
5
43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en
Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente
Figura 5 Reglas lexicas
YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial
ltYYINITIALgt
Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)
return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)
return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)
return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero
que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado
6
Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)
return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio
Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal
[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))
5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el
analizador sintactico de nuestro lenguaje
CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6
Figura 6 Paquetes e importaciones
package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-
ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7
Figura 7 Metodo report error
Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8
8
Figura 8 Metodo Main y division
Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main
parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto
public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol
if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador
Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol
if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))
Este if verifica el identificador es igual a 2 entonces
9
se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero
al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)
Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)
try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))
Object result = asinparse()value catch (Exception ex)
Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)
Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)
Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo
10
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en
Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente
Figura 5 Reglas lexicas
YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial
ltYYINITIALgt
Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)
return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)
return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)
return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero
que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado
6
Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)
return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio
Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal
[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))
5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el
analizador sintactico de nuestro lenguaje
CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6
Figura 6 Paquetes e importaciones
package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-
ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7
Figura 7 Metodo report error
Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8
8
Figura 8 Metodo Main y division
Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main
parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto
public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol
if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador
Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol
if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))
Este if verifica el identificador es igual a 2 entonces
9
se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero
al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)
Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)
try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))
Object result = asinparse()value catch (Exception ex)
Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)
Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)
Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo
10
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)
return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio
Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal
[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))
5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el
analizador sintactico de nuestro lenguaje
CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6
Figura 6 Paquetes e importaciones
package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-
ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7
Figura 7 Metodo report error
Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8
8
Figura 8 Metodo Main y division
Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main
parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto
public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol
if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador
Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol
if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))
Este if verifica el identificador es igual a 2 entonces
9
se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero
al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)
Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)
try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))
Object result = asinparse()value catch (Exception ex)
Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)
Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)
Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo
10
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-
ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7
Figura 7 Metodo report error
Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8
8
Figura 8 Metodo Main y division
Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main
parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto
public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol
if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador
Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol
if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))
Este if verifica el identificador es igual a 2 entonces
9
se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero
al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)
Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)
try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))
Object result = asinparse()value catch (Exception ex)
Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)
Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)
Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo
10
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
Figura 8 Metodo Main y division
Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main
parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto
public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol
if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador
Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol
if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))
Este if verifica el identificador es igual a 2 entonces
9
se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero
al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)
Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)
try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))
Object result = asinparse()value catch (Exception ex)
Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)
Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)
Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo
10
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero
al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)
Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)
try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))
Object result = asinparse()value catch (Exception ex)
Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)
Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)
Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo
10
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la
gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase
Figura 9 Declaracion de terminales y no terminales
---Declaracion de sımbolos terminales y no terminales---
Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO
No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String
non terminal Object expr1 expr2non terminal Object sentencia
54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion
Las reglas de produccion tienen esta sintaxis
expresion = expresion ltsımbolo terminalgt expresion codigo java
Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |
11
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
Figura 10 Seccion Gramatical
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae
Systemoutprintln( igual +e)
Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =
12
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA
El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())
6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica
figura 11
Figura 11 Codigo java de la clase sym
package ejemplocup CUP generated class containing symbol constants public class sym terminals
public static final int OP_CERO = 4public static final int FINLINEA = 2
13
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5
7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el
analizador sintactico en el metodo de report error figura 12
Figura 12 Errores sintacticos
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
14
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual
se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15
Figura 15 Ejecucion correcta
15
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como
entrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17
Figura 17 Sin operador
16
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19
Figura 19 Sin denominador
17
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
18
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia
El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado
La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup
11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores
Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias
En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador
19
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom
pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip
20
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
13 Bibliografica
Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en
http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ
[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml
[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico
[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex
[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf
21
Recommended