compilador (divisor de cantidades )

19
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 C ¸ OMPILADOR 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 10-Aug-2015

153 views

Category:

Education


6 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

COMPILADOR DIVISOR DECANTIDADESrdquo

MODULO IX B

Autores

SORAYA ISAMAR LARA TAPIA

DocenteING HENRY PAZ

Fecha13 FEBRERO 2014

Loja-EcuadorSeptiembre 2014 - Julio 2015

1

Indice1 Problema 4

11 Ejemplo 4

2 Automata 4

3 Desarrollo 4

4 JFlex 541 Codigo de usuario 542 Directivas JFLex 543 Seccion de reglas lexicas 6

5 CUP 951 Definicion de paquete e importacion de paquetes necesarios 1052 Codigo de usuario 1053 Declaracion de sımbolos terminales y no terminales 1454 Definicion del sımbolo inicial de la gramatica y las reglas de produccion 14

6 Sym 17

7 Control de errores 17

8 Funcionamiento del compilador 18

9 BIBLIOGRAFIA 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 Ejemplo35 5 igual 7

2 Automataa continuacion presentamos la representacion del automata el cual representa la es-

tructura del compilador Figura 1

Figura 1 Automata del compilador

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

4 JFlexEs una herramienta desarrollada en Java la cual genera un programa en Java a partir

de una especificacion en el que se indican los tokens permitidos por nuestro lenguaje

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

3

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

seran copiadas directamente al inicio del archivo de salida Se importan los paquetesnecesariosPrimero se declara el nombre del paquete en el cual esta contenido Figura 2

Figura 2 Codigo de usuario

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

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

Figura 3 Directivas de Jflex

4

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

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

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

Generamos un java cupSymbol para guardar el tipo de token encontradoprivate Symbol symbol(int type)

return new Symbol(type yyline yycolumn)

Tambien generamos un Symbol para el tipo de token encontrado junto con su valorprivate Symbol symbol(int type Object value)

return new Symbol(type yyline yycolumn value)

Las Macro declaraciones Figura 4

Figura 4 Las Macro declaraciones

Un salto de linea es un n r

Salto = r|n|rn

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

para que reconozca numeros enterosEntero = 0 | [1-9][0-9]

5

43 Seccion de reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

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

Figura 5 Reglas lexicas

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

ltYYINITIALgt

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

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

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

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

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

6

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

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

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

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

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

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex

La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos

Un archivo de entrada para CUP consta de las siguientes secciones

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6

package ejemplocup

import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

Figura 6 Paquetes e importaciones

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

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

Figura 7 Metodo report error

Luego tenemos el metodo Main y Divisor que es que realiza la operacion de dividir

8

cantidades figura 8

Figura 8 Metodo Main y division

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

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

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

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

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

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

9

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

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

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

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

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

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

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

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

10

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

Indice1 Problema 4

11 Ejemplo 4

2 Automata 4

3 Desarrollo 4

4 JFlex 541 Codigo de usuario 542 Directivas JFLex 543 Seccion de reglas lexicas 6

5 CUP 951 Definicion de paquete e importacion de paquetes necesarios 1052 Codigo de usuario 1053 Declaracion de sımbolos terminales y no terminales 1454 Definicion del sımbolo inicial de la gramatica y las reglas de produccion 14

6 Sym 17

7 Control de errores 17

8 Funcionamiento del compilador 18

9 BIBLIOGRAFIA 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 Ejemplo35 5 igual 7

2 Automataa continuacion presentamos la representacion del automata el cual representa la es-

tructura del compilador Figura 1

Figura 1 Automata del compilador

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

4 JFlexEs una herramienta desarrollada en Java la cual genera un programa en Java a partir

de una especificacion en el que se indican los tokens permitidos por nuestro lenguaje

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

3

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

seran copiadas directamente al inicio del archivo de salida Se importan los paquetesnecesariosPrimero se declara el nombre del paquete en el cual esta contenido Figura 2

