informe compilador divisor

21
CIS-IXB-001 UNIVERSIDAD NACIONAL DE LOJA ´ Area de la Energ´ ıa las Industrias y los Recursos Naturales No Renovables Carrera de Ingenier ´ ıa en Sistemas “COMPILADOR DIVISOR DE CANTIDADES” MODULO IX B Autores: SORAYA ISAMAR LARA TAPIA Docente: ING. HENRY PAZ Fecha: 13 FEBRERO 2014 Loja-Ecuador Septiembre 2014 - Julio 2015 1

Upload: soraya-lara

Post on 21-Jul-2015

391 views

Category:

Education


0 download

TRANSCRIPT

CIS-IXB-001UNIVERSIDADNACIONALDE LOJA

Area de la Energıa las Industrias y los Recursos Naturales No Renovables

Carrera de Ingenierıa en Sistemas

ldquoCOMPILADOR DIVISOR DECANTIDADESrdquo

MODULO IX B

Autores

SORAYA ISAMAR LARA TAPIA

DocenteING HENRY PAZ

Fecha13 FEBRERO 2014

Loja-EcuadorSeptiembre 2014 - Julio 2015

1

Indice1 Problema 3

11 Ejemplos 3

2 Automata 3

3 Desarrollo 3

4 JFlex 341 Codigo de usuario 442 Directivas JFLex 443 Reglas lexicas 6

5 CUP 751 Definicion de paquete e importacion de paquetes necesarios 752 Codigo de usuario 853 Declaracion de sımbolos terminales y no terminales 1154 Definicion del sımbolo inicial de la gramatica y las reglas de produccion 11

6 Sym 13

7 Control de errores 14

8 Funcionamiento del compilador 14

9 Ejecucion de Errores 15

10Conclusiones 19

11Recomendaciones 19

12Referencia del codigo fuente 20

13Bibliografica 21

2

1 ProblemaUn compilador que permita dividir en partes iguales el total de una cantidad de dinero

para un numero determinado de personas las cuales tienen que ser diferentes de cero

11 EjemplosEl Ingreso de datos debe ser 357 y el resultado obtenido sera igual 2833333

2 AutomataA continuacion presentamos la representacion del automata que es la estructura del

compilador Figura 1

Figura 1 Automata del compilador

3 DesarrolloPara el desarrollo del compilador se esa utilizando la librerıa JFLEX y CUP que son

la parte lexica y sintactica del compilador

4 JFlexEs desarrollada en Java la cual genera un programa en Java a partir de una especifi-

cacion en el que se indican los tokens permitidos por nuestro lenguaje

Un archivo de especificacion para JFLex esta organizado en tres secciones separadaspor ldquo rdquo

3

41 Codigo de usuarioEn esta seccion se crean las clases necesarias para nuestro analizador lexico las cuales

seran copiadas directamente al inicio del archivo de salida y se importan los paquetesnecesarios Primero se declara el nombre del paquete en el cual esta contenido y la librerıasa utilizar Figura 2

Figura 2 Codigo de usuario

42 Directivas JFLexEn esta seccion se incluyen algunas reglas propias de JFLex Tambien se pueden definir

macros que resuman ciertas expresiones regulares que nos seran utiles al momento deidentificar tokens en la siguiente seccion y estados Figura 3

Figura 3 Directivas de Jflex

4

Cambiamos el nombre de la clase del analizador a Lexer class AnalizadorLexico

Realizamos la activacion del contador de lineas variable yyline y el contador de co-lumna variable yycolumnlinecolumn

Luego hay que activar la compatibilidad con Java CUP para analizadores sintacticos cup

Generamos un java cupSymbol para guardar el tipo de token encontrado

private Symbol symbol(int type) return new Symbol(type yyline yycolumn)

Tambien generamos un Symbol para el tipo de token encontrado junto con su valor

private Symbol symbol(int type Object value) return new Symbol(type yyline yycolumn value)

Las Macro declaraciones Figura 4

