Facultad: Ingeniería JavaCC Parte I Escuela: …...En definitiva, diremos que Java Compiler...

15
1 Compiladores / Guía VII / Ciclo 02 - 2018 JavaCC Parte I En la presente guía se presenta el análisis semántico, el cual es sumamente importante e indispensable para el proceso de compilación, siendo el encargado de verificar la consistencia del código y de las expresiones que generan éste. Implementar un analizador semántico en el proceso de compilación. Utilizar la herramienta javacc para el análisis léxico, sintáctico y semántico. Guía de laboratorio N° 7. Computadora con javac y javacc. Dispositivo de almacenamiento USB. Introducción Análisis Semántico Esta fase revisa el árbol sintáctico junto con los atributos y la tabla de símbolos para tratar de encontrar errores semánticos. Para todo esto se analizan los operadores y operandos de expresiones y proposiciones. Finalmente reúne la información necesaria sobre los tipos de datos para la fase posterior de generación de código. El componente más importante del análisis semántico es la verificación de tipos. Aquí, el compilador verifica si los operandos de cada operador son compatibles según la especificación del lenguaje fuente. Si suponemos que nuestro lenguaje solo trabaja con números reales, la salida de esta fase sería su mismo árbol, excepto porque el atributo de <NUM>, que era el entero 8 a la entrada, ahora pasaría a ser el real 8,0. Además, se ha debido controlar que las variables implicadas en la sentencia, a saber, comisión, fijo y valor son compatibles con el tipo numérico de la constante 8,0. JavaCC (Java Compiler Compiler Metacompilador en Java) El generador JavaCC (Java Compiler Compiler) es una herramienta para generar programas escritos en lenguaje Java; acepta como entrada una especificación de un determinado lenguaje y produce como salida un analizador para ese lenguaje. En la manera más simple de funcionamiento, la especificación proporcionada define las características sintácticas y lexicográficas de un lenguaje y se genera un analizador léxicosintáctico del lenguaje especificado; pero también es posible completar una especificación léxico-sintáctica con la inclusión adecuada de código para que el programa generado llegue a ser un analizador completo del lenguaje. JavaCC integra las funciones de análisis léxico y análisis sintáctico en una sola herramienta, obteniendo a la salida código java a diferencia de lex/yacc cuya salida es código C-. Facultad: Ingeniería Escuela: Ingeniería en Computación Asignatura: Compiladores Contenido Objetivos Específicos Material y Equipo Introducción Teórica

Transcript of Facultad: Ingeniería JavaCC Parte I Escuela: …...En definitiva, diremos que Java Compiler...

1 Compiladores / Guía VII / Ciclo 02 - 2018

JavaCC – Parte I

En la presente guía se presenta el análisis semántico, el cual es sumamente importante e indispensable para el proceso

de compilación, siendo el encargado de verificar la consistencia del código y de las expresiones que generan éste.

Implementar un analizador semántico en el proceso de compilación.

Utilizar la herramienta javacc para el análisis léxico, sintáctico y semántico.

Guía de laboratorio N° 7.

Computadora con javac y javacc.

Dispositivo de almacenamiento USB.

Introducción

Análisis Semántico

Esta fase revisa el árbol sintáctico junto con los atributos y la tabla de símbolos para tratar de encontrar errores semánticos.

Para todo esto se analizan los operadores y operandos de expresiones y proposiciones. Finalmente reúne la información

necesaria sobre los tipos de datos para la fase posterior de generación de código.

El componente más importante del análisis semántico es la verificación de tipos. Aquí, el compilador verifica si los

operandos de cada operador son compatibles según la especificación del lenguaje fuente. Si suponemos que nuestro

lenguaje solo trabaja con números reales, la salida de esta fase sería su mismo árbol, excepto porque el atributo de <NUM>,

que era el entero 8 a la entrada, ahora pasaría a ser el real 8,0.

Además, se ha debido controlar que las variables implicadas en la sentencia, a saber, comisión, fijo y valor son compatibles

con el tipo numérico de la constante 8,0.

JavaCC (Java Compiler Compiler – Metacompilador en Java)

El generador JavaCC (Java Compiler Compiler) es una herramienta para generar programas escritos en lenguaje Java;

acepta como entrada una especificación de un determinado lenguaje y produce como salida un analizador para ese

lenguaje. En la manera más simple de funcionamiento, la especificación proporcionada define las características sintácticas

y lexicográficas de un lenguaje y se genera un analizador léxicosintáctico del lenguaje especificado; pero también es posible

completar una especificación léxico-sintáctica con la inclusión adecuada de código para que el programa generado llegue

a ser un analizador completo del lenguaje.

JavaCC integra las funciones de análisis léxico y análisis sintáctico en una sola herramienta, obteniendo a la salida código

java –a diferencia de lex/yacc cuya salida es código C-.

Facultad: Ingeniería

Escuela: Ingeniería en Computación

Asignatura: Compiladores

Contenido

Objetivos Específicos

Material y Equipo

Introducción Teórica

2 Compiladores / Guía VII / Ciclo 02 - 2018

Antes que nada, veamos un ejemplo sobre el cual se va a ir haciendo un seguimiento de cada uno de los distintos puntos

que vayamos comentando. En él se muestra una gramática reconocedora de una calculadora.