Figura 2 Codigo de usuario

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

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

Figura 3 Directivas de Jflex

4

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

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

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

Generamos un java cupSymbol para guardar el tipo de token encontradoprivate Symbol symbol(int type)

return new Symbol(type yyline yycolumn)

Tambien generamos un Symbol para el tipo de token encontrado junto con su valorprivate Symbol symbol(int type Object value)

return new Symbol(type yyline yycolumn value)

Las Macro declaraciones Figura 4

Figura 4 Las Macro declaraciones

Un salto de linea es un n r

Salto = r|n|rn

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

para que reconozca numeros enterosEntero = 0 | [1-9][0-9]

5

43 Seccion de reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

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

Figura 5 Reglas lexicas

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

ltYYINITIALgt

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

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

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

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

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

6

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

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

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

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

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

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex

La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos

Un archivo de entrada para CUP consta de las siguientes secciones

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6

package ejemplocup

import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

Figura 6 Paquetes e importaciones

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

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

Figura 7 Metodo report error

Luego tenemos el metodo Main y Divisor que es que realiza la operacion de dividir

8

cantidades figura 8

Figura 8 Metodo Main y division

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

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

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

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

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

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

9

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

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

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

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

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

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

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

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

10

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

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

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

11 Ejemplo35 5 igual 7

2 Automataa continuacion presentamos la representacion del automata el cual representa la es-

tructura del compilador Figura 1

Figura 1 Automata del compilador

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

4 JFlexEs una herramienta desarrollada en Java la cual genera un programa en Java a partir

de una especificacion en el que se indican los tokens permitidos por nuestro lenguaje

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

3

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

seran copiadas directamente al inicio del archivo de salida Se importan los paquetesnecesariosPrimero se declara el nombre del paquete en el cual esta contenido Figura 2

Figura 2 Codigo de usuario

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

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

Figura 3 Directivas de Jflex

4

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

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

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

Generamos un java cupSymbol para guardar el tipo de token encontradoprivate Symbol symbol(int type)

return new Symbol(type yyline yycolumn)

Tambien generamos un Symbol para el tipo de token encontrado junto con su valorprivate Symbol symbol(int type Object value)

return new Symbol(type yyline yycolumn value)

Las Macro declaraciones Figura 4

Figura 4 Las Macro declaraciones

Un salto de linea es un n r

Salto = r|n|rn

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

para que reconozca numeros enterosEntero = 0 | [1-9][0-9]

5

43 Seccion de reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

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

Figura 5 Reglas lexicas

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

ltYYINITIALgt

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

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

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

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

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

6

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

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

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

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

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

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex

La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos

Un archivo de entrada para CUP consta de las siguientes secciones

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6

package ejemplocup

import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

Figura 6 Paquetes e importaciones

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

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

Figura 7 Metodo report error

Luego tenemos el metodo Main y Divisor que es que realiza la operacion de dividir

8

cantidades figura 8

Figura 8 Metodo Main y division

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

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

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

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

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

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

9

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

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

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

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

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

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

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

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

10

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

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

seran copiadas directamente al inicio del archivo de salida Se importan los paquetesnecesariosPrimero se declara el nombre del paquete en el cual esta contenido Figura 2

Figura 2 Codigo de usuario

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

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

Figura 3 Directivas de Jflex

4

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

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

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

Generamos un java cupSymbol para guardar el tipo de token encontradoprivate Symbol symbol(int type)

return new Symbol(type yyline yycolumn)

Tambien generamos un Symbol para el tipo de token encontrado junto con su valorprivate Symbol symbol(int type Object value)

return new Symbol(type yyline yycolumn value)

Las Macro declaraciones Figura 4

Figura 4 Las Macro declaraciones

Un salto de linea es un n r

Salto = r|n|rn

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

para que reconozca numeros enterosEntero = 0 | [1-9][0-9]