Figura 4 Las Macro declaraciones

Un salto de linea es un n r

Salto = r|n|rn

Espacio es un espacio en blanco tabulador t salto de linea o avance de pagina fnormalmente son ignoradosEspacio = Salto | [ tf]

para que reconozca numeros enteros

Entero = 0 | [1-9][0-9]

5

43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente

Figura 5 Reglas lexicas

YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial

ltYYINITIALgt

Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)

return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)

return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)

return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero

que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado

6

Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)

return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio

Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal

[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))

5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6

Figura 6 Paquetes e importaciones

package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-

ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7

Figura 7 Metodo report error

Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8

8

Figura 8 Metodo Main y division

Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main

parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto

public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol

if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador

Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol

if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))

Este if verifica el identificador es igual a 2 entonces

9

se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero

al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)

Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)

try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))

Object result = asinparse()value catch (Exception ex)

Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)

Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)

Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo

10

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

Indice1 Problema 3

11 Ejemplos 3

2 Automata 3

3 Desarrollo 3

4 JFlex 341 Codigo de usuario 442 Directivas JFLex 443 Reglas lexicas 6

5 CUP 751 Definicion de paquete e importacion de paquetes necesarios 752 Codigo de usuario 853 Declaracion de sımbolos terminales y no terminales 1154 Definicion del sımbolo inicial de la gramatica y las reglas de produccion 11

6 Sym 13

7 Control de errores 14

8 Funcionamiento del compilador 14

9 Ejecucion de Errores 15

10Conclusiones 19

11Recomendaciones 19

12Referencia del codigo fuente 20

13Bibliografica 21

2

1 ProblemaUn compilador que permita dividir en partes iguales el total de una cantidad de dinero

para un numero determinado de personas las cuales tienen que ser diferentes de cero

11 EjemplosEl Ingreso de datos debe ser 357 y el resultado obtenido sera igual 2833333

2 AutomataA continuacion presentamos la representacion del automata que es la estructura del

compilador Figura 1

Figura 1 Automata del compilador

3 DesarrolloPara el desarrollo del compilador se esa utilizando la librerıa JFLEX y CUP que son

la parte lexica y sintactica del compilador

4 JFlexEs desarrollada en Java la cual genera un programa en Java a partir de una especifi-

cacion en el que se indican los tokens permitidos por nuestro lenguaje

Un archivo de especificacion para JFLex esta organizado en tres secciones separadaspor ldquo rdquo

3

41 Codigo de usuarioEn esta seccion se crean las clases necesarias para nuestro analizador lexico las cuales

seran copiadas directamente al inicio del archivo de salida y se importan los paquetesnecesarios Primero se declara el nombre del paquete en el cual esta contenido y la librerıasa utilizar Figura 2

Figura 2 Codigo de usuario

42 Directivas JFLexEn esta seccion se incluyen algunas reglas propias de JFLex Tambien se pueden definir

macros que resuman ciertas expresiones regulares que nos seran utiles al momento deidentificar tokens en la siguiente seccion y estados Figura 3

Figura 3 Directivas de Jflex

4

Cambiamos el nombre de la clase del analizador a Lexer class AnalizadorLexico

Realizamos la activacion del contador de lineas variable yyline y el contador de co-lumna variable yycolumnlinecolumn

Luego hay que activar la compatibilidad con Java CUP para analizadores sintacticos cup

Generamos un java cupSymbol para guardar el tipo de token encontrado

private Symbol symbol(int type) return new Symbol(type yyline yycolumn)

Tambien generamos un Symbol para el tipo de token encontrado junto con su valor

private Symbol symbol(int type Object value) return new Symbol(type yyline yycolumn value)

Las Macro declaraciones Figura 4

Figura 4 Las Macro declaraciones

Un salto de linea es un n r

Salto = r|n|rn

Espacio es un espacio en blanco tabulador t salto de linea o avance de pagina fnormalmente son ignoradosEspacio = Salto | [ tf]

