CIS-IXB-001UNIVERSIDADNACIONALDE LOJA
Area de la Energıa las Industrias y los Recursos Naturales No Renovables
Carrera de Ingenierıa en Sistemas
COMPILADOR 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 Ejemplo 3
2 Automata 3
3 Desarrollo 3
4 JFlex 341 Codigo de usuario 442 Directivas JFLex 443 Seccion de 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 15
9 BIBLIOGRAFIA 19
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 Ejemplo35 5 igual 7
2 Automataa continuacion presentamos la representacion del automata el cual representa la es-
tructura del compilador Figura 1
Figura 1 Automata del compilador
3 DesarrolloPara el desarrollo del compilador se esa utilizando la librerıa JFLEX y CUP
4 JFlexEs una herramienta desarrollada en Java la cual genera un programa en Java a partir
de una especificacion 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 Se importan los paquetesnecesariosPrimero se declara el nombre del paquete en el cual esta contenido 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 encontradoprivate Symbol symbol(int type)
return new Symbol(type yyline yycolumn)
Tambien generamos un Symbol para el tipo de token encontrado junto con su valorprivate 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 enterosEntero = 0 | [1-9][0-9]
5
43 Seccion de 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 apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex
La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos
Un archivo de entrada para CUP consta de las siguientes secciones
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6
package ejemplocup
import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
Figura 6 Paquetes e importaciones
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 y Divisor que es que realiza la operacion de dividir
8
cantidades figura 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))
9
Este if verifica el identificador es igual a 2 entoncesse 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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
Indice1 Problema 3
11 Ejemplo 3
2 Automata 3
3 Desarrollo 3
4 JFlex 341 Codigo de usuario 442 Directivas JFLex 443 Seccion de 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 15
9 BIBLIOGRAFIA 19
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 Ejemplo35 5 igual 7
2 Automataa continuacion presentamos la representacion del automata el cual representa la es-
tructura del compilador Figura 1
Figura 1 Automata del compilador
3 DesarrolloPara el desarrollo del compilador se esa utilizando la librerıa JFLEX y CUP
4 JFlexEs una herramienta desarrollada en Java la cual genera un programa en Java a partir
de una especificacion 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 Se importan los paquetesnecesariosPrimero se declara el nombre del paquete en el cual esta contenido 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 encontradoprivate Symbol symbol(int type)
return new Symbol(type yyline yycolumn)
Tambien generamos un Symbol para el tipo de token encontrado junto con su valorprivate 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 enterosEntero = 0 | [1-9][0-9]
5
43 Seccion de 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 apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex
La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos
Un archivo de entrada para CUP consta de las siguientes secciones
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6
package ejemplocup
import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
Figura 6 Paquetes e importaciones
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 y Divisor que es que realiza la operacion de dividir
8
cantidades figura 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))
9
Este if verifica el identificador es igual a 2 entoncesse 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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
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 Ejemplo35 5 igual 7
2 Automataa continuacion presentamos la representacion del automata el cual representa la es-
tructura del compilador Figura 1
Figura 1 Automata del compilador
3 DesarrolloPara el desarrollo del compilador se esa utilizando la librerıa JFLEX y CUP
4 JFlexEs una herramienta desarrollada en Java la cual genera un programa en Java a partir
de una especificacion 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 Se importan los paquetesnecesariosPrimero se declara el nombre del paquete en el cual esta contenido 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 encontradoprivate Symbol symbol(int type)
return new Symbol(type yyline yycolumn)
Tambien generamos un Symbol para el tipo de token encontrado junto con su valorprivate 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 enterosEntero = 0 | [1-9][0-9]
5
43 Seccion de 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 apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex
La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos
Un archivo de entrada para CUP consta de las siguientes secciones
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6
package ejemplocup
import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
Figura 6 Paquetes e importaciones
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 y Divisor que es que realiza la operacion de dividir
8
cantidades figura 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))
9
Este if verifica el identificador es igual a 2 entoncesse 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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
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 Se importan los paquetesnecesariosPrimero se declara el nombre del paquete en el cual esta contenido 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 encontradoprivate Symbol symbol(int type)
return new Symbol(type yyline yycolumn)
Tambien generamos un Symbol para el tipo de token encontrado junto con su valorprivate 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 enterosEntero = 0 | [1-9][0-9]
5
43 Seccion de 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 apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex
La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos
Un archivo de entrada para CUP consta de las siguientes secciones
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6
package ejemplocup
import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
Figura 6 Paquetes e importaciones
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 y Divisor que es que realiza la operacion de dividir
8
cantidades figura 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))
9
Este if verifica el identificador es igual a 2 entoncesse 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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
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 encontradoprivate Symbol symbol(int type)
return new Symbol(type yyline yycolumn)
Tambien generamos un Symbol para el tipo de token encontrado junto con su valorprivate 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 enterosEntero = 0 | [1-9][0-9]
5
43 Seccion de 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 apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex
La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos
Un archivo de entrada para CUP consta de las siguientes secciones
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6
package ejemplocup
import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
Figura 6 Paquetes e importaciones
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 y Divisor que es que realiza la operacion de dividir
8
cantidades figura 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))
9
Este if verifica el identificador es igual a 2 entoncesse 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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
43 Seccion de 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 apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex
La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos
Un archivo de entrada para CUP consta de las siguientes secciones
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6
package ejemplocup
import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
Figura 6 Paquetes e importaciones
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 y Divisor que es que realiza la operacion de dividir
8
cantidades figura 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))
9
Este if verifica el identificador es igual a 2 entoncesse 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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
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 apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex
La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos
Un archivo de entrada para CUP consta de las siguientes secciones
51 Definicion de paquete e importacion de paquetes necesa-rios
En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6
package ejemplocup
import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList
7
Figura 6 Paquetes e importaciones
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 y Divisor que es que realiza la operacion de dividir
8
cantidades figura 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))
9
Este if verifica el identificador es igual a 2 entoncesse 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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
Figura 6 Paquetes e importaciones
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 y Divisor que es que realiza la operacion de dividir
8
cantidades figura 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))
9
Este if verifica el identificador es igual a 2 entoncesse 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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
cantidades figura 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))
9
Este if verifica el identificador es igual a 2 entoncesse 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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
Este if verifica el identificador es igual a 2 entoncesse 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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
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 sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo
Se pueden definir todas las reglas de produccion que tengan a un mismo sımbolo noterminal figure 10 como antecedente separandolas por el sımbolo |
------------------- Seccion de la gramatica ------------------------
La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales
11
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
Figura 10 Seccion Gramatical
se dice que no reduce y por lo tanto nunca se finaliza Su procesado
expr1 = expr1 expr2|expr2
En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java
expr2 = 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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
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 lexica y
sintactica figura 11
Figura 11 Codigo java de la clase sym
13
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
package ejemplocup CUP generated class containing symbol constants public class sym
terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public 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
14
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
Y la parte de control de caracteres se realiza en la seccion lexica Figura 13
Figura 13 Errores lexicos
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
Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico
Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15
15
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
Figura 15 Ejecucion correcta
Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada
1 Cuando falta fin de linea rdquo439rdquo Figura 16
Figura 16 Falta Fin de linea
2 Cuando se ingresa dos cantidades seguidas 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 linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
3 Cuando dividimos para cero rdquo43 0rdquoFigura 18
Figura 18 Denominador cero
4 Cuando no existe denominar el error interpreta como fin de linia al simbolo 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
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
5 Cuando no existe numerador 9rdquoFigura 20
Figura 20 Sin numerador
6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21
Figura 21 Caracteres invalidos
La codigo de este compilador se lo puede encontrar en
httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
18
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19
9 BIBLIOGRAFIA
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
[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk
19