3 Compiladores / Guía VII / Ciclo 02 - 2018

La principal diferencia con lex/yacc es que los analizadores sintácticos generados por JavaCC son analizadores sintácticos

descendentes de tipo LL(k), mientras que los analizadores sintácticos generados por yacc son de tipo ascendente LALR.

Otra diferencia bastante importante es que las especificaciones léxicas pueden estar incluidas dentro de la especificación

de la gramática. Por ejemplo, podemos escribir algo como esto:

sentenciaIf: { } {“if” “(“expresión()”)” sentencia()}

Y automáticamente se ocupa de generar tokens para “if” y para “(”.

También es necesario reseñar que el análisis léxico en JavaCC genera combinaciones de autómatas finitos deterministas

(AFD) y autómatas finitos no deterministas(AFND); por contra, lex siempre genera autómatas finitos deterministas.

En definitiva, diremos que Java Compiler Compiler (JavaCC) es un potente generador de parsers descendentes escritos

en lenguaje Java puro. Es, quizá, uno de los generadores de parsers más populares dada su multiplataformidad. Es por

esto que se recomienda su uso para usuarios más afines a los lenguajes de programación orientados a objetos.

El siguiente ejemplo es una muestra de la implementación de analizadores (en este caso nos centramos en el semántico)

haciendo uso de la herramienta JavaCC.

Tener instaladas las variables de entorno.

Es necesario tener previamente activas las siguientes variables de entorno:

Javac. Esta variable se crea cuando se instala el jdk de java. Para comprobar que existe en el entorno de nuestro

sistema, se abre la ventana de comandos (tecla Windows + R cmd Enter).

Procedimiento

4 Compiladores / Guía VII / Ciclo 02 - 2018

Javacc. Para utilizar esta herramienta, se debe crear una variable de entorno. Pueden descargar JavaCC del del

enlace [https://java.net/projects/javacc/downloads].

¿Cómo crear una nueva variable de entorno?

1. Clic derecho en This PC y se abre la ventana que muestra las características del sistema. En la parte izquierda de

dicha ventana debemos seleccionar:

2. Ahora se muestra la siguiente venta y debemos seleccionar “Variables de Entorno”:

3. Al seleccionar “Nueva”, tendremos que copiar la dirección donde se encuentra la carpeta “bin”, la cual está dentro

de la carpeta del JavaCC. Para el caso del equipo en el que se realizó esta guía, la ruta es: C:\javacc\javacc-

6.0\bin.

Para verificar que ya contamos con las dos variables de entorno a utilizar:

5 Compiladores / Guía VII / Ciclo 02 - 2018

Y desde la línea de comandos de Windows, también se puede verificar la correcta instalación de JavaCC, así:

Ahora, procedamos a trabajar en el ejemplo:

Utilizando el editor de texto de su preferencia (es recomendable utilizar el notepad++) digitemos los siguientes archivos,

crear una carpeta para guardar los tres archivos que crearemos.

comp.jj

6 Compiladores / Guía VII / Ciclo 02 - 2018

7 Compiladores / Guía VII / Ciclo 02 - 2018

8 Compiladores / Guía VII / Ciclo 02 - 2018

9 Compiladores / Guía VII / Ciclo 02 - 2018

10 Compiladores / Guía VII / Ciclo 02 - 2018

11 Compiladores / Guía VII / Ciclo 02 - 2018

NOTA: Si hay problema de compilación, deben digitar en una misma línea lo que se encuentra en la línea 388 y 389.

code.txt

Programa test

{

public static void Main()

{

istr s1 = "hola";

ichr c1 = '3', c2;

inum n1 = 0, n2 = 2, n3 = 2, x;

idec d1;

s1 = n1 + 6;

irepetir(n2 = 0; n2 < 10; n2++ )

{

iescribir(n2);

}

ien( n1 >= 0 )

{

n1 = n3 / n2;

}

ien otro(n1 < 10)

{

n1 = n2 - n3;

}

iotro

{

iescribir("Ninguna opcion");

}

ia

{

x = x + 1;

iescribir(x);

}

iespera(x < 5)

iespera(n1 <= 20)

{

Aquí puede realizar cambios para

comprobar el análisis semántico.

12 Compiladores / Guía VII / Ciclo 02 - 2018

n1++;

iescribir(n1);

}

ialternativa(n3)

{

iopcion 3:

n1 = 2 + 2;

itermina;

ipredef:

n1 = 10;

itermina;

}

}

}

TokenAsignaciones.java

13 Compiladores / Guía VII / Ciclo 02 - 2018

14 Compiladores / Guía VII / Ciclo 02 - 2018

Ahora vamos a ejecutar y veamos el porqué de algunas salidas:

Modificar el ejemplo de tal forma que acepte todas las expresiones e indicar a qué se debe el error encontrado.

Realizar una investigación sobre las características principales de javacc.

Investigación Complementaria

15 Compiladores / Guía VII / Ciclo 02 - 2018

Manuel Alfonseca Moreno, Marina de la Cruz Echeandía, Alfonso Ortega de la Puente, Estrella Pulido Cañabate,

Compiladores: Teoría y Práctica, Pearson Educación, S.A., Madrid, 2006

Bibliografía