para que reconozca numeros enteros

Entero = 0 | [1-9][0-9]

5

43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente

Figura 5 Reglas lexicas

YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial

ltYYINITIALgt

Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)

return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)

return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)

return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero

que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado

6

Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)

return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio

Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal

[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))

5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6

Figura 6 Paquetes e importaciones

package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-

ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7

Figura 7 Metodo report error

Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8

8

Figura 8 Metodo Main y division

Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main

parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto

public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol

if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador

Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol

if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))

Este if verifica el identificador es igual a 2 entonces

9

se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero

al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)

Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)

try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))

Object result = asinparse()value catch (Exception ex)

Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)

Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)

Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo

10

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

1 ProblemaUn compilador que permita dividir en partes iguales el total de una cantidad de dinero

para un numero determinado de personas las cuales tienen que ser diferentes de cero

11 EjemplosEl Ingreso de datos debe ser 357 y el resultado obtenido sera igual 2833333

2 AutomataA continuacion presentamos la representacion del automata que es la estructura del

compilador Figura 1

Figura 1 Automata del compilador

3 DesarrolloPara el desarrollo del compilador se esa utilizando la librerıa JFLEX y CUP que son

la parte lexica y sintactica del compilador

4 JFlexEs desarrollada en Java la cual genera un programa en Java a partir de una especifi-

cacion en el que se indican los tokens permitidos por nuestro lenguaje

Un archivo de especificacion para JFLex esta organizado en tres secciones separadaspor ldquo rdquo

3

41 Codigo de usuarioEn esta seccion se crean las clases necesarias para nuestro analizador lexico las cuales

seran copiadas directamente al inicio del archivo de salida y se importan los paquetesnecesarios Primero se declara el nombre del paquete en el cual esta contenido y la librerıasa utilizar Figura 2

Figura 2 Codigo de usuario

42 Directivas JFLexEn esta seccion se incluyen algunas reglas propias de JFLex Tambien se pueden definir

macros que resuman ciertas expresiones regulares que nos seran utiles al momento deidentificar tokens en la siguiente seccion y estados Figura 3

Figura 3 Directivas de Jflex

4

Cambiamos el nombre de la clase del analizador a Lexer class AnalizadorLexico

Realizamos la activacion del contador de lineas variable yyline y el contador de co-lumna variable yycolumnlinecolumn

Luego hay que activar la compatibilidad con Java CUP para analizadores sintacticos cup

Generamos un java cupSymbol para guardar el tipo de token encontrado

private Symbol symbol(int type) return new Symbol(type yyline yycolumn)

Tambien generamos un Symbol para el tipo de token encontrado junto con su valor

private Symbol symbol(int type Object value) return new Symbol(type yyline yycolumn value)

Las Macro declaraciones Figura 4

Figura 4 Las Macro declaraciones

Un salto de linea es un n r

Salto = r|n|rn

Espacio es un espacio en blanco tabulador t salto de linea o avance de pagina fnormalmente son ignoradosEspacio = Salto | [ tf]

para que reconozca numeros enteros

Entero = 0 | [1-9][0-9]

5

43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente

Figura 5 Reglas lexicas

YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial

ltYYINITIALgt

Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)

return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)

return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)

return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero

que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado

6

Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)

return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio

Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal

[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))

5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6

Figura 6 Paquetes e importaciones

package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-

ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7

Figura 7 Metodo report error

Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8

8

Figura 8 Metodo Main y division

Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main

parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto

public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol

if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador

Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol

if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))

Este if verifica el identificador es igual a 2 entonces

9

se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero

al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)

Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)

try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))

Object result = asinparse()value catch (Exception ex)

Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)

Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)

Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo

10

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

41 Codigo de usuarioEn esta seccion se crean las clases necesarias para nuestro analizador lexico las cuales

seran copiadas directamente al inicio del archivo de salida y se importan los paquetesnecesarios Primero se declara el nombre del paquete en el cual esta contenido y la librerıasa utilizar Figura 2

