You are on page 1of 6

Prctica Lenguajes de Programacin UN

UNIVERSIDAD NACIONAL DE COLOMBIA


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.


7. Ejemplo

a. Archivo Expr.g:

grammar Expr;

// REGLAS SINTACTICAS

expr : term ( (MAS | MENOS) term)*
{ System.out.println("Anlisis terminado.\n");
};

term : factor ( (MULT | DIV) factor)*;

factor : ENTERO;


// TOKENS

MAS : '+';
MENOS : '-';
MULT : '*';
DIV : '/';

// REGLAS LEXICAS

ENTERO :('0'..'9')+;

ESPACIO: ( ' '
| '\t'
| '\r'
| '\n'
)+ -> channel(HIDDEN)
;


b. Generar el cdigo fuente del analizador lxico y sintctico

>java -jar antlr-4.2-complete.jar Expr.g

c. Archivo MiExpr.java (main)

import org.antlr.v4.runtime.*;
public class MiExpr {
public static void main(String args[]) {
try {
ExprLexer analex = new ExprLexer(new ANTLRFileStream(args[0]));
CommonTokenStream tokens = new CommonTokenStream(analex);
ExprParser anasint = new ExprParser(tokens);
anasint.expr();
} catch (java.io.IOException fnfe) {
System.err.println("No se encontr el archivo");
}
}
}

Prctica Lenguajes de Programacin UN
d. Compilar

>javac ExprLexer.java ExprParser.java MiExpr.java

e. Archivo entrada.txt

23+3 -9 *3

f. Probar

>java MiExpr entrada.txt


8. ANTLRWorks

Hacer lo mismo usando y explorando las caractersticas del entorno de desarrollo ANTLRWorks.

You might also like