Download Compiladores / Guía VII / Ciclo 02

Document related concepts
no text concepts found
Transcript
1
Compiladores / Guía VII / Ciclo 02 - 2016
Centro de Investigación y
Transferencia de Tecnología
JavaCC – Parte I
Facultad: Ingeniería
Escuela: Computación
Asignatura: Compiladores
Contenido
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.
Objetivos Específicos


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.
Material y Equipo



Guía de laboratorio N° 7.
Computadora con javac y javacc.
Dispositivo de almacenamiento USB.
Introducción Teórica
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-.
2
Compiladores / Guía VII / Ciclo 02 - 2016
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 - 2016
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.
Procedimiento
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).
4
Compiladores / Guía VII / Ciclo 02 - 2016

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\javacc6.0\bin.
Para verificar que ya contamos con las dos variables de entorno a utilizar:
5
Compiladores / Guía VII / Ciclo 02 - 2016
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 - 2016
7
Compiladores / Guía VII / Ciclo 02 - 2016
8
Compiladores / Guía VII / Ciclo 02 - 2016
9
Compiladores / Guía VII / Ciclo 02 - 2016
10
Compiladores / Guía VII / Ciclo 02 - 2016
11
Compiladores / Guía VII / Ciclo 02 - 2016
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 - 2016
n1++;
iescribir(n1);
}
ialternativa(n3)
{
iopcion 3:
n1 = 2 + 2;
itermina;
ipredef:
n1 = 10;
itermina;
}
}
}
TokenAsignaciones.java
13
Compiladores / Guía VII / Ciclo 02 - 2016
14
Compiladores / Guía VII / Ciclo 02 - 2016
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.
Investigación Complementaria
Realizar una investigación sobre las características principales de javacc.
15
Compiladores / Guía VII / Ciclo 02 - 2016
Bibliografía

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