Figura 2 Codigo de usuario

42 Directivas JFLexEn esta seccion se incluyen algunas reglas propias de JFLex Tambien se pueden definir

macros que resuman ciertas expresiones regulares que nos seran utiles al momento deidentificar tokens en la siguiente seccion y estados Figura 3

Figura 3 Directivas de Jflex

4

Cambiamos el nombre de la clase del analizador a Lexer class AnalizadorLexico

Realizamos la activacion del contador de lineas variable yyline y el contador de co-lumna variable yycolumnlinecolumn

Luego hay que activar la compatibilidad con Java CUP para analizadores sintacticos cup

Generamos un java cupSymbol para guardar el tipo de token encontrado

private Symbol symbol(int type) return new Symbol(type yyline yycolumn)

Tambien generamos un Symbol para el tipo de token encontrado junto con su valor

private Symbol symbol(int type Object value) return new Symbol(type yyline yycolumn value)

Las Macro declaraciones Figura 4

Figura 4 Las Macro declaraciones

Un salto de linea es un n r

Salto = r|n|rn

Espacio es un espacio en blanco tabulador t salto de linea o avance de pagina fnormalmente son ignoradosEspacio = Salto | [ tf]

para que reconozca numeros enteros

Entero = 0 | [1-9][0-9]

5

43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente

Figura 5 Reglas lexicas

YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial

ltYYINITIALgt

Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)

return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)

return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)

return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero

que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado

6

Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)

return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio

Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal

[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))

5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6

Figura 6 Paquetes e importaciones

package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-

ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7

Figura 7 Metodo report error

Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8

8

Figura 8 Metodo Main y division

Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main

parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto

public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol

if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador

Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol

if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))

Este if verifica el identificador es igual a 2 entonces

9

se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero

al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)

Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)

try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))

Object result = asinparse()value catch (Exception ex)

Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)

Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)

Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo

10

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

Cambiamos el nombre de la clase del analizador a Lexer class AnalizadorLexico

Realizamos la activacion del contador de lineas variable yyline y el contador de co-lumna variable yycolumnlinecolumn

Luego hay que activar la compatibilidad con Java CUP para analizadores sintacticos cup

Generamos un java cupSymbol para guardar el tipo de token encontrado

private Symbol symbol(int type) return new Symbol(type yyline yycolumn)

Tambien generamos un Symbol para el tipo de token encontrado junto con su valor

private Symbol symbol(int type Object value) return new Symbol(type yyline yycolumn value)

Las Macro declaraciones Figura 4

Figura 4 Las Macro declaraciones

Un salto de linea es un n r

Salto = r|n|rn

Espacio es un espacio en blanco tabulador t salto de linea o avance de pagina fnormalmente son ignoradosEspacio = Salto | [ tf]

para que reconozca numeros enteros

Entero = 0 | [1-9][0-9]

5

43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente

Figura 5 Reglas lexicas

YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial

ltYYINITIALgt

Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)

return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)

return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)

return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero

que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado

6

Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)

return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio

Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal

[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))

5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6

Figura 6 Paquetes e importaciones

package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-

ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7

Figura 7 Metodo report error

Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8

8

Figura 8 Metodo Main y division

Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main

parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto

public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol

if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador

Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol

if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))

Este if verifica el identificador es igual a 2 entonces

9

se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero

al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)

Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)

try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))

Object result = asinparse()value catch (Exception ex)

Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)

Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)

Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo

10

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

43 Reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

Java Figura 5 que se ejecutara cuando se encuentre una entrada valida para la expresionregular correspondiente

Figura 5 Reglas lexicas

YYINITIAL es el estado inicial del analizador lexico al escanear Las expresionesregulares solo seran comparadas si se encuentra en ese estado inicial Es decir cada vezque se encuentra una coincidencia el scanner vuelve al estado inicial

ltYYINITIALgt

Regresa que el token FINLINEA declarado en la clase sym fue encontrado Systemoutprint(yytext()+ FinLinea + [+yyline++yycolumn+] n)