5

43 Seccion de reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

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

Figura 5 Reglas lexicas

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

ltYYINITIALgt

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

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

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

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

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

6

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

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

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

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

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

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex

La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos

Un archivo de entrada para CUP consta de las siguientes secciones

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6

package ejemplocup

import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

Figura 6 Paquetes e importaciones

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

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

Figura 7 Metodo report error

Luego tenemos el metodo Main y Divisor que es que realiza la operacion de dividir

8

cantidades figura 8

Figura 8 Metodo Main y division

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

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

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

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

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

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

9

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

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

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

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

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

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

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

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

10

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

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

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

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

Generamos un java cupSymbol para guardar el tipo de token encontradoprivate Symbol symbol(int type)

return new Symbol(type yyline yycolumn)

Tambien generamos un Symbol para el tipo de token encontrado junto con su valorprivate Symbol symbol(int type Object value)

return new Symbol(type yyline yycolumn value)

Las Macro declaraciones Figura 4

Figura 4 Las Macro declaraciones

Un salto de linea es un n r

Salto = r|n|rn

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

para que reconozca numeros enterosEntero = 0 | [1-9][0-9]

5

43 Seccion de reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

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

Figura 5 Reglas lexicas

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

ltYYINITIALgt

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

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

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

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

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

6

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

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

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

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

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

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex

La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos

Un archivo de entrada para CUP consta de las siguientes secciones

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6

package ejemplocup

import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

Figura 6 Paquetes e importaciones

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

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

Figura 7 Metodo report error

Luego tenemos el metodo Main y Divisor que es que realiza la operacion de dividir

8

cantidades figura 8

Figura 8 Metodo Main y division

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

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

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

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

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

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

9

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

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

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

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

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

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

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

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

10

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

43 Seccion de reglas lexicasEsta seccion contiene expresiones regulares y acciones Las acciones son codigo en

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

Figura 5 Reglas lexicas

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

ltYYINITIALgt

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

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

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

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

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

6

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

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

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

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

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

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex

La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos

Un archivo de entrada para CUP consta de las siguientes secciones

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6

package ejemplocup

import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

Figura 6 Paquetes e importaciones

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

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

Figura 7 Metodo report error

Luego tenemos el metodo Main y Divisor que es que realiza la operacion de dividir

8

cantidades figura 8

Figura 8 Metodo Main y division

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

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

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

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

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

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

9

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

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

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

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

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

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

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

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

10

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

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

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

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

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

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

analizador sintactico de nuestro lenguaje

CUP desarrollada en Java para crear analizadores sintacticos Genera dos clases enJava por default sym y parser a partir de una especificacion en la que se indica unagramatica formal ası como tambien se asocian una serie de acciones a los sımbolos apareci-dos en cada regla gramatical Tambien define un interfaz para acoplarse a los analizadoreslexicos construidos con JFLex

La clase sym esta constituida por los sımbolos terminales declarados en la gramaticalacual es utilizada para hacer referencia a los mismos

Un archivo de entrada para CUP consta de las siguientes secciones

51 Definicion de paquete e importacion de paquetes necesa-rios

En este seccion se incluyen las construcciones para indicar que las clases Java genera-das a partir de este archivo pertenecen a un determinado paquete yo tambien importarlas clases Java necesarias figura 6

package ejemplocup

import java_cupruntimeimport javaioFileReaderimport javautilArrayListimport javautilList

7

Figura 6 Paquetes e importaciones

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

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

Figura 7 Metodo report error

Luego tenemos el metodo Main y Divisor que es que realiza la operacion de dividir

8

cantidades figura 8

Figura 8 Metodo Main y division

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

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

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

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

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

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

9

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

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

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

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

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

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

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

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

10

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

Figura 6 Paquetes e importaciones

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

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

Figura 7 Metodo report error

