Departamento de Ingeniera de Sistemas e Industrial Lenguajes de Programacin Grupo 04 Felipe Restrepo Calle ferestrepoca@unal.edu.co
PRCTICA Introduccin a ANTLR
Contenido
1. Antecedentes 2. Qu es ANTLR? 3. Instalacin 4. Reglas (analizadores lxicos y sintcticos) 5. Ejemplo 6. ANTLRWorks
1. Antecedentes
Ya sea para ensamblador o para un lenguaje intermedio, el problema de escribir un compilador a mano es que hay que realizar muchas tareas de forma repetitiva. Uno no puede evitar tener la impresin de que todo se podra automatizar enormemente.
Debido a esta necesidad de automatizacin aparecieron las primeras herramientas de ayuda a la construccin de procesadores de lenguajes. Lo que hacen estas herramientas es generar cdigo en un lenguaje de programacin (C, C++, JAVA, etc.) para ahorrar al programador la parte repetitiva de la programacin de compiladores, pudiendo ste dedicarse al diseo.
Varias universidades construyeron herramientas de este tipo, pero fueron YACC y LEX las que ms se han extendido. Al principio de los 70, Stephen C. Johnson desarroll YACC (Yet Another Compiler-Compiler) laboratorios Bell, usando un dialecto portable del lenguaje C. YACC es una herramienta capaz de generar un analizador sintctico en C a partir de una serie de reglas de sintaxis que debe cumplir. Dichas reglas se especifican en un lenguaje muy sencillo. YACC se apoya en la herramienta LEX para el anlisis lxico. LEX fue desarrollada por Eric Schmidt. Esta herramienta tambin fue desarrollada en C, y tambin genera un analizador en C. LEX y YACC sirvieron como base a FLEX y BISON, que se consideran sus herederas. FLEX y BISON son dos productos de la FSF (Free Software Foundation).
Ahora el proceso de compilacin est ms formalizado; se admite ampliamente que es necesario crear un rbol de sintaxis abstracta si se quiere realizar un anlisis semntico correctamente. Es necesario crear y recorrer de una forma estandarizada los rboles de sintaxis abstracta.
ANTLR es un software desarrollado en JAVA por varios individuos, aunque la idea inicial y las decisiones principales de diseo son de Terence Parr. En su proyecto de grado, Terence presentaba una manera eficiente de implementar los analizadores LL. Los hallazgos presentados en este proyecto fueron los que le llevaron a implementar PCCTS, que puede considerarse como la semilla de ANTLR. PCCTS permite generar analizadores lxicos y sintcticos. Para recorrer los rboles de sintaxis abstracta, se desarroll un programa compaero llamado SORCERER. ANTLR ha sufrido varias reescrituras completas desde su inicio, incluyendo el cambio del lenguaje de programacin utilizado (inicialmente fue C) y varios cambios de nombre. Mientras que FLEX y BISON son herramientas dedicadas a una sola fase del anlisis, ANTLR es capaz de actuar a tres niveles a la vez (cuatro si tenemos en cuenta la generacin de cdigo).
El uso de una sola herramienta para todos los niveles tiene varias ventajas. La ms importante es la estandarizacin: con ANTLR basta con comprender el paradigma de anlisis una vez para poder implementar todas las fases de anlisis. Con FLEX+BISON es necesario comprender y saber utilizar herramientas completamente diferentes (FLEX est basada en autmatas finitos deterministas y BISON en un analizador LALR), adems de necesitar de otras herramientas para realizar el anlisis semntico. Prctica Lenguajes de Programacin UN
2. Qu es ANTLR?
ANTLR es un generador de analizadores. Mucha gente llama a estas herramientas compiladores de compiladores, dado que el ayudar a implementar compiladores es su uso ms popular. ANTLR es una herramienta que integra la generacin de analizadores lxicos, sintcticos, rboles de sintaxis abstracta y evaluadores de atributos. ANTLR est escrito en Java y genera: Java, C, C++, C#, Javascript, Python. Todos los detalles se encuentran en su pgina oficial http://www.antlr.org/.
Su funcionamiento bsico es el siguiente: - Se disea un analizador lxico y un analizador sintctico usando una gramtica a partir de archivo(s) fuente (escrito en una especificacin propia). - ANTLR genera el cdigo fuente del analizador lxico y sintctico correspondientes.
Caractersticas: - ANTLR ANother Tool for Language Recognition - Construccin automtica de procesadores de lenguaje - Genera cdigo fuente en distintos lenguajes - Permite incorporar acciones semnticas - Multiplataforma - Posee un entorno de desarrollo (ANTLWorks) y plugins para distintos IDEs.
3. Instalacin
0. Si an no est instalada, instalar la mquina virtual de JAVA (JVM versin 1.6 o superior) a. En la consola, verificar que funcionan los comandos: java y javac 1. Descargar http://www.antlr.org/download/antlr-4.2-complete.jar 2. Guardar el archivo en una ubicacin conveniente, por ejemplo: C:\ANTLR 3. Aadir la ruta al CLASSPATH: a. Permanentemente: Propiedades del sistema -> Variables de entorno -> Variables del sistema -> CLASSPATH -> Editar (es necesario reiniciar) b. Temporalmente, escribiendo en consola: SET CLASSPATH=.;C:\ANTLR\antlr-4.2-complete.jar;%CLASSPATH% c. En consola, verificar que funciona: Prctica Lenguajes de Programacin UN java org.antlr.v4.Tool
4. En la consola, ir al directorio donde vamos a trabajar C:\ANTLR 5. Ejecutar: java -jar antlr-4.2-complete.jar
4. Estructura de un archivo fuente de ANTLR
Los archivos con los que trabaja ANTLR tienen la extensin *.g, y en adelante los llamaremos archivos de especificacin de gramticas o, directamente, archivos de gramticas. stos contienen la definicin de uno o varios analizadores. Cada uno de estos analizadores se traducir a cdigo nativo (JAVA, C++ o C#, dependiendo de ciertas opciones) en forma de clases. Es decir, por cada analizador descrito en el archivo de gramticas se generar una clase.
Todo archivo de gramtica tiene la siguiente estructura: grammar NombreGramtica;
options { /* opciones generales a todo el archivo */ }
@header {...}
@members {...}
Reglas
Tras grammar indicamos el nombre de la gramtica, con ello fijamos el nombre que tendrn las correspondientes clases del analizador lxico NombreGramtica.java y sintctico NombreGramticaParser.java (si estamos usando JAVA como lenguaje de salida).
Options: es la zona de opciones generales. Es opcional. Permite controlar algunos parmetros de ANTLR mediante opciones. Las opciones se representan como asignaciones : nombreOpcion=valor;. Se utilizan mucho en ANTLR. Las opcin ms importante de esta zona es la que permite elegir el lenguaje nativo en el que se generarn los analizadores (JAVA, C++, C#). Su valor por defecto es JAVA. Tras las opciones generales del fichero vienen las definiciones de analizadores. Es muy comn que en un mismo fichero se especifiquen varios analizadores. Sin embargo, tambin es posible definir cada analizador en un fichero, sobre todo cuando se trata de analizadores extensos.
@header es una zona opcional (puede aparecer o no). Delimitada por las partculas header { y }. Aqu se incluyen los elementos en cdigo nativo (JAVA, C++ o C#) que deben preceder a la definicin de las diferentes clases de los analizadores. Esta seccin se utiliza para incluir otros ficheros (import e #include), definir el paquete al que pertenecer la clase del analizador (package) etc.
Por otra parte, @members permite insertar atributos y mtodos definidos por el usuario en esa clase.
La especificacin de las reglas se hace con notacin gramatical, de la siguiente forma: ANTECEDENTE : CONSECUENTE;
ANTLR se ha diseado para incluir las especificaciones lxica y sintctica tanto juntas como separadas. El caso de tener ambas especificaciones juntas, se cumple que si el antecedente est escrito en maysculas, ANTLR lo interpretar como una regla lxica. Sin embargo, si el antecedente est escrito en minsculas, ANTLR lo interpretar como una regla sintctica.
Para ANTLR las minsculas se asocian a los smbolos no terminales y las maysculas a los terminales. Cuando se trabaja con las especificaciones separadas, hay que definir la gramtica lxica y la gramtica sintctica. Para la gramtica lxica es necesario introducir en el archivo que contenga dicha especificacin lexer gramar NombreArchivo. Esta sentencia indica a ANTLR que se trata de una especificacin lxica. En la especificacin sintctica hay que incluir solamente grammar Nombre, para indicar que se trata de una especificacin sintctica. Adems, es necesario importar la especificacin lxica correspondiente. Prctica Lenguajes de Programacin UN 5. Salida ANTLR
Cuando se ejecutamos ANTLR con el comando: java jar antlr-4.2-complete.jar NOMBRE_ARCHIVO_PRUEBA.g, se crean como resultado los archivos: PruebaLexer.java y PruebaParser.java (en el caso que se est usando JAVA), que corresponden al cdigo fuente del analizador lxico y sintctico, respectivamente.
Para poder ejecutar el analizador hay que aadir un mtodo main a la clase del analizador. A continuacin se muestra una plantilla para dicho mtodo:
import org.antlr.v4.runtime.*;
public class MiAnalizador {
public static void main(String args[]) { try{ /* Atencin reemplaza XXXX por el nombre de tu gramtica Este programa funcionara para una gramtica llamada XXXX.g */ // Crear el objeto correspondiente al analizador lxico // Asignar el archivo de entrada al analizador lxico XXXXLexer analex = new XXXXLexer(new ANTLRFileStream(args[0])); // Identificar al analizador lxico como fuente de tokens para // el sintactico CommonTokenStream tokens = new CommonTokenStream(analex); // Crear el objeto correspondiente al analizador sintctico XXXXParser anasint = new XXXXParser(tokens); /* Comenzar el anlisis llamando al axioma de la gramtica Atencin, sustituye AXIOMA por el nombre del axioma de tu gramtica */ anasint.AXIOMA(); }catch (java.io.IOException fnfe){ System.err.println("No se encontr el archivo"); } } }
Compilando estos 3 archivos se tiene como resultado el analizador completo que admite un archivo de entrada desde la lnea de comandos, lo procesa y emite los mensajes de error correspondientes (en caso que sea necesario).
6. Reglas (analizadores lxicos y sintcticos)
Smbolos lxicos: comienzan con mayscula Smbolos auxiliares (no terminales): comienzan con minscula Comentarios: o // Una lnea o /* varias lneas */ Expresiones regulares: o Literales entre comillas simples p.e. a o Rangos: a..z o Negacin: ~x o Alternativas (o): | o 0 o ms ocurrencias: * o 1 o ms ocurrencias: + o 0 o 1 ocurrencia: ?
Prctica Lenguajes de Programacin UN
Reglas: o <smbolo lxico o auxiliar> : <definicin1> | <definicin2> | <definicin_i> ;
Reglas sintcticas en EBNF (Extended Backus-Naur Form): Se permite +, *, ? en las partes derechas de las reglas.