return symbol(symFINLINEA)Regresa que el token OP_DIVISION declarado en la clase sym fue encontrado Systemoutprint( yytext()+ dividido + [+yyline++yycolumn+] n)

return symbol(symOP_DIVISION) Regresa que el token OP_CERO declarado en la clase sym fue encontrado0 Systemoutprint( yytext()+ cero + [+yyline++yycolumn+] n)

return symbol(symOP_CERO) Si se encuentra un numero se imprime se regresa un token numero

que representa un entero y el valor que se obtuvo de la cadena yytextal convertirla a double yytext es el token encontrado

6

Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)

return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio

Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal

[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))

5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6

Figura 6 Paquetes e importaciones

package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-

ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7

Figura 7 Metodo report error

Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8

8

Figura 8 Metodo Main y division

Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main

parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto

public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol

if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador

Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol

if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))

Este if verifica el identificador es igual a 2 entonces

9

se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero

al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)

Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)

try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))

Object result = asinparse()value catch (Exception ex)

Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)

Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)

Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo

10

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

Entero Systemoutprint(yytext()+ numero + [+yyline++yycolumn+] n)

return symbol(symENTERO new Double(yytext())) Se ignora si se encuentra el espacio en blanco Espacio Ignora el espacio

Si el caracter ingresado no coincide con ninguna reglaEntonces se marca un token ilegal

[ˆ] Systemerrprintln(El caracter ingresado esinvaido lt+yytext()+gt+posicion+(+yyline+ +yycolumn+))

5 CUPPara construir un compilador el segundo paso que debemos dar es el de desarrollar el

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apare-cidos en cada regla gramatical La clase sym esta constituida por los sımbolos terminalesdeclarados en la gramaticala cual es utilizada para hacer referencia a los mismos

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java generadasa partir de este archivo pertenecen a un determinado paquete yo tambien importar lasclases Java necesarias Figura 6

Figura 6 Paquetes e importaciones

package ejemplocupimport java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-

ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7

Figura 7 Metodo report error

Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8

8

Figura 8 Metodo Main y division

Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main

parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto

public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol

if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador

Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol

if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))

Este if verifica el identificador es igual a 2 entonces

9

se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero

al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)

Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)

try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))

Object result = asinparse()value catch (Exception ex)

Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)

Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)

Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo

10

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

52 Codigo de usuarioEn esta seccion se puede incluir codigo Java del analizador sintactico que se va a obte-

ner con CUP En la primera parte tenemos el codigo para reportar los errores generadosal realizar un dato erroneo figura 7

Figura 7 Metodo report error

Luego tenemos el metodo Main donde se llama al analizador lexico y presenta lagramatica ingresada tambien esta el metodo Divisor que es que realiza la operacion querecibe como entrada dos cantidades y devuelve una cantidad tipo double figura 8

8

Figura 8 Metodo Main y division

Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main

parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto

public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol

if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador

Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol

if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))

Este if verifica el identificador es igual a 2 entonces

9

se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero

al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)

Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)

try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))

Object result = asinparse()value catch (Exception ex)

Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)

Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)

Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo

10

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

Figura 8 Metodo Main y division

Codigo del parser se copia ıntegramente a la clase finalAgregamos el manejo de errores el metodo de divisor y el main

parser code Reporte de error encontrado Creamos el meto report_error el cual recibe un mensaje y un objeto

public void report_error(String message Object info) Declaramos un StringBufer el cual contendra el mensajeStringBuilder m = new StringBuilder(Error)Agregamos un if el cual se analiza el objeto recibido instanceofSirve para conocer si un objeto de un tipo java_cupruntimeSymbol

if (info instanceof java_cupruntimeSymbol) imprimimos objeto info para conocer su identificador

Systemoutprintln(INFO =+info) Declaramos la variable s de tipo java_cupruntimeSymbolDonde se almacena el castin del infojava_cupruntimeSymbol s = ((java_cupruntimeSymbol) info)if nos va a obtener la lınea y columna donde se encuentra el symbol