Luego tenemos el metodo Main y Divisor que es que realiza la operacion de dividir

8

cantidades figura 8

Figura 8 Metodo Main y division

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

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

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

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

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

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

9

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

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

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

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

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

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

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

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

10

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

cantidades figura 8

Figura 8 Metodo Main y division

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

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

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

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

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

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

9

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

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

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

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

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

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

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

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

10

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

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

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

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

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

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

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

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

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

10

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

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

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

Figura 9 Declaracion de terminales y no terminales

---Declaracion de sımbolos terminales y no terminales--- Terminales (tokens obtenidos por el analizador lexico)terminal FINLINEA OP_DIVISION OP_CEROterminal Double ENTERO

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

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

Las reglas de produccion tienen esta sintaxisexpresion = expresion lt sımboloterminal gt expresion codigo

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

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

La | sirve para indicar que es una produccion u otra Debemos pasar de sımbolos noterminales a sımbolos terminales Una gramatica que no Termina en sımbolos terminales

11

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

Figura 10 Seccion Gramatical

se dice que no reduce y por lo tanto nunca se finaliza Su procesado

expr1 = expr1 expr2|expr2

En esta expresion se llama a la expresion sentencia para poder imprimirel Resultado de en codigo java

expr2 = sentenciae

Systemoutprintln( igual +e)

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

12

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

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

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

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

sintactica figura 11

Figura 11 Codigo java de la clase sym

13

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

package ejemplocup CUP generated class containing symbol constants public class sym

terminals public static final int OP_CERO = 4public static final int FINLINEA = 2public static final int error = 1public static final int OP_DIVISION = 3public static final int EOF = 0public static final int ENTERO = 5

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

analizador sintactico en el metodo de report error figura 12

Figura 12 Errores sintacticos

14

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

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

Figura 13 Errores lexicos

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

se generan la clase sym AnalizadorLexico y AnalizadorSintactico

Figura 14 Genracion de clase sym AnalizadorLexico y AnalizadorSintactico

Luego realizamos el ingreso de caracteres validos Ingresamos 439 Figura 15

15

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

Figura 15 Ejecucion correcta

Ahora vamos a presentar el control de algunos errores al ingresar mal los datos deentrada

1 Cuando falta fin de linea rdquo439rdquo Figura 16

Figura 16 Falta Fin de linea

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

Figura 17 Sin operador

16

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

3 Cuando dividimos para cero rdquo43 0rdquoFigura 18

Figura 18 Denominador cero

4 Cuando no existe denominar el error interpreta como fin de linia al simbolo deldivisor rdquo43 rdquoFigura 19

Figura 19 Sin denominador

17

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

5 Cuando no existe numerador 9rdquoFigura 20

Figura 20 Sin numerador

6 Cuando se ingresa mal un caracter rdquo43holardquoFigura 21

Figura 21 Caracteres invalidos

La codigo de este compilador se lo puede encontrar en

httpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

18

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA

9 BIBLIOGRAFIA

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

http3A2F2Fplg07082googlecodecom2Fsvn2Ftrunk2FDocumentaci25C325B3n2FDOCUMENTACION2520ENTREGA2520FINAL2FDOCUMENTACION2FANALISIS2520LEXICO2FDocumentacion2520Analizador2520Lexicopdfampei=0gOOVNemE43asASVqYL4Bwampusg=AFQjCNEAOrPRo7wH_L7KLJ4bvbjCwvKzlQ

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

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

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

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

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

[7] Soraya Lara Universidad Nacional de Loja rdquo Divisor de cantidades Codigo fuen-te rdquoDisponible enhttpscodegooglecompcompiladoresdivisorsourcebrowsesvn2Ftrunk

19

  • Problema
    • Ejemplo
      • Autoacutemata
      • Desarrollo
      • JFlex
        • Coacutedigo de usuario
        • Directivas JFLex
        • Seccioacuten de 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
              • BIBLIOGRAFIA