ambitos de aplicación de los lenguajes formales con antlr

Transcripción

ambitos de aplicación de los lenguajes formales con antlr
AMBITOS DE APLICACIÓN DE LOS LENGUAJES FORMALES CON ANTLR
APPLICATION SCOPES OF THE FORMAL LANGUAGES WITH ANTLR
Jonathan Aranda C.1
Exequiel Fuentes F. 2
Eric Jeltsch F.3
Felipe Lucero X. 4
RESUMEN
Se presenta una secuencia de actividades realizadas en el marco de la formación y del ejercicio del Ingeniero en
Computación de la ULS. Todas ellas, son implementadas en ANTLR (ANother Tool for Language Recognition), y
editadas con ANTLRWorks. La primera corresponde a la construcción de una aplicación básica de un DSL externo, la
segunda es la implementación de un editor e intérprete de consulta en modo texto para el lenguaje SNQL 2.0, para
finalmente definir una gramática reducida para SQL, en términos de implementar las reglas para SELECT, FROM,
WHERE y LIMIT en el ámbito del lenguaje Astronomical Data Query Language (ADQL). 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 de incluir en un curso de gramáticas y lenguajes formales para
estudiantes de pregrado en Ingeniería en Computación.
Palabras clave: antlr; dsl; lenguajes formales.
ABSTRACT
We present an activity sequences in the context of training and performance of a Software Engineer of ULS. All of them
are implemented in ANTLR (ANother Tool for Language Recognition) and edited with ANTLRWorks. The first one is a
construction of a basic application of an external DSL, the second implementation is a query interpreter and editor on
text mode for the language SNQL 2.0, and the last one defines a reduced grammar for SQL, which implements a set the
rules for SELECT, FROM, WHERE and LIMIT based on the Astronomical Data Query Language (ADQL). In the
development process, we have able to see the potential and effectiveness of the tools in the context of lexical and
syntactic analyzer. Finally, we can conclude that using, handling and incorporating these tools in grammars and formal
languages course for undergraduate students of Software Engineering career is totally recommended, appropriate and
feasible.
Keywords: antlr, dsl, formal languages.
INTRODUCCIÓN
La presente propuesta se inserta dentro de las actividades
docentes regulares en la formación y en el ejercicio de la
profesión como Ingeniero en Computación de la ULS,
cuya carrera tiene una duración de 5 años (10 Semestres,
10º Niveles). En particular, la asignatura Electivo
(Teórico-Práctico, 4 horas, 5º Año, 9º Nivel), es una de
las asignaturas que cumple con el objetivo de que el
alumno clarifique y refuerce algunos conceptos “extra
curriculares”, los que basados en los insumos teóricos y
prácticos permitan proponer algún tema de Memoria de
Título (MT). En esta oportunidad, los conceptos extra
curriculares están en el estudio de los DSL (DomainSpecific Languages), [9], junto con la aplicación y manejo
de las herramientas ANTLR (ANother Tool for Language
Recognition) [7], y ANTLRWorks [8]. En términos
curriculares, el curso Electivo pretende entregar las
1
herramientas para implementar intérpretes, filtros,
analizadores, transformación de formatos, entre otros. Por
otro lado, las competencias que se pretenden alcanzar es
poner en operación los diferentes conocimientos,
habilidades, carácter y valores de manera integral en las
diferentes interacciones en donde a los alumnos les toque
actuar, ya sea en el ámbito personal, social y laboral. Los
conocimientos y habilidades se sustentan en la asignatura
de Teoría de Autómatas y Lenguajes Formales (TeóricoPrá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
Escuela Ingeniería en Computación. Universidad de La Serena / Cisternas 1200. La Serena, Chile. [email protected]
Observatorio Interamericano Cerro Tololo / Colina El Pino s/n. La Serena, Chile. [email protected]
3
Departamento de Matemáticas. Universidad de La Serena / Cisternas 1200. La Serena, Chile. [email protected]
4
Escuela Ingeniería en Computación. Universidad de La Serena / Cisternas 1200. La Serena, Chile. [email protected]
2
se ponen en práctica en los Laboratorios. Al mismo
tiempo, los Laboratorios se sustentan en la asignatura de
Programación Orientada a Objeto (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 uso
intensivo de las librerías, Generic, Collections y Swing
de Java. Cabe hacer notar que todas estas asignaturas de la
carrera procuran cumplir con las recomendaciones de la
ACM/IEEE-CS Curriculum Joint Task-Force, [19] y
referentes universales, en el sentido de que las materias y
conocimientos entregados se encuadran dentro del área
del conocimiento respectivo (Software Engineering).
Dicho lo anterior, la asignatura Electivo está dentro del
ámbito de los Lenguajes de Programación (PL), tales
como, (PL3. Introducción a la traducción de lenguajes) y
(PL8. Sistemas de traducción de lenguajes). En términos
pedagógicos se puede afirmar que la incorporación de los
DSL en el Electivo hizo posible que los alumnos pudieran
reforzar y actualizar los saberes y habilidades para
enfrentarse a las expectativas y objetivos que sustentan el
perfil profesional del Ingeniero en Computación de la
ULS.
Como una muestra de ello, es que la propuesta considera
tres experiencias, pero en diferentes escenarios. En la
primera se crea e implementa un DSL externo clásico, que
incorpora la programación orientada a objeto y el uso de
la arquitectura Modelo-Vista-Controlador, todo ello
realizado por un alumno regular de la carrera que cursa la
asignatura Electivo. La segunda experiencia implementa
un editor e intérprete de consultas en modo texto para el
lenguaje de consultas SNQL2.0, el que pertenece al
modulo QE del sistema SNDM, siendo este último una
herramienta para el análisis de redes sociales y Web
Semántica, todo ello, en el contexto del desarrollo de una
memoria de título para optar al título de Ingeniero en
Computación. Mientras que la tercera y última
experiencia describe la creación e implementación de
algunas reglas para SSQL (S(hort)SQL), en particular
para SELECT, FROM, WHERE y LIMIT, esta vez para
Ruby, en el ámbito del quehacer profesional del Ingeniero
en Computación, en este caso, como funcionario del
Cerro
Tololo
Inter-American
Observatory.
El
denominador común de todas estas experiencias se
centran en que como alumnos, todos ellos han cursado la
asignatura Electivo, cuyos contenidos han sido el estudio
de los DSL y la aplicación de herramientas de código
abierto, tales como, ANTLR y ANTLRWorks. Con la
realización de estas actividades y el monitoreo o control
de ellas durante el semestre, fue posible constatar lo
exitoso que resultó en cada una de las actividades al
aplicar los DSL y herramientas afines, tales como
ANTLR, quien juega un rol importante en el desarrollo y
producción de esta propuesta.
FUNDAMENTOS
En INFONOR 2012 [14], ya se presentan algunas
experiencias básicas, insumos y actividades que
fundamentan la actual propuesta, de ahí que no se aborde
la temática del uso o aplicaciones de ANTLR. Los
contenidos de la asignatura Electivo se fundamentaron en
la importancia y dinámica de los procesadores de
lenguajes, el ámbito y alcances de los DSL, sumada a la
importancia de filtrar, administrar, buscar, categorizar y
recuperar datos en el ámbito de la Web Semántica y de la
Astronomía, entre otros, lo que ha posibilitado que la
temática abordada en el Electivo sea oportuna y factible
de realizar para la incorporación al mundo laboral y el
ejercicio de la profesión de los alumnos de la carrera de
Ingeniería en Computación de la ULS. 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 [10, 11].
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. Todo
ello, sirvió como inspiración para proponer los contenidos
de este Electivo que se viene dictando desde hace 3 años.
EXPERIENCIAS DOCENTE
Experiencia 1: Una de las propiedades más comunes del
lenguaje de programación Logo es poder producir
“gráficos tortuga”, es decir, entregar instrucciones a una
tortuga virtual, la que mediante un cursor gráfico puede
describir algunas trayectorias y con ello generar algunas
figuras o patrones. Un ejemplo típico de trayectoria para
una tortuga virtual es,
forward 100 (camina hacia delante 100 pasos)
turnright 90 (se gira hacia la derecha 90º)
turnleft 30 (se gira hacia la izquierda 30º)
En esta versión se propone Tortuga2 que permite
controlar el movimiento de una tortuga (cursor) que se
mueve en un plano cartesiano, al tiempo que va dibujando
con un lápiz. Lo novedoso de Tortuga2 es la forma de
reconocer los patrones (lexer y parser), los que han sido
implementados con la herramienta ANTLR (versión
antlr-3.4-complete)
y
antlrworks-1.4.3), mientras
ANTLRWorks, (versión
que la interfaz gráfica de
usuario o GUI, (Graphical User Interface) ha sido
implementada con los componentes Swing de Java, y la
plataforma org.eclipse.ltk.core.refactoring. Por lo
tanto, Tortuga2 es una aplicación multiplataforma.
Tortuga2 ha sido implementada y puesta a prueba con la
versión 1.6 (update 22) de la máquina virtual de Java
(JRE), y debería funcionar de forma correcta con
cualquier versión posterior. A continuación se muestran
las formas de iniciar la aplicación, ya sea, (con o sin)
archivo de instrucción, o línea de comando. Además, se
muestra el formato de los archivos utilizado, el diseño de
la aplicación y la gramática según la especificación
ANTLR, para finalmente mostrar una descripción de la
aplicación.
Inicio: Se inicia la aplicación, ya sea:
1. Sin archivo de instrucción: Para iniciar Tortuga2, hacer
doble click sobre el icono llamado Tortuga2.jar. La
máquina virtual de Java cargará la aplicación y mostrará
la pantalla principal.
2. Con archivo de instrucción: Para iniciar Tortuga2 con
un archivo de instrucción, arrastre el archivo en cuestión
sobre el icono llamado Tortuga2.jar y suéltelo. La
máquina virtual de Java cargará la aplicación y mostrará
la pantalla principal. La aplicación entonces comenzará a
leer y ejecutar las instrucciones que contiene el archivo
inmediatamente.
3. Desde la línea de comandos: Si por alguna razón no
puede iniciar la aplicación desde la interfaz gráfica de su
sistema, puede hacerlo mediante la línea de comandos.
Para el caso:
a) Sin archivo de instrucciones,
Ejemplo: A continuación se muestra en archivo
y el contenido de las instrucciones:
cuadrado.txt
ad 100
de 90
ad 100
de 90
ad 100
de 90
ad 100
de 90
En cuadrado.txt, podemos observar que la instrucción
dada en la primera línea (ad 100) indica a la tortuga
virtual realizar un movimiento hacia adelante de 100
pasos. En el contexto clásico sería (forward 100),
seguido de un giro a la derecha de 90º grados (turnright
90). Tras lo cual, se repiten tres veces más, logrando
dibujar así un cuadrado sobre el lienzo.
Diseño: Tortuga2 está compuesto por tres módulos:
a) Procesador,
b) Intérprete,
c) Interfaz Gráfica de Usuario (TortugaGUI).
La relación entre los módulos y componentes
mencionados puede observarse en el siguiente diagrama
de la Figura 2:
> java -jar Tortuga2.jar
b) Con archivo de instrucciones,
> java -jar Tortuga2.jar “instrucciones.txt”.
Formato de archivos: Cabe hacer notar que cada archivo
de instrucciones es de texto plano y está formado por una
o varias instrucciones.
Figura 2. Relación entre los módulos y componentes que
interactúan en Tortuga2.
Figura 1. Instrucción, Parámetros, Acción y Ejemplo para
los archivos “instrucciones.txt”.
a) El Procesador carga el archivo de instrucciones, el cual
es entregado al Intérprete para ser ejecutado. Si no se ha
especificado un archivo de instrucciones, el Procesador
entrega al intérprete el equivalente a un archivo de
instrucciones vacío. El Procesador además mantiene una
instancia de la clase Tortuga, la cual es la encargada de
mantener el estado de la tortuga y traducir las
instrucciones provenientes del Intérprete y del panel de
control para ser dibujadas sobre el lienzo de la interfaz
gráfica.
b) El Intérprete recibe el archivo de instrucciones cargado
por el procesador y, mediante el Runtime de ANTLR,
interpreta las instrucciones y se las entrega a la clase
Tortuga en el procesador.
c) La Interfaz de Gráfica de Usuario consta de un lienzo
(PaintPanel), sobre el cual dibuja la Tortuga, y un panel
de control (PadPanel) que envía instrucciones de dibujo a
la Tortuga. Notar que el panel de control nunca interactúa
directamente con el lienzo, si no que envía instrucciones a
la Tortuga para que esta realice el dibujo.
Gramática: Respecto a la gramática de Tortuga2, esta se
ha desarrollada según las especificaciones ANTLR.
Siguiendo el estilo de trabajo de ANTLR, la gramática se
encuentra separada en un archivo de tokens y un archivo
de producciones, ambos archivos son usados por ANTLR
para generar los componentes Lexer y Parser del módulo
Intérprete. El archivo de tokens de ANTLR TorLexer.g
es el siguiente:
lexer grammar TorLexer;
@lexer::header {
package flu0.Tortuga;
}
FW : 'ad';
BW : 'at';
RT : 'de';
LT : 'iz';
PEN : 'conlapiz';
NOPEN : 'sinlapiz';
GOTO : 'ir';
NUM : '0'..'9'+;
NEWLINE : '\r'? '\n';
WS : (' '|'\t')+ { skip(); };
Mientras que el archivo de producciones TorParser.g es
el siguiente (la producción de inicio es draw):
parser grammar TorParser;
options {
tokenVocab = TorLexer;
}
@header {
package flu0.Tortuga;
}
@members {
private Tortuga tortuga = new Tortuga();
}
draw : (instruc+ EOF | EOF);//regla de inicio
instruc : line (NEWLINE | EOF);
line : (move | turn | pen);
move : (fw | bw | gotoxy);
turn : (rt | lt);
fw : FW NUM {
tortuga.forward(Integer.parseInt($NUM.text));
};//acciones asociada a la regla fw.
bw : BW NUM {
tortuga.backward(Integer.parseInt($NUM.text));
};
rt : RT NUM {
tortuga.rightTurn(Integer.parseInt($NUM.text));
};
lt : LT NUM {
tortuga.leftTurn(Integer.parseInt($NUM.text));
};
pen : (
PEN { tortuga.pen(true); }
|
NOPEN { tortuga.pen(false); }
);
gotoxy : GOTO x=NUM y=NUM
{
tortuga.gotoxy(
Integer.parseInt($x.text),
Integer.parseInt($y.text)
);//acciones asociada al lápiz.
};
Descripción de la aplicación: La descripción se basa en
Figura 3 en donde se ejecuta la aplicación Tortuga2, y se
ha incluido el archivo de instrucciones cuadrado.txt.
Figura 3. Inicio de la Aplicación Tortuga2.
La sección izquierda de la pantalla (a) es el lienzo sobre el
cual la tortuga dibuja. La sección derecha (b) es el panel
de control, el que está dividido en 3 áreas:
1. Estado de la tortuga: Esta área indica el estado de la
tortuga. Se muestra la posición de la tortuga en el lienzo,
considerando la posición de origen (0,0) como la esquina
superior izquierda del lienzo, así como el ángulo en que la
tortuga se orienta, siendo medido desde la horizontal en
sentido anti-horario. En este caso, la Posición es: x: 249,
y:249, y con ángulo 90º.
2. Control de movimiento: Esta área permite controlar la
tortuga cuando se ha iniciado Tortuga2 sin un archivo de
instrucciones, o bien cuando ya se han procesado todas las
instrucciones del archivo:
i. Los botones Adelante y Atrás permiten mover la
tortuga en la dirección (ángulo, 90º) indicado por el
estado de la tortuga, y en la cantidad de pasos
ii.
iii.
iv.
(píxeles, 10) indicada en el campo que se encuentra
entre ambos botones.
Los botones Izquierda y Derecha cambian el sentido
de la tortuga, girándola en la dirección
correspondiente en la cantidad de grados indicada en
el campo que se encuentra entre ambos botones. En
nuestro ejemplo, 10.
El botón Lápiz controla e indica si la tortuga dibujará
su trayecto al moverse, o si se moverá sin dejar rastro
sobre el lienzo.
El botón Reset limpia completamente el lienzo y
ubica a la tortuga por defecto en el centro del lienzo
en dirección de 90 grados (“mirando hacia arriba”).
3. Consola: Permite visualizar las instrucciones y los
movimientos que va realizando la tortuga, ya sean los
definidos en el archivo de instrucciones o los realizados
por el usuario sobre el panel de control. La consola puede
limpiarse utilizando el botón Limpiar.
Experiencia 2: Las redes sociales son muy importantes
dentro de las actividades cotidianas de la sociedad, tales
como, publicar algún acontecimiento o intereses, sean
estos, hobbies, ocio, diversión, noticias, etc. Algunos
ejemplos de redes sociales son: MySpace, Facebook,
Twitter, Hi5, LiveJournal, Friendster, entre otros. En este
ámbito Internet ha jugado un rol importante en el aumento
considerable de la cantidad de datos viajando desde un
punto a otro. En esta segunda experiencia, el ámbito se
relaciona con la implementación de un editor e intérprete
de consulta en modo texto para el lenguaje SNQL 2.0
(Social Networks Query Language), el cual es un
subconjunto del Sistema SNDM (Social Networks Data
Model), [12]. Para fijar conceptos, SNQL corresponde al
conjunto de consultas y transformaciones para el lenguaje
SNDM. En general, SNDM es un modelo de base de dato
para el manejo y administración de los datos
correspondientes a redes sociales, mientras que SNQL,
proporciona una estructura de dato para representar y
almacenar redes sociales, y un lenguaje para consulta y
transformaciones en el ámbito de las redes sociales, cuyo
análisis y administración es un interesante problema por el
volumen de datos y por el factor de cambio que tienen los
datos. En este contexto, es que se implementó el sistema
SNDMS, (proyecto realizado hace un tiempo atrás por
alumnos de la Carrera de Ingeniería en Computación de la
Universidad de La Serena, [13]), que permite analizar y
administrar redes sociales. La problemática actual es
entonces actualizar la gramática SNQL a la versión SNQL
2.0. Para ello, se debió actualizar el intérprete para SNQL
2.0. La metodología usada es “dividir para conquistar”,
cuyos subproblemas son:
a) parser Patrón Simple,
b) parser Consulta SNQL 2.0,
c) editor y parser de consultas en modo texto para
SNQL 2.0,
d) Integración del módulo QE al sistema SNDMS.
El primer subproyecto fue implementar un parser para
poder compilar un patrón simple, que representa un
elemento de la red social. Se implementa el parser del
patrón simple utilizando ANTLR en el IDE Eclipse. Una
consulta SNQL sigue el estándar: CONSTRUCT–
WHERE– FROM.
- FROM: identifica la o las redes de origen.
-
WHERE: Incluye los patrones de extracción que
identifican las partes de la red de origen que son
relevantes para la consulta.
-
CONSTRUCT: define los patrones que serán
construidos como parte del resultado utilizando la
información recogida por los patrones de extracción.
Ejemplo: La consulta CONSTRUCT PC1 WHERE PE1 AND
PE2 FROM RedFotos, RedColegios, está realizada en
SNQL 2.0 y está constituida por los patrones de
Extracción PE1, PE2 y por el patrón de Construcción PC1.
AND
Figura 4. PE1 y PE2, corresponden al patrón de extracción,
mientras que PC1 corresponde al patrón de construcción, y
el conectivo AND que los asocia.
La gramática ANTLR propuesta es sólo un extracto de la
original, pues se pretende resaltar los elementos que
intervienen en el ejemplo.
lexerConsultaSNQL20.g
Análisis Léxico class Alex extends Lexer;
CONSTRUCT : "CONSTRUCT";
CONSTRUCT
SELECT : "SELECT";
WHERE : "WHERE";
WHERE
FROM : "FROM";
FROM
PATRON: "P"('A'..'Z')+('0'..'9');
PC1
PE1
PE2
FILTER: "FILTER";
SOCIALNETWORK : ('A'..'Z')('a'..'z')+;
RedFotos
RedColegios
AND: "AND";
AND
Análisis Sintáctico
CONSTRUCT <T> WHERE <PATT> FROM <S>
<T>::= <construct-patt>[ AS <sn-id>[,<constructpatt> AS <sn-id>]*]
<construct-patt> ::= <list-of-pattern-triples>
[IF <list-of-equalities>]
<list-of-equalities> ::= <expr> = <expr>
[AND <expr> = <expr>]*
<expr>
::=
<variable>
|
<constant>
|
<function>(<expr>[, <expr> ]*)
<list-of-pattern-triples> ::= {<pattern-triple>
[, (<pattern-triple>)]*}
<pattern-triple> ::= (term, term, term)
<term> ::= <variable> | <constant> | <expr> AS
..
.
<start-condition>
| AGG(<group-vars>,<aggr-func>,<extract-patt>)
<list-of-pattern-triples> ::= {<pattern-triple>
[, (<pattern-triple>)]*}
<pattern-triple> ::= (term, term, term)
<condition> ::= <logic-expression>
<term> ::= <variable> | <constant> | <expr> AS
<alias>
<expr>
::=
<variable>
|
<constant>
|
<function>(<expr>[, <expr> ]*)
<alias> ::= <variable> | <null>
<list-of-social-networks> ::= <social-network>[
AS <sn-id>
[, <social-network> AS <sn-id>]*]
<social-network> ::= <sn-id>
($R1,”isr”, “friendship”). Mientras que en c) se
aprecian los mensajes de error tras la compilación. Este
proceso de visualización del error se logra interviniendo
directamente el código que genera ANTLR para la
gramática, permitiendo tener un acceso a la
administración de éste. Para poder administrar y/o
gestionar el error se debe intervenir el archivo
asint.java (una vez que ANTLR lo haya generado) para
ingresarle las estructuras de datos y procedimientos para
la administración del error. Esto se debe realizar cada vez
que se compile la gramática desde Eclipse, por lo que se
recomienda intervenir el archivo una vez terminada la
compilación de la gramática y que ésta no posea ningún
error.
a)
b)
A continuación, se muestra la aplicación de la gramática
al ejemplo antes dado. El análisis léxico para los tokens
CONSTRUCT, WHERE, FROM, PE1, PE2, PC, RedFotos,
RedColegios que posee la consulta SNQL 2.0 se muestra
como sigue:
c)
<construct-patt> Æ <list-of-pattern-triples> Æ
{<pattern-triple> [, (<pattern-triple>)]*} Æ
<pattern-triple> Æ PC1 Æ (term, term, term)
<patt> Æ <extract-patt> AND <extract-patt> Æ
<PE1> AND <PE2> Æ (term, term, term)
AND (term, term, term)
<list-of-social-networks> Æ <social-network>[ AS
<sn-id>
[, <social-network> AS <sn-id>]*] Æ <socialnetwork> Æ RedFotos, RedColegios.
Una vez terminada la compilación de la consulta
SNQL2.0 y si esta compilación no posee errores se
procede a crear una representación interna la cual será
utilizada por el Sistema SNDMS para mostrar el
resultado. Cabe mencionar que otro aporte en esta
propuesta es la integración de la visualización del error
por pantalla, dándole al usuario la opción de corregir los
errores que pueda tener al crear, insertar, editar una
consulta SNQL 2.0.
En la Figura 5 se aprecian las fases en el proceso de
gestión de los errores. Estos son: a) fase de compilación,
en donde se le da el patrón de la consulta, en este caso,
CONSTRUCT PC1 WHERE PE2 FROM Friendship. En b)
se ven los integrantes del patrón básico, esto es,
($A1,”isa”,
“person”),
($A2,”isa”,
“city”),
Figura 5. a) módulo de compilar, b) Visualización del
patrón, c) Resultado de la compilación.
Experiencia 3: La Astronomía en Chile posee el 40% de
la observación astronómica del mundo, con la expectativa
de llegar a casi el 60%, la que se ha estado desarrollando
en la zona del Norte Grande, en particular la IV Región de
Coquimbo que posee una serie de condiciones climáticas
privilegiadas para el estudio, [16]. Ahora, la relación entre
la Astronomía y los DSL, surge con el proyecto ADQL
(Astronomical Dataset Query Language) [1], que es como
SQL (Structured Query Language), el cual otorga las
facilidades para consultar a una base de datos
astronómicos. Este lenguaje ha sido definido por IVOA
(International Virtual Observatory Alliance) [2]. Por otra
parte, con la librería pgSphere [5] es posible de incluir
acciones en las reglas de la gramática ADQL, entre ellas,
tipos de datos esféricos, funciones y operadores para
PostgreSQL. En esta tercera y última actividad el ámbito
de aplicación se relaciona con la intervención del lenguaje
ADQL, cuyo desarrollo está basado sobre SQL92. Para
fijar el contexto de la actividad, la astronomía ha visto un
crecimiento exponencial en la cantidad de datos
capturados por los más modernos instrumentos.
Actualmente, las cantidades que se manejan son terabytes
e incluso petabytes de datos por noche de observación en
los centros más modernos del mundo, tales como Kitt
Peak National Observatory (KPNO) [3, 18], Cerro Tololo
Inter-American Observatory (CTIO) y algunos consorcios
como WIYN, SOAR y SMARTS, con el fin de
procesarlos de manera inteligente para generar
información de calidad, útil para astrónomos y comunidad
en general. Y es en este contexto que se plantean
interrogantes como por ejemplo, ¿Cómo asignar
algoritmos para clasificar fenómenos que se descubren en
las observaciones?, ¿Cómo asignar algoritmos de
seguimiento a asteroides o cometas, o para seguir el
propio movimiento de las estrellas?. o la clasificación de
taxonomías y ontologías astronómicos, minería de datos,
aprendizaje automático y visualización, entre otros. Estos
son algunos ejemplos y temáticas que considera la
Astroinformática para enfrentar una gran diversidad de
problemas en los proyectos astronómicos, [15].
En particular, uno de los objetivos de esta actividad es
proporcionar acceso a los datos almacenados, así como,
realizar una consulta ADQL y obtener una respuesta a esa
consulta. Una consulta ADQL puede ser como por
ejemplo, seleccionar las primeras 100 filas dentro de las
coordenadas ecuatoriales ra(10.352, 11.017) y dec
(41.019, 41.519), coordenadas del sistema FK5 [17].
Figura 6. Un ejemplo del listado usado por los telescopios
de Kitt Peak.
El FK es una serie de seis catálogos astronómicos (FK5 es
una de ellas) de datos de alta precisión posicional de una
pequeña selección de estrellas que definen el marco de
referencia celestial de éstas, el cual es básicamente un
sistema estándar de coordenadas celestes, según se aprecia
en Figura 6.
/* se usan 2 columnas de la tabla "voi.sap":
"ra" y "dec".*/
SELECT * FROM voi.siap WHERE ((ra >= 10.352 AND
ra <= 11.017) AND (dec >= 41.019 AND dec <=
41.519)) LIMIT 100
Dado que el servicio de ADQL está abierto al mundo, se
debe procurar que la consulta ingresada sea válida para
señalar algún error de sintaxis y también disminuir o
eliminar posibles ataques a través de inyección SQL, [4].
Por lo tanto, debemos verificar la sintaxis de la consulta y
en caso de error indicar donde este ocurre. Finalmente, si
la consulta es válida, entonces debe ser traducida a SQL
entendible por nuestra base de datos Postgres aplicando
funciones geométricas definidas en la librería PgSphere.
PgSphere proporciona tipos de datos esféricoa, funciones,
y operadores para PostgreSQL. Se ha usado ANTLR, pues
proporciona un marco para construir un apropiado
reconocedor para ADQL y así definir una gramática que
llamamos SSQL S(hort)SQL para verificar la consulta
ingresada por el usuario. Esta gramática incluye reglas
comunes para SQL y algunas específicas para nuestra
implementación. No se implementa la especificación
completa de ADQL ya que sólo requerimos unas cuantas
funciones.
A continuación se muestra una parte de la gramática, y las
reglas comunes para SSQL:
// S(hort)SQL Grammar
grammar SSQL;
options {
ASTLabelType = CommonTree ;
language = Ruby ;
memoize = true ;
output = AST ;
backtrack = true ;
}
// Palabras reservadas
tokens {
ALL ;
AND ;
..
DISTINCT ;
..
//math
CEILING ;
DEGREES ;
..;
//trig
SIN ;
COS ;
..;
//aggregate
MAX ;
MIN ;
SUM ;
AVG ;
COUNT ;
// pgsphere
SBOX ;
}
// algunas reglas
statement : select_statement (SEMICOLON)? EOF ;
select_statement : query_expression ;
query_expression : sub_query_expression
sub_query_expression : query_specification |
LPAREN query_expression RPAREN ;
query_specification
:
select_clause (from_clause)? (where_clause)?
(group_by_clause)?
(having_clause)?
(order_by_clause)?
(limit_clause)? (offset_clause)?
;
select_clause
scope {
all_or_distinct;
selection_list;
}
Con estas reglas básicas, la gramática es capaz de
verificar consultas tales como, seleccionar las primeras
100 filas ordenadas por fecha de lanzamiento para
coordenadas ecuatoriales específicas, para un determinado
telescopio e instrumento y para el astrónomo “fuentes”:
SELECT * FROM voi.siap WHERE (((ra >= 10.353 AND
ra <= 11.017) AND (dec >= 41.019 AND dec <=
41.519))
AND
dtpi
ILIKE
'%fuentes%'
AND
(proctype = 'Raw')) AND ((telescope = 'ct4m' AND
instrument = 'decam')) ORDER BY release_date
LIMIT 100
Una función de interés es la que expresa una caja (“box”).
Un “box” es un caso especial de Polygon, que
corresponde semánticamente a STC Box, [6]. Un ejemplo
clásico de la selección de un punto con coordenadas en la
caja de rango entre -10° y +10° de latitud 350° y 10° en
longitud, respectivamente.
SELECT sbox '( (350d,-10d), (10d,+10d) )';
A continuación se muestra la regla para la función SBOX:
sbox_condition
:
SBOX SQUOTELPAREN spherical_coor SQUOTERPAREN
spherical_index
;
spherical_coor : spherical_point COMMA
spherical_point ;
spherical_point
:
LPAREN number COMMA number RPAREN
| LPAREN number 'd' COMMA number 'd' RPAREN
;
spherical_index : TILDE identifier ;
Con estas reglas, la gramática puede reconocer una
consulta tal como, seleccionar las primeras 100 filas para
el espacio determinado por la caja con coordenadas
específicas:
SELECT * FROM voi.siap WHERE
sbox '((17.0d,89.9d),(59.9d,0.0d))' ~ fk5coords
Sin embargo, es posible considerar algunos otros
sistemas, entre ellos, el estándar ICRS (International
Celestial Reference System) adoptado por la IAU
(International Astronomical Union). La siguiente consulta
expresa un box de 10º centrada en la posición en grados
(25.4,
definida de acuerdo al sistema de
ICRS con la posición referenciada
-20.0)
coordenadas
GEOCENTER:
SBOX(‘ICRS GEOCENTER’, 25.4, -20.0, 10, 10).
Durante el proceso de reconocimiento, la gramática
genera adicionalmente una serie de objetos por cada
cláusula, por lo tanto se puede inyectar una serie de
verificaciones o reglas programáticamente, como por
ejemplo, verificar si una columna existe o si una
condición en particular fue agregada o restringir la
cantidad de filas en la respuesta, esto es agregando un
rango al límite. Todas estas posibilidades pueden ser
configurables, de esta manera se otorga una mayor
flexibilidad a la gramática. Adicionalmente, si ocurre
algún error durante el reconocimiento, éste debe ser
alertado dando una descripción clara del error y la
posición de este.
Por ejemplo, la siguiente regla que reconoce una columna
desde la cláusula SELECT, y crea un nuevo objeto que
representa a esa columna. La clase verificará la
consistencia con la base de datos. Si la columna existe
entonces la gramática continuará con el reconocimiento,
de lo contrario parará en esta línea.
(column) => column {
$select_item::selection_item =
VORuby::SQL::AliasSelectionItem.new($select_item
::column_str, @alias_global);
}
También, se puede verificar la existencia de una columna
requerida, ya sea porque es utilizada en las condiciones de
la consulta o esta puede ser utilizada para calcular ciertos
valores después de obtener la respuesta. Por ejemplo, si
un astrónomo quiere obtener todas sus observaciones
realizadas la noche anterior, entonces, las columnas que
identifica al astrónomo y la fecha de observación deben
estar presentes en la consulta:
SELECT
reference,
release_date,
start_date,
date_obs, dtpi, ra, dec, telescope, instrument
FROM voi.siap WHERE date_obs = '2013-05-14' AND
dtpi ILIKE '%fuentes%' LIMIT 10000
Finalmente, si el reconocimiento es terminado
satisfactoriamente, entonces la consulta es ejecutada en la
base de datos. Traducir ADQL a SQL depende totalmente
de la base de datos que se esté utilizando y también como
se manejan las funciones geométricas. Este es el motivo
por lo que se debe implementar el traductor dependiendo
de los requerimientos propios de cada sistema. Para
terminar, cada base de datos maneja la información
geométrica de diferente forma. Por otro lado PgSphere [5]
proporciona una excelente implementación para las
funciones geométricas definidas en ADQL.
CONCLUSIONES
Este trabajo ha permitido constatar que en estos tres
ámbitos, los que en primer momento pudiesen parecer tan
disímiles, pero en rigor desde el punto de vista del estudio y
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
cercanos y coincidentes. La propuesta muestra que siempre
existe la posibilidad de “reencantar” a los alumnos de
pregrado en temas tan teóricos y/o clásicos como son los
lenguajes formales, con la incorporación de conocer y
resolver problemas reales, como fue en estos 3 casos. La
ventaja de esta propuesta, vista en estos tres aspectos, es
decir, desde alumno regular, memorista y profesional, nos
muestra que nuestros egresados pueden incorporarse al
ámbito laboral con las capacidades para proponer
soluciones. Desde el punto de vista de los aprendizajes, se
puede afirmar que los estudiantes, egresados y titulados
pudieron revisar y recrear los conceptos y
especificaciones de las gramáticas según la jerarquía
Chomsky en un contexto más aplicado, como es el que se
propone. Respecto a los DSL, bien podemos afirmar que
un usuario familiarizado con el dominio del lenguaje en
algún contexto puede obtener mejores y más rápidos
resultados utilizando una semántica de dominio conocida.
Por todo lo anterior se hace necesario, oportuno y factible
el promover y recomendar el estudio de los DSL, manejo
de herramientas, tales como ANTLR y otros similares, en
una carrera de pregrado.
AGRADECIMENTOS
Se agradece a Dr. Mauro San Martin, por la participación
como profesor guía en la memoria de título que dio origen a
un segmento de este trabajo, (experiencia 2).
REFERENCIAS
[1] Inaki Ortiz, Jeff Lusted, Pat Dowler, Alex ander
Szalay, Yuji Shirasaki, Maria A. Nieto-Santisteban,
Masatoshi Ohishi, William O’Mullane, Pedro Osuna,
the VOQL-TEG and the VOQL Working Group.
IVOA Astronomical Data Query Language, Version
2.0, IVOA Recommendation 30 Oct 2008.
http://www.ivoa.net/documents/REC/ADQL/ADQL20081030.pdf. Fecha de Consulta, 30 Junio 2013.
[2] IVOA Astronomical Data Query Language:
http://www.ivoa.net/documents/latest/ADQL.html.
Fecha Consulta: 30 Junio 2013.
[3] NOAO
Data
Archives:
http://ast.noao.edu/data/archives. Fecha Consulta: 30
Junio 2013.
[4] Inyección
SQL:
http://en.wikipedia.org/wiki/SQL_injection.
Fecha
Consulta: 30 Junio 2013.
[5] PgSphere 1.1, http://pgsphere.projects.pgfoundry.org/
Fecha de Consulta, 30 Junio 2013.
[6] STC-X: Space-Time Coordinate Metadata for the
Virtual
Observatory
Version
1.33.
http://www.ivoa.net/Documents/cover/STC20071030.html Fecha Consulta: 30 Junio 2013.
[7] ANTLRv4. http://www.antlr.org/. Fecha de consulta:
30 Junio 2013.
[8] J. Bovet, T. Parr. ANTLRWorks: an ANTLR
grammar development environment. Software:
Practice and Experience, 38(12): 1305-1332, 2008.
[9] T. Parr: The Definitive ANTLR Reference: Building
Domain-Specific Languages. Raleigh: The Pragmatic
Bookshelf, 2007.
[10] M. Fowler, Domain-Specific Languages, October 3,
2010, ISBN-13: 978-0321-71294-3.
[11] D. Ghosh, DSLs in Action, Manning Publication,
2011, ISBN-13:978-1-935182-45-0.
[12] Barquin, R.A.,Gálvez O.A., Zumarán F.E. “Social
Network Data Management System (SNDMS)”.
Memoria de Título optar al título profesional de
Ingeniero em Computación, Universidad de La
Serena, La Serena, Chile. 2009.
[13] San Martin Mauro, Gutierrez C.,Wood Peter T.
Informe Técnico SNQL: Social Networks Query
Language. TR/DCC-2011-05. Departamento de
Ciencias de la Computación,Universidad de
Chile.2011.http://swp.dcc.uchile.cl/TR/2011/TR_DC
C-20110503-005.pdf
[14] Infonor-Chile,
2012,
http://www.infonorchile2012.uta.cl/ Fecha Consulta:
30 Junio 2013.
[15] The Revolution
in Astronomy Education
Fecha
http://arxiv.org/pdf/0909.3892v1.pdf.
Consulta: 30 Junio 2013.
[16] Atacama Large Millimeter/submillimeter Array
(ALMA), http://www.almaobservatory.org/ Fecha
Consulta: 30 Junio 2013.
[17] Fifth Fundamental Catalogue (FK5). http://wwwkpno.kpno.noao.edu/Info/Caches/Catalogs/FK5/fk5.h
tml. Fecha Consulta: 30 Junio 2013.
[18] Kitt
Peak
National
Observatory
(KPNO),
http://www.noao.edu/kpno/ Fecha Consulta: 30 Junio
2013.
[19] ACM.
Computing
Curricula
2005.
http://www.acm.org/education/education/curric_vols/
CC2005-March06Final.pdf. Fecha de consulta: 30
Junio 2013.
[20] Observatorio
Interamericano
Cerro
Tololo.
http://www.ctio.noao.edu/noao/ Fecha Consulta: 30
Junio 2013.

Documentos relacionados