IEEE-RITA Vol. 4, Núm. 3, Ago. 2009 175 Procesamiento de Documentos XML Dirigido por Lenguajes en Entornos de E-Learning Antonio Sarasa-Cabezuelo, José-Luis Sierra-Rodríguez, y Alfredo Fernández-Valmayor Title— Language-Oriented Processing of XML Documents in e-Learning Environments Abstract— This paper proposes the use of attribute grammars in order to systematize the processing of XML documents in e-Learning environments. For this purpose, it presents XLOP (XML Language-Oriented Processing), an XML processing environment based on this technique. It also illustrates how XLOP is used in two different e-Learning contexts: languagedriven production of educational applications, and processing of metadata documents for reusable learning objects. Index Terms— XML processing, Socratic Tutorial, Learning Objects, Metadata, Attribute Grammar I. INTRODUCTION X ML es el formato de representación e intercambio básico utilizado en la práctica totalidad de los escenarios de e-Learning. Como ejemplo representativo de la importancia que cobra XML en el dominio de e-Learning puede examinarse cualquiera de los actuales esfuerzos estandarizadores, donde, aparte de proponerse modelos de información para representar aspectos relevantes de los sistemas e-Learning (e.g., evaluaciones, diseños educativos, o perfiles de estudiante), también se proponen vinculaciones de dichos modelos con vocabularios XML específicos [5]. Por lo tanto, la implantación práctica de cualquier solución e-Learning implicará, desde el punto de vista tecnológico, una fuerte componente de procesamiento de documentación XML. De esta forma, el disponer de mecanismos que faciliten el desarrollo de dicha componente de procesamiento se convierte en un factor clave de dicha implantación. XLOP (XML Language-Oriented Processing) es un entorno que utiliza gramáticas de atributos para describir cómo procesar documentos XML marcados con un determinado vocabulario. Las gramáticas de atributos son un formalismo declarativo ampliamente utilizado en la descripción de la sintaxis, las restricciones contextuales (semántica estática), y A.Sarasa es miembro del Departamento de Sistemas Informáticos y Computación de la Universidad Complutense de Madrid. Email: asarasa@fdi.ucm.es. J.L.Sierra y A.Fernández-Valmayor son miembros del Departamento de Ingeniería del Software e Inteligencia Artificial de la Universidad Complutense de Madrid. Email: {jlsierra,Alfredo}@fdi.ucm.es DOI (Digital Object Identifier) Pendiente la traducción de los lenguajes informáticos [8][9]. De esta forma, XLOP sigue un paradigma dirigido por lenguajes en el desarrollo de los programas de procesamiento de documentos XML [3]. De acuerdo con este paradigma, dichos programas se entienden como procesadores de lenguaje, y el proceso de desarrollo en sí se entiende como el proceso de construcción y mantenimiento de dichos procesadores. De hecho, utilizando XLOP es posible generar automáticamente tales procesadores a partir de especificaciones de alto nivel expresadas como gramáticas de atributos. XLOP se ha diseñado para ser integrado con Java. Efectivamente, las funciones semánticas que se utilizan en las gramáticas de atributos XLOP se implementan como métodos en Java. De esta forma, XLOP ofrece una flexibilidad comparable a la de los marcos de procesamiento genéricos para XML (e.g., SAX, DOM, StAX, etc.) [3], y, al mismo tiempo, un nivel de usabilidad comparable al de enfoques específicos (e.g., los ofrecidos por lenguajes de transformación como XSLT) [3]. De hecho, XLOP permite estructurar las aplicaciones de proceso de XML en dos capas perfectamente diferenciadas: - Una capa de lógica específica de la aplicación, que incluye la maquinaria necesaria para soportar la funcionalidad de dicha aplicación (e.g., un marco de aplicación para la representación interna de un tutor inteligente, o un conjunto de clases para el procesamiento de metadatos). - Una capa lingüística de procesamiento XML dirigido por la sintaxis. Esta capa se especifica como una gramática de atributos, especificación que se traduce automáticamente a una implementación ejecutable mediante un generador XLOP. La conexión entre ambas capas se realiza mediante una clase semántica, que implementa en Java las funciones semánticas utilizadas en la gramática de atributos XLOP, y que media entre las dos capas anteriores. De esta forma, el modelo de desarrollo dirigido por lenguajes de XLOP propugna la separación explícita de estas dos capas, así como facilita el desarrollo y el mantenimiento de la capa lingüística, ya que ésta se especifica a un nivel mucho más alto que el conseguido con una implementación directa en Java o en cualquier otro lenguaje de programación. De hecho, el formalismo de las gramáticas de atributos es también de más ISSN 1932-8540 © IEEE 176 IEEE-RITA Vol. 4, Núm. 3, Ago. 2009 SpecXLOP::= {Regla}+ Regla ::= +oTerminal ‘::=’ { ElementoSintactico }* '{' { Ecuacion }* '}' ElementoSintactico ::= +oTerminal | #pcdata | ElementoXML ElementoXML ::= EtiquetaApertura { ElementoSintactico }* EtiquetaCierre | EtiquetaElmVacio Ecuacion ::= ReferenciaAtributo '=' ExpresionSemantica ExpresionSemantica ::= Funcion '(' (ExpresionSemantica { , ExpresionSemantica }*)? ')' | ReferenciaAtributo ReferenciaAtributo ::= Atributo of ( +oTerminal | #pcdata | EtiquetaApertura) ( '(' +umeroOcurrencia ')' )? Figura 1. Sintaxis del lenguaje de especificación de XLOP. alto nivel que una descripción basada en esquemas de traducción [1], del tipo de los soportados por otros enfoques al procesamiento de XML dirigido por lenguajes (e.g., ANTXR [19], un entorno construido sobre la herramienta ANTLR, y RelaxNGCC [7], una extensión del lenguaje de esquema documental RelaxNG utilizada para especificar esquemas de traducción y que permite la generación automática de traductores recursivos descendentes [1]). En este artículo se describe el entorno XLOP, haciendo énfasis en su lenguaje de especificación, así como en su aplicación al procesamiento de XML en entornos de e-Learning. Para ello, en la sección II se comienza describiendo el entorno en sí. En la sección III se ejemplifica el uso del entorno en el desarrollo de un traductor para <e-Tutor>, un sistema para la producción de tutoriales socráticos. En la sección IV se ejemplifica su uso en la comprobación de restricciones sobre documentos de metadatos en Chasqui, un sistema para la creación de repositorios de objetos de aprendizaje en dominios especializados. Por último, en la sección V se resumen las conclusiones obtenidas, así como se esbozan algunas líneas de trabajo futuro. Este trabajo es una versión extendida de [11]. II. EL ENTORNO XLOP A. Gramáticas de Atributos XLOP se basa en el formalismo de las gramáticas de atributos. Este formalismo fue propuesto por Donald E. Knuth a finales de los sesenta como un mecanismo para añadir semántica a los lenguajes incontextuales [8][9]. Una gramática de atributos consta de: - Una gramática incontextual que caracteriza la sintaxis estructural del lenguaje mediante un conjunto de reglas sintácticas o producciones. - Un conjunto de atributos semánticos añadidos a los símbolos de la citada gramática. Estos atributos pueden ser de dos tipos: atributos sintetizados y atributos heredados. Los atributos toman valores en los nodos de los árboles sintácticos impuestos por la gramática incontextual sobre las sentencias. Los valores de los atributos sintetizados representan la semántica de los fragmentos de sentencia que penden de los nodos, mientras que los de los atributos heredados representan información de contexto. Los atributos sintetizados en un nodo se computan a partir de los sintetizados de sus hijos y de los propios atributos heredados del nodo. Por su parte, los atributos heredados se computan a partir de los sintetizados de los hermanos y de los heredados del padre. - Un conjunto de ecuaciones semánticas para cada producción. Estas ecuaciones indican cómo computar los valores de los atributos sintetizados de la cabeza y de los atributos heredados de los símbolos del cuerpo. Para ello aplican funciones semánticas sobre los atributos utilizados en dicho cómputo. El axioma de la gramática también puede tener atributos heredados. Así mismo, los terminales también pueden tener atributos sintetizados, que se denominan atributos léxicos. Los valores de estos atributos se fijarán externamente (e.g., los atributos léxicos se fijarán durante el análisis léxico). Durante la preparación de una gramática de atributos no es necesario especificar explícitamente en qué orden tienen que aplicarse las ecuaciones semánticas para encontrar los valores de los atributos en los árboles sintácticos (es decir, para evaluar dichos atributos). De esta forma, las gramáticas de atributos son mecanismos descriptivos de más alto nivel que los esquemas de traducción soportados por las herramientas típicas de construcción de procesadores de lenguaje (e.g., JavaCC, ANTLR, YACC, o CUP), en los que sí es necesario explicitar el orden de ejecución de las acciones semánticas. Por el contrario, en una gramática de atributos el orden de evaluación se deriva de las dependencias entre los atributos introducidas por las ecuaciones semánticas. El método de evaluación en sí puede ser estático o dinámico. Los métodos estáticos analizan la gramática durante la generación del evaluador para encontrar un orden de evaluación que funciona para cualquier sentencia. Por su parte, los métodos dinámicos deciden el orden de evaluación para cada sentencia particular. En XLOP se adopta un método de evaluación dinámica, ya que los métodos dinámicos aceptan una clase más amplia de gramáticas de atributos que los estáticos, aún a consta de una ligera pérdida de eficiencia. B. El Lenguaje de Especificación de XLOP El lenguaje de especificación de XLOP es un metalenguaje para describir gramáticas de atributos para lenguajes de marcado definidos mediante XML. La Figura 1 muestra la sintaxis de este lenguaje. La gramática incontextual subyacente a una especificación XLOP representa la estructura lógica de un tipo de documentos XML (los detalles de más bajo nivel relativos a la estructura física del documento se ignoran, ya que estos serán tratados por entornos de análisis de XML convencionales [3]). ISSN 1932-8540 © IEEE SARASA-CABEZUELO et al.: PROCESAMIENTO DE DOCS. XML DIRIGIDO POR LENGUAJES Como puede observarse en la Figura 1, las gramáticas XLOP pueden incluir los siguientes tipos de símbolos terminales: - El símbolo #pcdata. Este símbolo denota un fragmento de contenido textual en el documento procesado. - Etiquetas de apertura (e.g., <Tutorial>) y de cierre (e.g., </Tutorial>). Estas etiquetas dependerán del lenguaje particular que se está procesando, y deberán, así mismo, ser convenientemente anidadas. Así mismo, las gramáticas XLOP pueden contener los símbolos no terminales que se consideren necesarios para representar de manera apropiada el resto de la estructura lógica del lenguaje de marcado a procesar. En lo que se refiere a los atributos léxicos, el símbolo #pcdata soporta únicamente un atributo léxico: text. El valor de este atributo será el contenido textual particular representado por el símbolo. Las etiquetas de apertura pueden tener también atributos léxicos, que se denominarán atributos de elemento, y que se corresponderán con los atributos que se especifican explícitamente en los elementos del documento. Por último, los símbolos no terminales pueden tener atributos sintetizados y heredados arbitrarios. En XLOP no es preciso distinguir explícitamente qué atributos son los sintetizados y cuáles los heredados, sino que este hecho se infiere del uso de los mismos en las ecuaciones. Por último, obsérvese que en la referencia a los atributos, que se lleva a cabo utilizando una notación del tipo atributo of refSímbolo, es posible utilizar un número de orden a fin de desambiguar el símbolo concreto al que pertenece el atributo, cuando éste aparezca más de una vez en la producción. Finalmente, es importante notar que el lenguaje XLOP no proporciona mecanismos para definir las funciones semánticas utilizadas en las ecuaciones. Dichas funciones deberán ser definidas externamente, como métodos de la clase semántica. C. El Generador en XLOP XLOP incluye un generador que, tomando como entrada una gramática descrita en el lenguaje de especificación de XLOP, produce una implementación del procesador asociado escrita en CUP [2]. CUP es un sistema de generación de Generador XLOP Documento XML a Procesar Especificación XLOP Procesador 177 embebe en el proceso de análisis sintáctico mediante un mecanismo de ejecución retardada, según el cuál la evaluación de las ecuaciones semánticas se hace depender de la disponibilidad de valores para los atributos que intervienen en las expresiones semánticas correspondientes (véase [12] para más detalles del mecanismo). La ejecución de los procesadores generados requiere, además, la clase semántica que implementa las funciones semánticas, los componentes que conforman la lógica específica de la aplicación, y también una serie de clases de conveniencia que configuran el entorno de ejecución XLOP. Entre éstas últimas destaca la implementación de un analizador léxico genérico que transforma el recorrido de la estructura lógica de los documentos (en orden documental) en la secuencia de componentes léxicos esperada por el procesador generado. Este componente conecta con un marco estándar de análisis de documentos XML basado en SAX (un API para el procesamiento al vuelo de documentos XML) [3]. El componente en sí y la estrategia de interconexión con el parser SAX son análogos a los descritos en [10]. La Figura 2 resume la cadena de generación implementada en XLOP. III. PRODUCCIÓN DIRIGIDA POR LENGUAJES DE APLICACIONES EDUCATIVAS: <E-TUTOR> A. Generación de tutoriales con <e-Tutor> En esta sección se ejemplifica el uso de XLOP en el desarrollo de una versión simplificada de <e-Tutor> [13][14][16][17], un sistema para el desarrollo de tutores socráticos basado en los trabajos seminales de Alfred Bork y su equipo durante los ochenta [4]. Este tipo de sistemas fue muy popular durante las dos últimas décadas del siglo pasado, y, a pesar de las críticas recibidas acerca de su idoneidad pedagógica y de la dificultad de su producción y mantenimiento, aún hoy existe una comunidad muy activa trabajando en estos temas, así como iniciativas tan interesantes como las descritas en [20]. Así mismo, el funcionamiento de este tipo de sistemas está en la base de los mecanismos de adaptación de las últimas versiones de especificaciones e-Learning tan relevantes como QTI [6]. En cualquier caso, el papel jugado por <e-Tutor> no es tanto pedagógico como tecnológico, a fin de permitir experimentar con distintos métodos, técnicas y herramientas de producción y mantenimiento de aplicaciones e-Learning (e.g., desarrollo Implementación en CUP java Generador CUP Implementación en JVM Implementación en Java Clase semántica y entorno de ejecución XLOP Piensa en el nombre del país … ¿Cuál es la capital de Brasil? (1) javac (1) ¡No! Esa es dónde los carnavales ;) Figura 2. Cadena de generación en XLOP traductores para Java que soporta gramáticas LALR(1), la clase de gramáticas más expresiva para la que es posible generar analizadores sintácticos compactos y eficientes. En la implementación CUP generada, la evaluación de atributos se Brasilia Río de Janeiro (2) ¡No! La respuesta correcta es Brasilia Otra ¡No! Piensa en el nombre del país… ISSN 1932-8540 © IEEE (1) ¡Eso es! Vamos con otra pregunta (2) Prueba con otra… Figura 3. Fragmento de un tutorial socrático 178 IEEE-RITA Vol. 4, Núm. 3, Ago. 2009 <!ELEMENT Tutorial (Start,(Speech|Question|Answer|Feedback)+, End)> <!ELEMENT Start EMPTY> <!ATTLIST Start next IDREF #REQUIRED> <!ELEMENT Speech (#PCDATA)> <!ATTLIST Speech id ID #IMPLIED next IDREF #REQUIRED> <!ELEMENT Question (#PCDATA)> <!ATTLIST Question id ID #REQUIRED> <!ELEMENT Answer (#PCDATA)> <!ATTLIST Answer id ID #REQUIRED forQuestion IDREF #REQUIRED default (yes|no) "yes"> <!ELEMENT Feedback EMPTY> <!ATTLIST Feedback counter NMTOKEN #REQUIRED forAnswer IDREF #REQUIRED speech IDREF #REQUIRED> <!ELEMENT End EMPTY> <!ATTLIST End id ID #REQUIRED> Figura 4. DTD para el lenguaje de <e-Tutor>. <Tutorial> <Start next="..."/> ... <Question id="q1"> ¿Cuál es la capital de Brasil</Question> <Answer id="a11" forQuestion="q1"> Brasilia</Answer> <Answer id="a12" forQuestion="q1"> Río de Janeiro</Answer> <Answer id="a13" forQuestion="q1" default="yes"/> <Feedback counter="1" forAnswer="a11" speech="s1"/> <Feedback counter="1" forAnswer="a12" speech="s2"/> <Feedback counter="2" forAnswer="a12" speech="s4"/> <Feedback counter="1" forAnswer="a13" speech="s5"/> <Feedback counter="2" forAnswer="a13" speech="s4"/> <Speech id="s1" next="..."> ¡Eso es! Vamos con otra pregunta</Speech> <Speech id="s2" next="s3"> ¡No! Esa es dónde los carnavales ;)</Speech> <Speech id="s3" next="q1"> Piensa en el nombre del país...</Speech> <Speech id="s4" next="s5"> ¡No! La respuesta correcta es Brasilia</Speech> <Speech id="s5" next="..."> Prueba con otra...</Speech> <Speech id="s6" next="q1"> ¡No! Piensa en el nombre del país...</Speech> ... <End id="..."/> </Tutorial> Figura 5. Codificación XML del fragmento de tutorial de la Figura 3 documental, siguiendo un enfoque precursor de XLOP [17], desarrollo de aplicaciones web educativas dirigido por lenguajes [13][14], o prototipado rápido de lenguajes de modelado educativo [16]). <e-Tutor> interpreta descripciones de tutoriales en los cuáles el estudiante se somete a problemas, para los cuáles construye soluciones a través de un diálogo socrático (maestro – discípulo). El sistema analiza las respuestas del estudiante a las preguntas planteadas, proporciona al mismo una realimentación apropiada, y decide el próximo paso a llevar a cabo en el proceso de aprendizaje. La realimentación dada se puede adaptar a distintos itinerarios de aprendizaje. En el caso más general el proceso de adaptación podría depender de la historia completa de la interacción del estudiante con el sistema, aunque en <e-Tutor> se adopta un mecanismo simple basado en contadores, al estilo de los trabajos de Bork. El sistema asocia contadores a cada posible respuesta de cada pregunta. Cada vez que el estudiante da una respuesta, incrementa el contador asociado. De esta forma, la realimentación y el siguiente paso a dar pueden depender del valor de dichos contadores. La Figura 3 muestra esquemáticamente un ejemplo de este tipo de tutorial. Las cajas con esquinas redondeadas representan puntos de respuesta, donde el alumno debe proporcionar una respuesta a la pregunta realizada. Dichos puntos de respuesta están conectados con potenciales respuestas, que se encierran en una caja compartimentada. Las cajas sombreadas representan las realimentaciones. El flujo de aprendizaje se representa mediante flechas. Las etiquetas numéricas en las flechas que unen compartimentos de respuestas con realimentaciones indican los valores que deben tomar los contadores para que las flechas sean aplicables. <e-Tutor> incluye un lenguaje de marcado basado en XML para describir tutoriales como documentos XML, que, debidamente procesados, permiten ejecutar dichos tutoriales. La DTD de la Figura 4 muestra una versión simplificada de Tutorial next start * <<interface>> TElement 0..1 Speech Question * Answer End for for speech * feedback Figura 6. Esbozo de la capa de lógica específica de la aplicación en <e-Tutor> dicho lenguaje XML (la simplificación omite detalles estructurales y presentacionales irrelevantes; véase [17] para una versión más detallada). La Figura 5 muestra una representación XML del fragmento de tutorial de la Figura 3. A continuación se describe brevemente la refactorización de <e-Tutor> utilizando XLOP. B. La Capa de Lógica Específica de la Aplicación La Figura 6 muestra las principales componentes (clases e interfaces) que configuran esta capa, así como sus interrelaciones. Estos componentes constituyen un marco de aplicación para la representación de tutoriales. Dado que en este artículo se está presentando una versión simplificada de ISSN 1932-8540 © IEEE SARASA-CABEZUELO et al.: PROCESAMIENTO DE DOCS. XML DIRIGIDO POR LENGUAJES 179 Tutorial ::= <Tutorial> <Start/> TElements <End/> </Tutorial> { finalUnlinkedTutorialh of TElements = addStartAndEnd(next of <Start>, id of <End>, unlinkedTutorial of TElements) tutorial of Tutorial = tutorial of TElements } TElements ::= TElements TElement { unlinkedTutorial of TElements(0) = addElement(element of TElement, unlinkedTutorial of TElements(1)) finalUnlinkedTutorialh of TElements(1) = finalUnlinkedTutorialh of TElements(0) tutorial of TElements(0) = link(element of TElement,tutorial of TElements(1)) } TElements ::= TElement { unlinkedTutorial of TElements = addElement(element of TElement,newTutorial()) tutorial of TElements(0) = link(element of TElement,finalUnlinkedTutorialh of TElements) } TElement ::= <Speech> #pcdata </Speech> { element of TElement = newSpeech(id of <Speech>,next of <Speech>,text of #pcdata) } TElement ::= <Question> #pcdata </Question> { element of TElement = newQuestion(id of <Question>,next of <Question>,text of #pcdata) } TElement ::= <Answer> #pcdata </Answer> { element of TElement = newAnswer(id of <Answer>,forQuestion of <Answer>,default of <Answer>, text of #pcdata) } TElement ::= <Feedback/> { element of TElement = newFeedback(counter of <Feedback>,forAnswer of <Feedback>, speech of <Feedback>) } Figura 7. Especificación XLOP de la capa lingüística de <e-Tutor>. <e-Tutor>, este marco es una versión simplificada del más detallado descrito en [17]. C. La Capa Lingüística La capa lingüística queda definida por la especificación XLOP que se muestra en la Figura 7. Dicha capa lingüística traduce descripciones XML de tutoriales en instanciaciones del marco de aplicación de la Figura 6. La gramática incontextual subyacente representa el mismo lenguaje de marcas expresado por la DTD de la Figura 4. La diferencia es que esta gramática incontextual impone una estructura bien definida sobre los contenidos de los elementos (más concretamente, especifica la secuencia de elementos del tutorial mediante un no terminal TElements, y utiliza recursión a izquierdas en las producciones que definen dicho no terminal, ya que este tipo de recursión es tratada de forma muy eficiente por los analizadores LR subyacentes a la implementación de XLOP). Mientras que dicha estructura no es relevante a nivel de la validación genérica de un documento XML con respecto a su DTD o su esquema, la estructura en sí es fundamental para añadir significado al lenguaje. Por su parte, la traducción se concibe en dos etapas: una etapa de creación de los componentes del tutorial, y otra etapa de enlace de dichos componentes. De esta forma: - La etapa de creación se lleva a cabo asociando un atributo sintetizado unlinkedTutorial con TElements (la secuencia de elementos del tutorial). Este atributo se utiliza para construir un tutorial en el que los elementos aún no están conectados. Cada elemento en sí se sintetiza mediante un atributo element en TElement (categoría sintáctica que representa cada elemento individual). - La etapa de conexión supone propagar el tutorial no conectado a lo largo de la secuencia de elementos. Esto se consigue asociando un atributo heredado finalUnlinkedTutorialh con TElements. Así mismo, esta etapa supone también sintetizar el tutorial final, conectando cada elemento al resto. Esto se consigue asociando un atributo sintetizado tutorial con public class TSemClass { ... public Tutorial link(TElement e,Tutorial t) { String idnext = e.idNext(); if (idnext != null) e.setNext(t.get(idnext)); return t; } ... } Figura 8. Fragmento de la clase semántica para <e-Tutor> que muestra la implementación de la función semántica link. TElements, así como con Tutorial representará el tutorial finalmente construido). (éste D. La Clase Semántica Por último, es necesario proporcionar la clase Java que implementa las funciones semánticas utilizadas en la especificación XLOP. En el caso de <e-Tutor>, dichas funciones instanciarán clases del marco de aplicación, e invocarán a métodos sobre los objetos resultantes para conectar los mismos. La Figura 8 esboza un fragmento de dicha clase, en el que se detalla la implementación de la función semántica link. Nótese que, aunque desde un punto de vista estrictamente formal las funciones semánticas deberían estar libres de efectos laterales, en esta especificación particular los valores de los atributos de entrada a las funciones destructivas, como link, no volverán a utilizarse, lo que permite modificar destructivamente los valores (objetos Java) a los que se refieren. IV. PROCESAMIENTO DIRIGIDO POR LENGUAJES DE DOCUMENTOS DE METADATOS: CHASQUI A. Restricciones sobre metadatos en Chasqui En esta sección se ilustra el uso de XLOP para soportar un procesamiento no trivial de documentos de metadatos de objetos de aprendizaje en Chasqui. Chasqui es una plataforma ISSN 1932-8540 © IEEE 180 IEEE-RITA Vol. 4, Núm. 3, Ago. 2009 e-Learning que ha evolucionado a partir de varios sistemas web utilizados en la virtualización de dos museos universitarios con fines educativos en la Universidad Complutense (Museo de Historia de la Informática García Santesmases y Museo de Arqueología y Etnología Antonio Ballesteros) [18]. Actualmente es un sistema independiente de dominios concretos y reutilizable en toda experiencia <!ENTITY % Constraint "(And|Or|Not|Contains)"> <!ELEMENT And (%Constraint;,%Constraint;)> <!ELEMENT Or (%Constraint;,%Constraint;)> <!ELEMENT Not (%Constraint;)> <!ELEMENT Contains (It,Val)> <!ELEMENT It (#PCDATA)> <!ELEMENT Val (#PCDATA)> <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <Or> <Contains> <It>Descripción</It> <Val>gramática</Val> </Contains> <Contains> <It>Formalismo</It> <Val>gramática</Val> </Contains> </Or> Items (Item+)> Item (Name,Value)> Name (#PCDATA)> Value (#PCDATA)> Figura 9. Lenguaje de marcado (simplificado) para los documentos de metadatos Chasqui. <Items> <Item> <Name>Descripción</Name> <Value>Informe sobre gramáticas l-atribuidas</Value> </Item> <Item> <Name>Aspecto especificado</Name> <Value>semántica</Value> </Item> <Item> <Name>Formalismo</Name> <Value>gramáticas de atributos</Value> </Item> <Item> <Name>tipo de objeto</Name> <Value>informe</Value> </Item> </Items> Figura 11. Lenguaje de marcado (simplificado) para las restricciones sobre metadatos. Figura 12. Un ejemplo de restricción <Check> <Constraint> ... </Constraint> <Items> ... </Items> </Check> Figura 13. Esquema de la entrada al proceso de comprobación de restricciones. AssertionStore EResul +addAssertion(String i, String v) +boolean checkAssertion(String i, String v) +boolean yields(String i, String v) +boolean valueOf() +SIterator newIterator() +int supportSize() SIterator Figura 10. Un documento de metadatos. e-Learning que involucre la creación y uso educativo de repositorios de objetos de aprendizaje. Los objetos de aprendizaje en Chasqui tienen asociados documentos XML de metadatos que describen la asignación de valores a ítems de metadatos1 organizados jerárquicamente. Tales ítems no están predeterminados a priori, sino que se crean de manera colaborativa, conforme se añaden nuevos objetos al repositorio, en un enfoque próximo a las tendencias emergentes en etiquetado colaborativo en el contexto de los escenarios Web X.0 (véase [15] para más detalles). A fin de evitar detalles que nos aparten del principal propósito de este trabajo, en la discusión que sigue omitiremos la naturaleza jerárquica de los ítems de metadatos en Chasqui. De esta forma, la DTD que se muestra en la Figura 9 describe (una versión simplificada de) el lenguaje de marcado utilizado en Chasqui para estructurar los documentos de metadatos. De acuerdo con este lenguaje, cada ítem de metadatos posee un nombre (Name) y un valor (Value). Los documentos en sí son secuencias de estos ítems. La Figura 10 muestra un ejemplo de documento de metadatos. El carácter abierto y evolutivo de los metadatos en Chasqui hace necesario introducir algunos mecanismos de control a fin 1 En Chasqui los ítems de metadatos se denominan atributos. No obstante, en este trabajo evitaremos tal denominación para evitar confusiones. +next() +String item() +String value() produces Figura 14. Lógica específica de la aplicación para la comprobación de restricciones en documentos de metadatos Chasqui. de garantizar la calidad y consistencia de los documentos de metadatos. Para tal fin, los instructores que lideran la construcción del repositorio de objetos de aprendizaje pueden imponer restricciones sobre los documentos asociados con los objetos que se añaden al repositorio. De esta forma, cuando los alumnos añadan nuevos objetos, el sistema podrá chequear dichas restricciones, así como avisar a dichos alumnos de las potenciales violaciones de las mismas. En Chasqui las restricciones que pueden formularse involucran un repertorio completo de asertos básicos, que pueden combinarse utilizando los operadores booleanos habituales (and, or y not). Por motivos de simplicidad, restringiremos nuestra discusión a asertos de tipo Contiene. Un aserto de tipo Contiene obliga a que cada ocurrencia de un ítem de metadatos dado contenga cierta cadena especificada en el aserto. En Chasqui las restricciones también se representan internamente utilizando un lenguaje de marcado basado en XML. La Figura 11 muestra la DTD de dicho lenguaje. La ISSN 1932-8540 © IEEE SARASA-CABEZUELO et al.: PROCESAMIENTO DE DOCS. XML DIRIGIDO POR LENGUAJES 181 CheckDoc ::= <Check><Constraint>C</Constraint> Is</Check> { basicAssertionsh of Is = basicAssertions of C checkedBasicAssertionsh of C = checkedBasicAssertions of Is val of CheckDoc = val of C basicAssertions of CheckDoc = checkedBasicAssertions of Is} C ::= <And> C C </And> { basicAssertions of C(0) = comb(basicAssertions of C(1),basicAssertions of C(2)) checkedBasicAssertionsh of C(1) = checkedBasicAssertionsh of C(0) checkedBasicAssertionsh of C(2) = checkedBasicAssertionsh of C(0) val of C(0)= valOfAnd(val of C(1),val of C(2),checkedBasicAssertionsh of C(0))} C ::= <Or> C C </Or> { basicAssertions of C(0) = comb(basicAssertions of C(1),basicAssertions of C(2)) checkedBasicAssertionsh of C(1) = checkedBasicAssertionsh of C(0) checkedBasicAssertionsh of C(2) = checkedBasicAssertionsh of C(0) val of C(0)= valOfOr(val of C(1),val of C(2),checkedBasicAssertionsh of C(0))} C ::= <Not> C </Not> { basicAssertions of C(0) = basicAssertions of C(1) checkedBasicAssertionsh of C(1) = checkedBasicAssertionsh of C(0) val of C(0) = valOfNot(val of C(1))} C ::= <Contains> <Attr>#pcdata</Attr> <Val>#pcdata</Val> </Contains> { basicAssertions of C = newCons(text of #pcdata(0),text of #pcdata(1)) val of C = valOfC(text of #pcdata(0),text of #pcdata(1), checkedBasicAssertionsh of C)} Is ::= <Items> IList</Items> { basicAssertionsh of IList = basicAssertionsh of Is checkedBasicAssertions of Is = checkedBasicAssertions of IList } IList ::= IList I { basicAssertionsh of IList(1) = basicAssertionsh of IList(0) checkedBasicAssertions of IList(0) = check(checkedBasicAssertions of IList(1),item of I,val of I) } IList ::= I { checkedBasicAssertions of IList = check(basicAssertionsh of IList, item of I,val of I) } I ::= <Item> <Name>#pcdata</Name> <Value>#pcdata</Value> </Item> { item of I = text of #pcdata(0) val of I = text of #pcdata(1) } Figura 15. Especificación XLOP de la capa lingüística para la comprobación de restricciones sobre metadatos en Chasqui. Figura 12, por su parte, muestra un ejemplo de restricción que fuerza a que el término gramática ocurra en todos los valores del ítem Descripción, o en todos los valores del ítem Formalismo. La Figura 13 muestra el tipo de entrada que recibe el servicio Chasqui que chequea las restricciones (un documento XML que agrupa bajo el elemento Check una restricción y un documento de metadatos Chasqui). B. La Capa de Lógica Específica de la Aplicación La Figura 14 esquematiza la lógica específica de la aplicación utilizada en la comprobación de restricciones sobre documentos de metadatos Chasqui. Dicha lógica específica incluye una clase para almacenar la información necesaria sobre los asertos básicos (AssertionStore), una segunda clase para contener los resultados de evaluación de las restricciones (EResul), y una tercera clase para iterar sobre tales resultados (SIterator). C. La Capa Lingüística La Figura 15 muestra la gramática de atributos XLOP que caracteriza el proceso de comprobación de restricciones sobre documentos de metadatos en Chasqui. La gramática incontextual subyacente representa la estructura del documento de tipo Check descrito anteriormente. De nuevo, y por los motivos a los que se ha hecho ya alusión en la sección III, se utiliza recursión a izquierdas para representar la secuencia de ítems en el documento de metadatos. En lo que respecta al procesamiento, éste se concibe en tres etapas diferentes: una primera etapa de recolección en la que se recolectan todos los asertos básicos, una segunda etapa de chequeo en la que se comprueba si dichos asertos básicos se satisfacen o se violan, y una última etapa de evaluación, en la que se comprueba la satisfacción o violación de la restricción en su totalidad. De esta forma: - La etapa de recolección se lleva a cabo sintetizando un atributo basicAssertions que referirá al almacén de asertos (instancia de AssertionStore) utilizado para almacenar los asertos básicos referidos en la restricción. Este almacén se propaga por las estructuras asociadas al documento de metadatos utilizando un atributo heredado basicAssertionsh. - La etapa de chequeo se lleva a cabo sintetizando un atributo checkedBasicAssertion que hará referencia al almacén de asertos una vez que cada ítem de metadatos haya sido comprobado con respecto a los asertos básicos. El almacén resultante es realimentado de nuevo sobre la estructura de la restricción utilizando un atributo heredado checkedBasicAssertionh. - En la etapa de evaluación se sintetiza un atributo val para la restricción. Este atributo contiene un valor de verdad asociado a la restricción y un conjunto de asertos básicos que justifican dicho valor denominado soporte (esta información se almacena en instancias de EResul). Para asertos básicos, el valor de verdad se obtiene consultando el almacén de asertos. En condiciones afectadas por el operador +ot se complementa el valor de verdad de la condición y se mantiene el conjunto soporte de la condición. El valor de una condición And depende de los valores de sus argumentos: si ambos valores son ISSN 1932-8540 © IEEE 182 IEEE-RITA Vol. 4, Núm. 3, Ago. 2009 public class CheckingSemanticClass { private AssertionStore astore; public CheckingSemanticClass() { astore = new AssertionStore(); } public AssertionStore newCons(String i, String v) { astore.addAssertion(i,v); return astore; } public AssertionStore comb(AssertionStore a1, AssertionStore a2) { return astore; } ... } [2] [3] [4] [5] [6] [7] Figura 16. Fragmento de la clase semántica para la comprobación de restricciones sobre metadatos en Chasqui. [8] verdad, el valor final es verdad y el soporte es la unión de los soportes de los argumentos, y en caso contrario el valor de verdad es falso y el conjunto soporte es el conjunto más simple que justifica dicho valor. Por último el valor de una condición Or es el dual de una condición And. [9] D. La Clase Semántica La Figura 16 muestra un fragmento de la clase semántica para el procesamiento descrito en esta sección. Obsérvese que la clase maneja internamente estado con el fin de mejorar la eficiencia del procesador finalmente generado. Efectivamente, la clase permite reutilizar el mismo almacén de asertos en todas las operaciones. Esta optimización no compromete, sin embargo, el carácter declarativo de dicha especificación. V. CONCLUSIONES Y TRABAJO FUTURO XLOP proporciona una abstracción dirigida por lenguajes que introduce dos capas bien diferenciadas en la construcción de componentes y/o aplicaciones e-Learning que hacen un uso intensivo de documentación XML: una capa con la lógica específica de la aplicación, y una capa lingüística. La capa lingüística se especifica a alto nivel, como una gramática de atributos, y se conecta con la capa de la lógica específica mediante una clase semántica, que implementa las funciones semánticas utilizadas en la gramática. XLOP facilita el desarrollo y mantenimiento de las capas lingüísticas, ya que éstas se especifican a un grado muy alto de abstracción. Actualmente se están realizando distintas extensiones del lenguaje de especificación de XLOP (e.g., operadores definidos por el usuario, funciones semánticas no estrictas, capacidades de modularización, o tipado estático de las especificaciones). Como trabajo futuro se buscará la integración de XLOP con lenguajes para gramáticas documentales XML. Así mismo se desarrollará un entorno gráfico de depuración. Por último, se aplicará XLOP a experiencias e-Learning adicionales. [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] Appel, A.W. 1997. Modern Compiler Implementation in Java. Cambridge Univ. Press Birbeck, M et al. 2001. Professional XML 2nd Edition. WROX Press, Birminghan,UK Bork, A. 1985. Personal Computers for Education. Harper & Rows Fernández-Manjón, B., Sierra, J.L., Moreno-Ger, P., Martínez-Ortiz, I. Uso de Estándares Aplicados a TIC en Educación. Informe Técnico 16, Centro Nacional de Información y Comunicación Educativa (CNICE), ares.cnice.mec.es/informes/16/ IMS. IMS Question and Test Interoperability 2.1. www.imsglobal.org/question/ Kawaguchi, K. 2002. Flexible Data-Biding with RelaxNGCC. Extreme Markup Languages 2002, 4-9 Agosto, Montreal, Canada Knuth, D. E. 1968. Semantics of Context-free Languages. Math. Syst. Theory 2(2), 127–145. Ver también Math. Syst. Theory 5(1), 95–96 Paaki, J. 1995. Attribute Grammar Paradigms – A High-Level Methodology in Language Implementation. ACM Comp. Surveys, 27(2), 196-255. Sarasa, A., Navarro, I., Sierra, J.L, Fernández-Valmayor, A. 2008. Building a Syntax Directed Processing Environment for XML Documents by Combining SAX and JavaCC. 3rd Int. Workshop on XML Data Management Tools & Techniques. DEXA’08. 1-5 Sept., Turin, Italia Sarasa, A., Sierra, J.L., Fernández-Valmayor, A. 2008. Procesamiento de documentos XML dirigido por lenguajes en entornos de e-Learning. SIIE’08, 1-3 Oct., Salamanca, España. Sarasa, A., Temprado, B., Sierra, J.L., Fernández-Valmayor, A. 2008. XML Language-Oriented Processing with XLOP. 5th Int. Symp. on Web and Mobile Information Services. AINA’09. 26-29 Mayo, Bradford, UK Sierra, J.L., Fernández-Manjón, B., Fernández-Valmayor, A. 2007. Language-Driven Development of Web-Based Learning Applications. Advances in Web Based Learning - ICWL 2007, LNCS 4823, 520-531 Sierra, J.L., Fernández-Manjón, B., Fernández-Valmayor, A. 2008. A Language-Driven Approach for the Design of Interactive Applications. Interacting with Computers 20(1), 112-127 Sierra, J.L., Fernández-Valmayor, A. 2008. Tagging Learning Objects with Evolving Metadata Schema. ICALT’08. 1-5 Julio, Santander, España. Sierra, J.L., Fernández-Valmayor, A., Fernández-Manjón, B. 2007. How to Prototype an Educational Modeling Language. SIIE’07, 14-16 Nov., Porto, Portugal. Sierra, J.L., Fernández-Valmayor, A., Fernández-Manjón, B. 2008. From Documents to Applications Using Markup Languages. IEEE Software 25(2), 68-76 Sierra, J.L., Fernández-Valmayor, A., Guinea, M., Hernánz, H. 2006. From Research Resources to Virtual Objects: Process model and Virtualization Experiences. J. of Ed. Tech. & Society, 9(3), 56-68. Stanchfield, S., ANTXR: Easy XML Parsing based on The ANLR Parser Generator. Java Due.com, Hillcrest Comm. & FGM, Inc. javadude.com/tools/antxr/index.html XTutor web site. 2007. icampus.mit.edu/xtutor. Vis. 21 Abril 2008 AGRADECIMIENTOS El grupo de investigación UCM 921340 y los proyectos TIN2005-08788-C04-01, TIN2007-68125-C02-01, y Santander/UCM PR34/07-15865 han financiado este trabajo. REFERENCIAS [1] Aho, A.V., Lam, M.S., Sethi, R., Ullman, J.D. 2007. Compilers: principles, techniques and tools (second edition). Addison-Wesley ISSN 1932-8540 © IEEE Antonio Sarasa-Cabezuelo es Licenciado en Ciencias Matemáticas por la Universidad Complutense de Madrid (España), dónde actualmente ejerce como Profesor Colaborador. Coautor de más de 50 artículos publicados en actas de conferencias y revistas, colabora también con RED.ES y el Ministerio de Industria, Turismo y Comercio de España en diversas iniciativas e-Learning (especificación LOM-ES y proyecto AGREGA). Sus intereses investigadores incluyen la creación y despliegue de objetos educativos estandarizados, y el procesamiento de documentos XML dirigido por lenguajes, campo este último en el que está realizando su Tesis Doctoral. SARASA-CABEZUELO et al.: PROCESAMIENTO DE DOCS. XML DIRIGIDO POR LENGUAJES José-Luis Sierra-Rodríguez es Doctor en Informática por la Universidad Complutense de Madrid (España), dónde actualmente ocupa una plaza de Profesor Titular de Universidad. El Dr. Sierra es coautor de más de 70 artículos de investigación publicados en revistas y actas de conferencias internacionales. Sus intereses investigadores incluyen la Ingeniería del Software orientada a lenguajes, los lenguajes de marcado y el desarrollo dirigido por lenguajes de Sistemas eLearning. Alfredo Fernández-Valmayor es Doctor en Ciencias Físicas por la Universidad Complutense de Madrid (España), y Profesor Titular de Universidad en dicha universidad, dónde también dirige el Campus Virtual de la institución. El Dr. Fernández-Valmayor es coautor de más de 70 artículos científicos publicados en revistas y actas de conferencias internacionales. Sus intereses investigadores se centran en los usos educativos de los lenguajes de marcado y en el desarrollo y autoría de materiales para sistemas de educación basados en web. ISSN 1932-8540 © IEEE 183