Post on 06-Aug-2021
AMBITOS DE APLICACIÓN DE LOS LENGUAJES FORMALES CON ANTLR
APPLICATION SCOPES OF THE FORMAL LANGUAGES WITH ANTLR
Eric Jeltsch F.1 Luis Cuello A.2 Gonzalo Santander P. 3
RESUMEN
En informe se presenta un conjunto de actividades realizadas en el curso de Teoría de Autómatas y Lenguajes Formales,
a medida que se avanzó en el curso, el profesor guía solicitó realizar tres actividades, la primera actividad es una
introducción a las herramientas Lex/Yacc y ANTLR para el conocimiento y practica en las mismas, luego se continuo
con una guía de ejercicios y finalmente una breve introducción al proyecto final del curso, una actualización de un
proyecto DSL (Domain Specific Language: Lenguaje específico del dominio) desde un listado de proyectos obtenidos
desde la Universidad de Columbia, proyectos a cargo del profesor guía Stephen A. Edward, algunos de los proyectos
son: HML: Homosapien Modeling Language, TML: Text Manipulation Language, CATALOG: Digital Media
Organization Language, entre otros, todos ellos están implementados en ANTLR (ANother Tool for Language
Recognition), y que pueden ser trabajadas con el editor ANTLRWorks2 de Tunnel Vision Laboratories. En el proceso
de desarrollo de las actividades se comprobó el potencial y efectividad de las herramientas en el contexto de los
analizadores lexicográficos y sintácticos. Finalmente, se puede concluir que el uso, manejo e incorporación de este tipo
de herramientas es recomendable, oportuna y factible para el curso de Teoría de Autómatas y lenguajes formales para
estudiantes de pregrado en Ingeniería en Computación.
Palabras clave: antlr; dsl; lenguajes formales; automatas.
ABSTRACT
In the report a set of activities undertaken in the course Theory of Automata and Formal Languages, as we move
forward in the course we were asked to perform three activities show, the first activity is an introduction to Lex / yacc
and ANTLR tools knowledge and practice in them, then continue with a guide of exercises and finally a brief
introduction to the final draft of course, an update of a project DSL (Domain Specific Language: Domain Specific
Language) from a list of projects obtained from the Columbia University project by Professor Stephen A. Edward guide,
some of the projects are: HML: Homosapien Modeling Language, TML: Text Manipulation Language, CATALOG:
Digital Media Organization Language, among others, all of them are implemented in ANTLR ( ANother Tool for
Language Recognition), and can be worked with editor ANTLRWorks2 Tunnel Vision Laboratories. In the process of
development of activities and the potential effectiveness of the tools in the context of the lexical and syntactic analyzers
it is checked. Finally, it can be concluded that the use, handling and incorporation of these tools is recommended,
timely and feasible for the course Theory of Automata and formal languages for undergraduate students in Computer
Engineering.
Keywords: antlr, dsl, formal languages, automaton.
1 Departamento de Matemáticas. Universidad de La Serena / Cisternas 1200. La Serena, Chile. ejeltsch@userena.cl 2 Escuela Ingeniería en Computación. Universidad de La Serena / Cisternas 1200. La Serena, Chile. lcuello@userena.cl 3 Escuela Ingeniería en Computación. Universidad de La Serena / Cisternas 1200. La Serena, Chile. gsantander@alumnosuls.cl
INTRODUCCIÓN
La presente propuesta se inserta dentro de las actividades
docentes del curso de Teoría de autómatas y lenguajes
formales (TALF). Los conceptos que se propusieron en el
curso se relacionaron con el estudio de los DSL (Domain-
Specific Languages), [3], junto con la aplicación y manejo
de las herramientas ANTLR (ANother Tool for Language
Recognition) [1], y ANTLRWorks2 [2]. En términos
formales o curriculares, el tema de los DSL está soportada
por las asignaturas de Teoría de Autómatas y Lenguajes
Formales (Teórico-Práctico, 4 horas, 4º Año, 7º Nivel), la
cual es abordada con una estructura y herramientas
clásicas, tales como, Lex/Yacc, Flex/Bison, en el entorno
del lenguaje C, y JLex/CUP en el entorno Java, y cuyo
objetivo es el dotar al alumno de las competencias y
habilidades básicas para la descripción sistemática de
lenguajes formales y el desarrollo sistemático de
intérpretes, filtros y transformaciones en los lenguajes
formales según la jerarquía de Chomsky, y el uso de
técnicas estándares que se ponen en práctica en los
Laboratorios. Al mismo tiempo, los Laboratorios se
sustentan en la asignatura de Programación Orientada a
Objetos (Teórico-Práctico, 4 horas, 2º Año, 4º Nivel) y
Diseño y Análisis de Algoritmos (Teórico-Práctico, 4
horas, 3º Año, 5º Nivel), en donde las actividades
prácticas se enfocan al lenguaje Java, con uso intensivo de
las librerías, Generic, Collections y Swing, entre otras.
Cabe hacer notar que todas estas asignaturas de la carrera
procura cumplir con las recomendaciones de la
ACM/IEEE-CS Curriculum Joint Task-Force, [6] y
referentes universales, en el sentido de que las materias y
conocimientos entregados se encuadran dentro del área
del conocimiento respectivo (Software Engineering). La
propuesta actualiza un DSL externo, que incorpora la
programación orientada a objetos y el uso de la
arquitectura Modelo-Vista-Controlador, todo ello
realizado por alumnos de la carrera que cursa la
asignatura TALF. Gracias a las horas de teoría del curso,
conociendo los distintos tipos de autómatas, gramáticas y
lenguajes, han sido útil para entender cómo funcionan a
nivel más profundo el tema de cómo se trabajan con los
códigos fuente y como se crear el programa interpretando
ese código fuente a través de un compilador (e incluso con
un poco más de habilidad la creación del mismo). Además
los conocimientos obtenidos nos permiten la creación de
un DSL (Lenguaje de dominio especifico) utilizando las
herramientas de código abierto, tales como, ANTLR y
ANTLRWorks2.
DESCRIPCION DEL CURSO
Es un curso del Ciclo Superior teórico- práctico, (7º
Nivel) que entrega los fundamentos teóricos de la
programación, combinando la teoría con la práctica a
través de numerosos ejemplos. Se muestra la clasificación
de Chomsky, se exponen las gramáticas regulares y los
autómatas finitos, las máquinas secuenciales, las
gramáticas independientes del contexto los autómatas a
pila y las máquinas de Turing, junto con aplicaciones
prácticas en diversas disciplinas. Los tópicos recopilados
para las aplicaciones incluyen en general, la construcción
de un lenguaje de propósito específico, DSL, y el manejo
de herramientas que coadyuven a la consecución de ellos.
En los Laboratorios, se continua aprendiendo y aplicando
el lenguaje Java como herramienta y la Programación
Orientada a Objeto como metodología para implementar
algoritmos o proyectos que se deriven de los contenidos.
Dejando el contexto abierto para incursionar en algún
campo de interés, por ejemplo, telemedicina, creación de
lenguajes, Interoperabilidad semántica u otros.
FUNDAMENTOS
La importancia de los DSL radica en que son lenguajes de
programación que están diseñados para utilizarse en
dominios o problemas específicos, a diferencia de los
lenguajes de programación de propósito general (Java, C,
C++ u otros). Martin Fowler y Debasish Ghosh hacen una
introducción y clasificación muy interesante de los
mismos en [4,5]. En general, son numerosos los proyectos
en donde ANTLR ha intervenido, entre ellos, Apache
Camel, Apache Lucene, Groovy, Hibernate. Por ejemplo,
Hibernate usa ANTLR para el parser en el lenguaje de
consulta HQL, EJB-QL y Criteria Query. En Drools
(Business Logic Integration Platform), uno de los
productos más importantes en la plataforma JBoss-SOA
es el lenguaje DRL, el cual relaciona reglas de negocio
definidas a alto nivel dentro de un motor de procesos. Es
decir, una cantidad importante de proyectos han visto lo
apropiado de usar los DSL en pequeñas aplicaciones y la
importancia que le cabe a ANTLR en este aspecto.
HERRAMIENTA ANTLR
ANTLR (ANother Tool for Language Recognition; en
español "otra herramienta para reconocimiento de
lenguajes") es una herramienta creada principalmente por
Terence Parr, que opera sobre lenguajes, proporcionando
un marco para construir reconocedores (parsers),
intérpretes, compiladores y traductores de lenguajes a
partir de las descripciones gramaticales de los mismos
(conteniendo acciones semánticas a realizarse en varios
lenguajes de programación).
INSTALACION DE ANTLR
Previamente se debe tener instalado Java en el equipo, se
requiere la versión 1.8 y es posible descargarla desde el
siguiente link: https://www.java.com/es/download/.
Para instalar ANTLR se debe descargar desde la página
oficial: http://www.antlr.org/download.html se descarga el
archivo antlr-4.5.1-complete.jar. Una vez descargado este
jar y junto con gramática con extensión g4 (ambos
archivos en el mismo directorio), se procede a ejecutar el
archivo .jar para generar el lexer, parser y demás clases
java para trabajar en el proyecto.
Para generar las clases java y los demás archivos
utilizados por ANTLR es necesario escribir el siguiente
comando en la consola de Windows:
“java –cp (jar ANTLR) org.antlr.v4.Tool
(gramatica.g4)” generando los siguientes archivos en el
ejemplo para la gramática “ArrayInit.g4”
Además existen otros comandos para mostrar las pruebas
en la gramática creada, para la gramática Hello a
continuación se hizo el test con “Hello parrt” obteniendo:
Para realizar esto se utilizará: “java –jar (jar ANTLR)
org.antlr.v4.runtime.misc.TestRig (gramatica.g4)
(regla inicio) -(tree o gui) (test para la gramática)”. Tambien es posible crear un alias para evitar escribir el
comando completo para: “org.antlr.v4.Tool”y
“org.antlr.v4.runtime.misc.TestRig”.
Estos se llamarán ANTLR y GRUN respectivamente.
Para comenzar es necesario guardar el jar de ANTLR en
una carpeta específica y luego añadir la ruta de esta
carpeta como variable de entorno en PATH al sistema
operativo, luego se deben crear 2 archivos con la
extensión bat con el nombre del alias que se desea asignar
a los comandos dentro del mismo directorio donde se
encuentra el archivo jar de ANTLR.
Se crea el archivo ANTLR.bat y dentro de él se escribe
“java org.antlr.v4.Tool %*” y finalmente el archivo
GRUN.bat y dentro de él se escribe “java
org.antlr.v4.gui.TestRig %*”. Con esto se finaliza el
proceso de instalación y prueba de ANTLR por consola.
Existen además 2 maneras de trabajar con ANTLR de
forma más simple descritas a continuación.
Plugin de ANTLR para Eclipse
En el editor se selecciona Help -> Install New Software y
se agrega en el apartado Work With el siguiente link:
https://marketplace.eclipse.org/content/antlr-4-ide.
Una vez instalado, este plugin permite editar la
gramática, ver el diagrama de la misma y crear las clases
correspondientes para crear un proyecto.
Para configurar otras opciones para generar los archivos
java es necesario ir a “Windows->Preferences-
>ANTLR4->Tool”
ANTLR WORKS es un entorno de desarrollo novedoso
para ANTLR3/4. Combina un redactor de gramática
consciente, excelente, con un intérprete para prototipado
rápido y un depurador independiente del idioma para
aislar errores gramaticales.
Actualmente se encuentra disponible la versión 2.1 que
puede ser descargada de su página oficial desde aquí:
http://tunnelvisionlabs.com/products/demo/antlrworks
Con este editor se puede comprobar la correcta sintaxis de
la gramática a crear y además de ver las transiciones de la
misma seleccionando una regla y presionando sobre el
botón “syntax diagram”.
Además se puede testear la gramática y ver el AST con la
opción “Run -> Run in TestRig...”
Luego de comprobar la correcta sintaxis de la gramática
creada, es posible generar el código en Java desde el
menú: “Run -> Generate Recognizer”.
EXPERIENCIA 1
En esta actividad introductoria al curso TALF se solicita
una demostración del uso de Lex/Yacc y ANTLR.
Lex/Yacc
Para comenzar se crea el Lexer (.flex) y el Parser (.y), se
utilizarán los archivos “jflex-1.6.1” y “yacc” resultando
los archivos iniciales:
Luego utilizaremos jflex-1.6.1 para generar el lexer en
java: java –jar jflex-1.6.1.jar calc.flex
A continuación se utilizará el archivo “yacc” para generar
el parser en java: yacc –J calc.y
Obteniendo los siguientes archivos:
Yylex.java, Parser.java y ParserVal.java.
Finalmente se importan estos archivos a un proyecto en
eclipse:
Y hacemos una prueba de la calculadora ingresando la
expresión: ( 3 + 5 ) * 7
Obteniendo como resultado 56 comprobando el correcto
funcionamiento de la calculadora.
ACTIVIDAD ANTLR
Para esta actividad se solicita crear una gramática, a la
cual llamaremos “testeoantlr” y utilizando la aplicación
AntlrWorks v1.5.2 para crear, visualizar y probar la
gramática.
Crear la gramática: File -> New
Y se le asigna un nombre a la gramática
Gramática
grammar testeoantlr; options { k = 1; } decl_or_def : type ID '(' args ')' (';' | '{' body '}') ; type: 'void' | 'int' ; args: arg (',' arg)* ; arg : 'int' ID ; body: 'return' INT ';'; ID : ('A'..'Z'|'a'..'z')+; INT: ('1'..'9') ('0'..'9')*;
Luego de crear la gramática, se pueden ver los estados de
las reglas:
Luego para generar la clases en java: Generate ->
Generate Code
Finalmente se puede realizar una prueba de la gramática
creada ingresando un archivo en: Run -> run
Contenido del archivo para probar:
void main (int arg){return 5;}
Donde finalmente se visualiza el ParseTree para el test y
se puede comprobar que la cadena ingresada es
compatible con la gramática.
EXPERIENCIA 2
En esta actividad se presenta una guía con un conjunto de
ejercicios que se describen a continuación:
Actividad 1: Instalación de ANTLR, esta actividad fue
descrita al comienzo del documento.
Actividad 2: Construya un analizador lexicográfico
básico para las expresiones aritméticas en ANTLRWorks
y visualice sus propiedades a partir de las herramientas
que pone a disposición ANTLRWorks.
Gramática utilizada:
Actividad 3: Hacer las pruebas necesarias
Actividad 4: Prueba con lectura desde texto plano
Actividad 5: Guardar resultado en archivo
Desarrollo 3, 4, 5: Después de trabajar con la gramática
en AntlrWorks 2, se general los archivos y los
posteriormente se importan a eclipse para crear una
aplicación:
Se entregan como parámetros de entrada lo propuesto en
la “actividad 2”, directamente en el panel de entrada o
cargándolo desde un archivo para finalmente mostrarlo en
el panel de salida y/o guardarlo en un archivo de salida
como indicaba la actividad.
Actividad 6: Cambio de propiedad expresiones
aritméticas
Desarrollo 6: Se pide cambiar el orden de precedencia de
los operadores aritméticos, para ello modificaremos la
gramática que teníamos originalmente “calculator.g4”en
las siguientes líneas:
Reemplazándolas por las siguientes:
Finalmente comprobaremos la salida de las gramáticas
Calculadora normal
Calculadora inversa
Actividad 7: Un Ingeniero en Computación de la ULS,
tenía la siguiente dificultad al procesar un archivo plano
con características de este tipo:
4564, Time: Play and Pay,1:02,1,”41,38",”258,62"
En donde la separación por la coma no le funciona, ya que
existían los decimales que también están separados por
coma.
Desarrollo 7: Para esta actividad se debe crear una nueva
gramática en AntlrWorks y luego testearla
Finalmente se prueba la cadena retornando el siguiente
ParseTree:
EXPERIENCIA 3
Para esta actividad, el profesor guía presenta un listado de
proyectos ANTLR desde la Universidad de Columbia a
cargo del docente Stephen A. Edwards, en la cual solicita
seleccionar algunos de los presentados en la lista y
actualizarlos a la versión más reciente de ANTLR, la gran
parte de los proyectos se encuentran en la versión 2.x,
entonces la idea es actualizar el proyecto a la versión más
reciente la cual seria 4.x
Lista de proyectos ANTLR
El proyecto seleccionado para esta actividad será
CATALOG.
CATALOG
“En nuestros días de creciente dependencia de
información digital, mientras que nuestros viejos álbumes
de fotos y discos de música están recogiendo el polvo en
los estantes, los grandes volúmenes de archivos MP3,
AVI, JPEG y otros archivos formatos están creciendo en
nuestros discos duros, llenando medios grabables y crear
una necesidad de más almacenamiento extraíble y el
hardware de copia de seguridad. Creemos que es el
momento de crear algo que nos ayudará organizar este
caos, eliminar una gran cantidad de redundancia y
espero liberar algo de espacio. Por desgracia, no es fácil
construir una herramienta general para ayudar a las
personas catalogan sus datos, por lo tanto, proponer la
construcción de un nuevo lenguaje para este propósito.”
Todos los archivos son de cierto tipo, que se define por su
extensión y el formato. Los archivos también tienen otras
propiedades en función de su tipo. Por ejemplo, un
archivo de imagen puede tener la propiedad modelo de la
cámara y un archivo de música puede tener artista y el
álbum. Las propiedades se utilizan generalmente para
organizar los archivos. La música puede estar en una
carpeta con el nombre después de su género y fotos puede
ser en una carpeta que tiene un nombre del evento que
fotos fueron tomadas, pero también pueden contener la
fecha de este evento en el nombre de la carpeta.
Desafortunadamente, no hay manera fácil de traducir estas
propiedades en estructuras de directorio o mover
fácilmente archivos de una carpeta a otra en función de
sus tipos sin intervención manual. El sistema operativo
proporciona algunas herramientas, pero la mayoría de las
veces los usuarios tienen que repetir mismos pasos una y
otra vez. Proponemos a escribir un compilador para un
lenguaje de programación orientado a objetos que le
ayuda mucho con archivos de medios digitales y otros
archivos de una manera organizada. Este lenguaje,
llamado CATALOG, es suficientemente simple para que
todos los usuarios sean capaces de crear programas
personalizados para sí mismos de forma rápida con el fin
de catalogar sus datos.
CATALOG será un lenguaje de programación con un
amplio ámbito de aplicación práctica. La gente será capaz
de crear programas para sus propios hábitos de
mantenimiento de archivos y estructuras de directorios. Se
trata de una flexibilidad que manipulación de archivos y
herramientas de catalogación que no proporcionar los
sistemas operativos, simplemente carecen de ella. El
lenguaje será orientado a contenido muy ampliable, que es
esencial debido al creciente número de formatos digitales
y propiedades de archivo que se crearán en el futuro.
Desarrollo:
Para esta actividad, lo primordial es actualizar la
gramática desde la versión 2.7.7 a la versión 4.5 de
ANTLR.
Una vez descargados todos los archivos del proyecto se
procede a analizar la sintaxis.
Gramática original:
Actualización de la gramática utilizando el editor de
AntlWorks2:
Modelado funcionamiento proyecto Catalog 2
Modelado clases internas de Catalog
Método de trabajo
La metodología de trabajo utilizada en fue, en primera
parte, investigar sobre ANTLR, comprender la sintaxis,
buscar ejemplos de gramáticas en ANTLR, comenzando
por la versión originaria del proyecto CATALOG, que se
deberá actualizar a la última versión de ANTLR según la
actividad final dada por el profesor guía. La versión de
CATALOG es ANTLR 2.7.7.
ANTLR 2
Se utilizaba además de Lexer y Parser, un TreeWalker. El
TreeWalker contiene código nativo de Java, inserto dentro
de la misma gramática, que especifica cuáles serán las
acciones realizadas en cada regla. Luego el AST es
generado automáticamente cuando se compilan las clases
de Java utilizando el archivo .jar de ANTLR versión
2.7.7.
Dentro de la gramática, también era necesario especificar
el número de caracteres a leer de profundidad, este
concepto se utilizaba en esta versión para que no hubieran
conflictos mientras se leían dos reglas, cuyos nombres
comenzaban con los mismos n-caracteres, esto se conoce
como “Lookahead Depth” y se incorporaba en la
gramatica de la siguiente forma:
A su vez contenía una extensa lista de opciones
(http://www.antlr2.org/doc/options.html), sin embargo en
ANTLR 4 se han modificado y ya no es posible agregarlas
a nivel general de gramática.
Construcción de AST en ANTLR 2
En ANTLR 2 la construcción del AST se realizaba
especificando dentro de la gramática, en los tokens, las
notaciones “^” y “!”, y cualquier token que no llevara
alguna de estas notaciones es considerado un nodo hoja en
el árbol resultante, la notación “^” indica que el token es
considerado como un nodo raíz, mientras que la notación
“!” indica que no se considera en la construcción del
árbol.
options { k = x } //x representa el numero de caracteres de profundidad a leer
class MyClassParser extends Lexer; class MyClassParser extends Parser; class MyClassWalker extends TreeParser;
//notación “^” myRule : A B^ C^ ; //notación “!” myRule : A B! ;
Traducción de Acciones en el AST
En los parsers y tree parsers con la opción “buildAST =
true”, al igual que en el caso de CATALOG, ANTLR
traducirá porciones de código con el prefijo “#”, de esta
manera es más fácil construir AST con acciones.
ANTLR 4
La cuarta versión del generador de analizadores
sintácticos. Antlr se mantiene por Terence Parr, profesor
en la Universidad de San Francisco.
¿Qué significa analizar con ANTLR?, la estructura se
describe como una gramática, Reconocedor se divide en
lexer y parser. El árbol de análisis puede ser generado
automáticamente.
Lo primero a tener en cuenta sobre el archivo de la
gramática es que no se debe incrustar cualquier acción en
la misma. Acciones incrustadas son piezas de código Java
unido a diversas reglas de la gramática; cuando estas
reglas son igualadas por el analizador, el código Java
asociado se ejecutará. Acciones incorporadas son una gran
manera de empezar a trabajar con ANTLR, pero ya no se
recomienda su uso para cualquier cosa menos
aplicaciones sencillas y experimentos, ya que es probable
que desea mantener su definición del lenguaje
independiente de la lógica de aplicación.
Cambios en ANTLR versión 4
La gran diferencia de esta nueva versión de ANTLR es
que es mucho más simple de utilizar respecto a las
versiones anteriores ayudando a los estudiantes aprender
más rápido, la idea de esta versión respecto a las
anteriores es obtener una gramática limpia, es decir, no
contenga condigo fuente del programa en ella misma.
La más grande diferencia entre ANTLR 2 y ANTLR 4 es
que ANTLR 4 tiene la capacidad de leer cualquier
gramática a menos que tenga recursión indirecta por la
izquierda. Esto significa que no es necesario el uso de
“syntactic predicates” (lookahead depth), o “backtrack”
(ya viene automático). ANTLR 4 soporta recursión directa
por la izquierda de manera que expresar cosas como una
expresión aritmética se vuelve mucho más fácil y natural.
ANTLR 4 a su vez construye automáticamente Parse
Trees mientras que la construcción AST ya no es una
opción.
Otra gran diferencia es que en ANTLR 4 se fomenta la no
utilización de acciones directamente en la gramática, esto
es, a utilizar los “listeners” y “visitors” generados
automáticamente por ANTLR y dedicar el trabajo de la
funcionalidad dentro del código Java, y no directamente
en la gramática, como solía ser anteriormente. Ya no
existen los Tree Grammars (o TreeWalkers mencionados
anteriormente) porque ahora en lugar de ellos se utilizan
listeners y visitors.
La idea de utilizar los listener o los visitor es generar una
nueva clase que extienda de ellas, implementando todos
sus métodos que son en el fondo las acciones asociadas a
la gramática, para así poder tener una gramática limpia, lo
que no implica que no se pueda utilizar una gramática con
código intermedio.
Si está considerando el uso de ANTLR para ejecutar
lógica personalizada basada en el contenido de la entrada
que se adhieren a la sintaxis en un archivo de gramática.
Si su lógica es bastante simple, y su gramática sólo será
utilizada para una aplicación de un solo idioma, podría
considerar la incorporación de la lógica (código
intermedio) en el archivo de gramática en sí. Si la lógica
es compleja, y / o su gramática se utilizará para múltiples
aplicaciones de lenguaje, debe evitar acciones incrustadas
y se pega con los Visitor y Listener.
Listener
Los listeners son buenos para ejecutar código cada vez
que tu parser encuentra una regla particular. A pesar de
que el mismo efecto se puede lograr con un visitor,
usando un listener no requiere que tú visites manualmente
los nodos hijos del árbol de análisis sintáctico, diferente a
usar un visitor. Por defecto, todos los nodos en un árbol
de análisis sintáctico son visitados por un listener, en otras
palabras, el árbol de análisis sintáctico entero es recorrido.
Cuando das tu gramática a ANTLR para la generación de
un lexer y un parser, incluye el argumento -listener para
decirle a ANTLR que tu plan en la escritura es con uno o
más listeners.
“ANTLR genera por defecto los listeners”
r ! : a :A { #r = #a; }
expr : expr '*' expr
| expr '+' expr
| INT
;
Visitor
Los visitor se utilizan para visitar selectivamente nodos en
un árbol de análisis sintáctico ANTLR. Si usted tiene una
aplicación de lenguaje que no tiene que visitar cada nodo
en un árbol de análisis sintáctico, o si las visitas son
dependientes de contexto, debe implementar su lógica
dentro de un visitante. Cuando le das a tu gramática para
antlr para lexer y la generación de parser, incluya el
argumento -visitor para decirle ANTLR que piensa en la
escritura de uno o más visitantes.
“no-listener –visitor”
CONCLUSIONES
La creación de lenguajes específicos como los DSL y el uso
de la herramienta ANTLR en la implementación de
gramáticas, analizadores léxicos y sintácticos son muy
útiles a la hora de enfrentar unas de las cosas más
esenciales para un estudiante de ingeniería en computación,
cómo trabajar con su propio lenguaje, a través de la carrera
se van aprendiendo distintos tipos de lenguajes de
programación pero nunca se ve realmente como se han
creado éstos, entonces al pasar por este curso y utilizar las
herramientas se puede apreciar la complejidad que existe al
crear un nuevo tipo de lenguaje, además de conocer el
proceso de compilación de los códigos fuentes. Esta
herramienta que facilita la creación de nuevos lenguajes,
además, permite facilitar las tareas a personas que tengan
interés de aplicar programación a sus actividades diarias
pero simplificándoles las vida creando un DSL apropiado
para su actividad, especialmente en el área científica.
La utilización de un DSL lleva a pensar en la idea de
construir un propio lenguaje específico dentro de una
aplicación, esto significa que el nivel de abstracción será
mucho más alto, y por tanto, se podrá hacer enfoque en
otras funcionalidades dentro de la aplicación, considerando
el ejemplo de que, a partir de una simple regla creada en
una gramática, implementarla sin un DSL en lenguaje Java,
por ejemplo, llevaría mucho más esfuerzo y tendría cientos
de líneas, en cambio con el uso DSL se traduce sólo a
algunas líneas y se podrá hacer enfoque en otras cosas
además de la programación, creando nuevas
funcionalidades que un lenguaje general (General Purpose
Language) no trae, ejemplos claros de DSL son HTML y
SQL.
El uso de DSLs además, nos da la habilidad de poder
comunicar una o más aplicaciones entre sí, lo que potencia
mucho más el intercambio y utilización de información
dentro de un software, lo cual es primordial en la
implementación de proyectos de carácter empresarial.
AGRADECIMENTOS
Se agradece a Stephen A. Edwards por facilitar los
proyectos de sus estudiantes públicamente para que
puedan ser utilizados por quien los necesite.
REFERENCIAS
[1] ANTLRv4. http://www.antlr.org/. Fecha de consulta:
30 Junio 2015.
[2] J. Bovet, T. Parr. ANTLRWorks2: an ANTLR grammar development environment. ANTLRWorks 2 is a complete rewrite of the previous grammar tool using several new techniques developed at Tunnel Vision Labs.
[3] T. Parr: The Definitive ANTLR Reference: Building
Domain-Specific Languages. Raleigh: The Pragmatic
Bookshelf, 2007.
[4] M. Fowler, Domain-Specific Languages, October 3,
2010, ISBN-13: 978-0321-71294-3.
[5] D. Ghosh, DSLs in Action, Manning Publication,
2011, ISBN-13:978-1-935182-45-0.
[6] ACM. Computing Curricula 2005.
http://www.acm.org/education/education/curric_vols/
CC2005-March06Final.pdf. Fecha de consulta: 30
Junio 2013.