if (sleft gt= 0) agregamos al mensaje la lıneamappend( linea +(sleft+1))if (sright gt= 0)agregamos al mensaje la columnamappend( columna +((sright+1)-1))

Este if verifica el identificador es igual a 2 entonces

9

se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero

al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)

Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)

try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))

Object result = asinparse()value catch (Exception ex)

Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)

Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)

Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo

10

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

se trata del fin de lıneaif(ssym==2) message=esta mal o no existe el fin de lınea Este if verifica el identificador es igual a 3entonces se trata del OP_DIVISIONif(ssym==3)message=tiene q existir numeradorEste if verifica el identificador es igual a 5entonces se trata del ENTEROif(ssym==5)message=no puede existir dos numeroscontinuos sin el operadorEste if verifica el identificador es igual a 4entonces se trata del OP_CEROif(ssym==4)message=El numero para el cual sedivide debe ser mayor a cero

al mensaje le agregamos () para una comprension mejormappend( +message)imprimimos el errorSystemerrprintln(m)

Metodo main para garantizar la ejecucion del analizador lexico ysintactico Ademas que se pase como parametro la tabla de sımboloscorrespondiente public static void main(String[] args)

try AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])))

Object result = asinparse()value catch (Exception ex)

Imprimimos que existe un error al realizar la ejecucionSystemerrprintln(ERROR EN EL INGRESO DE DATOS)

Realizamos el metodo divisor que nos devuelve un double alrealizar la Operacion y recibe como para metro dos numeros public Double division(Double num1 Double mun2)

Variable para almacenar el resultadoDouble todoejecucion de la operaciontodo= num1mun2 Retornamos el valor de la operacionreturn todo

10

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

53 Declaracion de sımbolos terminales y no terminalesEn esta seccion se declaran los sımbolos terminales y no terminales figura 9 de la

gramatica que define el analizador sintactico que deseamos producir Tanto los sımbolosno terminales como los sımbolos terminales pueden tener asociado un objeto Java de unacierta clase

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales---

Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

No terminales usados en la seccion gramaticale lista los no terminales que tienenun valor Object queNo tienen tipo pudiendo ser entero o String

non terminal Object expr1 expr2non terminal Object sentencia

54 Definicion del sımbolo inicial de la gramatica y las reglasde produccion

Las reglas de produccion tienen esta sintaxis

expresion = expresion ltsımbolo terminalgt expresion codigo java

Se pueden definir todas las reglas de produccion que tengan un mismo sımbolo noterminal figure 10 como antecedente separado por el sımbolo |

11

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

Figura 10 Seccion Gramatical

------------------- Seccion de la gramatica ------------------------

La | sirve para indicar que es una produccion u otra Debemos pasarde sımbolos no terminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales se dice que no reduce y por lo tantonunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimir el Resultado de en codigo javaexpr2 = sentenciae

Systemoutprintln( igual +e)

Puede ser una expresion que inicia por numero op_divido de esa formase realiza Una division En RESULT se almacena el valor de las acciones yse pasa al siguiente nivel de la gramaticasentencia =

12

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

sentencia incorrecta de la operacionENTEROn OP_DIVISION ENTEROm Codigo para obtener el objeto info del fin de lıneaCUP$AnalizadorSintactico$result = parsergetSymbolFactory()newSymbol(sentencia2((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackelementAt(CUP$AnalizadorSintactico$top-2))((java_cupruntimeSymbol)CUP$AnalizadorSintactico$stackpeek()) RESULT) Llamamos al metodo report_error y enviamos elmensaje y el objeto tipo infoparserreport_error(Falta fin CUP$AnalizadorSintactico$result) o podemos tener la sentencia correcta|ENTEROn OP_DIVISION ENTEROm FINLINEA

El RESULT almacena el resultado de haber llamado el metodo divisionRESULT=parserdivision(ndoubleValue() mdoubleValue())

6 SymEn esta clase java se generan los Tokens declarados y utilizados en la seccion sintactica

figura 11

Figura 11 Codigo java de la clase sym

package ejemplocup CUP generated class containing symbol constants public class sym terminals

public static final int OP_CERO = 4public static final int FINLINEA = 2

13

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

7 Control de erroresEn la seccion de errores podemos observar que el control se realiza en la parte de el

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

Y la parte de control de caracteres se realiza en la seccion lexica Figura 13

Figura 13 Errores lexicos

14

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

8 Funcionamiento del compiladorLo que primero hacemos es escoger la opcion 1 Figura 14 Generar del menu en la cual

se generan la clase sym AnalizadorLexico y AnalizadorSintactico en codigo java

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos y escogemos la opcion 2 del menu parala ejecucion de los datos ingresados Ingresamos 439 Figura 15

Figura 15 Ejecucion correcta

15

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

9 Ejecucion de ErroresAhora vamos a presentar el control de algunos errores al ingresar datos errores como

entrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

2 Cuando se ingresa dos cantidades seguidas y sin operador rdquo4 3 9rdquo Figura 17

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linea al sımbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

18

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

10 ConclusionesCon la construccion del compilador se pudo ampliar el conocimiento y elaboracionde copiladores dejando atras los tıpicos ejemplos y centrandonos en colaborar paraampliar el estudio de esta materia

El codigo Jflex es la parte lexica de un compilador donde se realizan las macrodeclaraciones y los metodos que guardan los Tokens tambien esta la parte de reglaslexicas que es donde se buscan las coincidencias de los datos ingresado

La realizacion del automata sera la guıa para realizar la parte gramatical del codigoCup

11 RecomendacionesAl momento de Realizar la parte lexica declara de line column para poderactivar el contador de lineas y columnas para facilitar el reporte de errores

Las expresiones regulares y acciones de codigo Jflex deben ser realizadas con pre-caucion pues es la parte en que el scanner encontrara las coincidencias

En el codigo Cup realizar el control de errores para el correcto funcionamiento delcompilador

19

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

12 Referencia del codigo fuenteLa codigo de este compilador se lo puede encontrar en httpscodegooglecom

pcompiladoresdivisorsourcebrowsetrunkEjemploCUPzip

20

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica

13 Bibliografica

Referencias[1] Antonio De Miguel Vicenti2007 Compilador de Pascalrdquo Disponible en

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

[2] Carlos III de Madrid Departamento de ingenierıa telematoca rdquo Fundamentos deOrdenadores I Breve Introduccion a CUPrdquo Disponible en httpwwwituc3mesluisfo1pCUPhtml

[3] Compiladores principios tecnicas y herramientas AV Aho R Sethi JD Ull-man Addison-Wesley Iberoamerica 1990 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[4] Enrique Arangurenn Analizador Sintacticordquo 2011 Disponible en httploscompiladoreswordpresscomcategoryanalizador-sintactico

[5] Open(fecks()) Estructura Archivo JFLexrdquo Disponible en httpopenfeckswordpresscomjFlex-y-cupplantilla-archivo-jFlex

[6] Salvador Sanchez Daniel Rodrıguez Departamento de Ciencias de Universidadde Alcala rdquoProcesadores de Lenguajerdquo Disponible enhttpwwwccuahesiedocenciaProcesadoresDeLenguajeCUPpdf

21

  • Problema
    • Ejemplos
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Reglas leacutexicas
          • CUP
            • Definicioacuten de paquete e importacioacuten de paquetes necesarios
            • Coacutedigo de usuario
            • Declaracioacuten de siacutembolos terminales y no terminales
            • Definicioacuten del siacutembolo inicial de la gramaacutetica y las reglas de produccioacuten
              • Sym
              • Control de errores
              • Funcionamiento del compilador
              • Ejecucioacuten de Errores
              • Conclusiones
              • Recomendaciones
              • Referencia del coacutedigo fuente
              • Bibliograacutefica