xtext (lenguajes de dominio específico textuales)
DESCRIPTION
Introducción a Xtext para el Máster en Ingeniería Web de la Universidad de OviedoTRANSCRIPT
Xtext 1.0Creación de lenguajes textuales de dominio específico
Vicente García Díaz ([email protected])
Juan Manuel Cueva LovelleMDE-OOTLAB Research GroupNoviembre de 2010
Lenguajes textuales de dominio específicoUna breve introducción
¿Cómo se crea habitualmente un DSL textual?
Generalmente se crean utilizando generadores de parsers De una gramática obtienen un parser ANTLR, JavaCC, Lexx/yacc, …
El parser valida el texto y crea un árbol Generalmente un Abstract
Syntax Tree (AST)
5*6 + 25
5
Suma
Multiplicación
LiteralLiteral
6 25
Literal
Herramientas más sofisticadas
Escribir un parser es una tarea difícil Incluso utilizando una herramienta como
ANTLR …y aún faltaría
Crear un entorno de desarrollo para el lenguaje
Transformar el AST en “algo” a partir de lo cual generar código fácilmente
Es mejor no hacerlo “a mano” Xtext Oslo (lenguaje M)
XtextFramework para desarrollar lenguajes textuales
Xtext
Herramienta para construir DSLs o GPLs Genera varios artefactos
automáticamente a partir de una gramática EBNF Un parser Un metamodelo Ecore Un IDE para Eclipse
▪ Resalte de sintaxis▪ Ayuda para completar sentencias▪ Ventana de Resumen▪ Chequeo de restricciones en tiempo real
Generador Xtext
Metamodelo Ecore
Gramática Xtext(Petri.xtext)
Parser ANTLR
Editor Plug-in
Proyecto del DSL “Petri”
Proyecto UI
¿Dónde se ubica Xtext?
Herramienta UML
Instanceof
Ecore
Metamodelo I
Metamodelo II
Modelo I Modelo II
Instanceof
Especific. De un editor
GMF
Editor personalizado
XMI
Especific. De la
sintáxis textual
Xtext
Editor personalizado
Builds
Builds
Check
Xtend
Xpand
Artefactos generados
Recipe (FW)
Código manual
EMF
Instalación
Lo más fácil es descargar un Eclipse con todo
http://xtext.itemis.com/xtext/language=en/23947/downloads
Wizard para crear un nuevo lenguaje Project name: Es el nombre del proyecto Eclipse en el que se definirá el
lenguaje Language name: Es el nombre del lenguaje Language extension: La extensión de los archivos que trabajan con el
lenguaje en el editor Create a generator project: Si se selecciona, entonces se creará otro
proyecto únicamente a modo de ejemplo para permitir generar artefactos a partir de “programas” realizados con el lenguaje
Proyectos generados por el Wizard
Proyecto del lenguaje Gramática del lenguaje Domainmodel Workflow que ejecuta el generador Xtext
Proyecto “ejemplo” para generar artefactos a partir del lenguaje Ejemplo de modelo Ejemplo de plantilla Ejemplo de workflow
Proyecto de la interfaz de usuario Código del IDE para trabajar con el
lenguaje
Gramática del lenguaje (1/6)
Dos propósitos principales Describir la sintaxis concreta Describir el metamodelo (estructura del
AST) Domainmodel.xtext
Nombre de la gramática
Especifica una gramática que se puede utilizar dentro de la gramática
DomainModel
Nombre y URI del EPackage Ecore
Gramática del lenguaje (2/6)
Gramática del lenguaje (3/6)Reglas terminales
Son símbolos atómicos de las gramáticas Crean tokens terminales en el AST En org.eclipse.xtext.common se encuentran las reglas terminales que Xtext
ofrece por defecto Por convenio, se nombran en mayúsculas
No las procesa el
parser
Importa el EPackage, con sus tipos de datos, del
metamodelo Ecore
Cardinalidad 0..1
Cardinalidad 0..n
Cardinalidad 1..n
Rango de valores
Alternativa
Token “until”Token
“negated”
Comodín
Gramática del lenguaje (4/6)Reglas parser (1/2)
No son símbolos atómicos de las gramáticas Crean un subárbol en el AST Expresiones no compatibles: rangos, comodines, token “until”
y “negated” Expresiones específicas
Asignaciones▪ Asignación “=“. El elemento de la derecha se le asigna al de la izquierda▪ Asignación “+=“. Una lista de elementos de la derecha son asignados al
elemento de la izquierda▪ Asignación “?=”. Asigna un EBoolean al elemento de la izquierda. Es
“true” si el elemento de la derecha es consumido. De otra forma es “false”.
Gramática del lenguaje (4/6)Reglas parser (2/2)
Referencias cruzadas▪ Una tipo de datos que referencia a otro
a través de su ID (por defecto)
Llamadas a reglas sin asignación
Grupos desordenados
Reglas ocultas▪ Son reglas que no se procesarán por el parser porque no tienen valor
semántico▪ Para utilizarlas se utiliza el sentencia hidden a nivel de gramática o a
nivel de regla
Gramática del lenguaje (5/6)Reglas tipo de datos
Son muy similares a las reglas terminales Son símbolos atómicos de las gramáticas
No contienen ni llamadas a reglas parser ni asignaciones
A diferencia de las reglas terminales: Se recomiendan para combinar reglas terminales
▪ Se evita ocultación de reglas y conflictos en el parser
Permiten utilizar tokens ocultos▪ Por ejemplo se podrían introducir comentarios entre dos Ids
▪ espacionombres./*comentario entre IDs*/.clase
Gramática del lenguaje (6/6)Reglas enumeración
Sirven para crear enumerados en una gramática
Es posible definir literales alternativos HOME = “home” | WORK = “work” | CLASS = “class” | CLASS = “classes”
Ecore no permite enumerados sin asignación (cuando se utiliza “?”)
Gramática del lenguaje
Editor del lenguaje
Generación del código del DSL
Se lanza el archivo Modeling Workflow Engine (MWE) predefinido con el proyecto (GenerateDomainmodel.mwe)
Utilizando MWE se ejecuta el generador Xtext
Se genera de ese modo: El metamodelo Ecore del DSL El editor del DSL El parser para procesar el DSL
Metamodelo Ecore (1/2)
Con el meta-metamodelo Ecore se definen los metamodelos de los DSLs
EPackage Siempre que se utiliza el directiva generate, que engloba a todo el
metamodelo, se crea EClass
Cada regla parser se corresponde con un tipo de datos EClass EEnum
Cada regla enumeración se corresponde con un tipo de datos EEnum EDataType
Cada regla terminal o regla tipo de datos se corresponde con un tipo de datos EDataType, siendo por defecto EString
Hay que tener en cuenta que: Los tipos de datos tienen el mismo nombre que las reglas …a no ser que explícitamente se le indique otro Además, dos o más reglas pueden hacerse corresponder con un mismo tipo
de datos
Metamodelo Ecore (2/2)
Entorno de desarrollo (1/2)
Entorno de desarrollo (2/2)
Creando un proyecto en blanco se puede añadir un archivo con la extensión .dmodel Ayuda al escribir código Resalte de sintaxis Validación sintáctica Vista resumen de código Referencias entre elementos
Refinar la gramática (1/2)
Refinar la gramática (2/2)
Procesamiento dinámico del lenguaje
Modelos en el contexto Xtext
Modelo semántico
Modelo de nodos
Modelo
Modelo de la gramática
Metamodelo Parser
Modelo semántico (1/3)
EClass en el metamodelo
Elemento del modelo
(instancia del Eclass)
Modelo semántico (2/3)
Para cargar un modelo realizado con nuestro DSL
Los metamodelos creados con Xtext tienen
▪ EClasses (DomainModel, Type, Entity, …) EAtributes (name, multi, …) EReferences (elements, features, …)
▪ EDataTypes EEnums
Modelo semántico (3/3)
Modelo de nodos (1/3)
Tiene dos tipos de nodos principales
Métodos interesantes de org.eclipse.xtext.parsetree▪ CompositeNode NodeUtil.getNode(EObject obj)▪ Iterable<AbstractNode> NodeUtil.getAllContents(CompositeNode
rootNode)
+getElement() : EObject
-line : int-length : int
AbstractNode
CompositeNode
-text : string
LeafNode1
*
Modelo de nodos (2/3)
Modelo de nodos (3/3)
Generación de artefactos a partir del lenguaje
Proyecto de ejemplo
Ejemplo de modelo
Ejemplo de transformación
Ejemplo de plantilla
Ejemplo de flujo de trabajo
Modeling Workflow Engine
Xpand (1/3)
Es una herramienta utilizada para realizar transformaciones M2T Permite generar artefactos textuales a partir de un modelo
Se integra perfectamente con Xtext y con MWE
Xpand (2/3)
Xpand (3/3)Xtend
Template.xpt
Extensions.ext
JavaExtensions.javaEs válido features y
this.features
Check (1/2)
Lenguaje muy similar a OCL GenerateDomainmodel.mwe2
DomainmodelChecks.chk DomainmodelFastChecks.chk DomainmodelExpensiveChecks.chk
Check (2/2)
Se quiere mostrar un mensaje de ERROR con el formato “Se ha importado un paquete con el mismo nombre que NOMBRE_PAQUETE” Sin necesidad de solicitarlo, es decir, según se está programando
Modeling Workflow Engine 2Ejecución de flujos de trabajo de forma declarativa
¿Cómo funciona MWE2?
MWE
Extendiendo MWE2Ejemplo 1. Hola mundo
¿Qué queremos?
¿Cómo?
Extendiendo MWE2Ejemplo 2. Manipular modelos (1/4)
¿Qué queremos?
Extendiendo MWE2Ejemplo 2. Manipular modelos (2/4)
¿Cómo? ResourceReader
En lugar de implementar la interfaz IWorkflowComponent, extendemos una
clase que ya la implemente y que además ya tiene un setter y un getter
para ModelSlot
Extendiendo MWE2Ejemplo 2. Manipular modelos (3/4)
¿Cómo? ResourceWriter
Extendiendo MWE2Ejemplo 2. Manipular modelos (4/4)
¿Cómo? RenamingTransformer
PrácticoEjercicios
Ejercicio 1. Creación de una gramática
Este ejercicio consiste en crear una gramática que permita definir Redes de Petri de la forma más precisa posible.
P1
P2
P1P3 P5
T1
T2
15
4
17
3 4 6
Ejercicio 2. Creación de una gramática
Este ejercicio consiste en crear una gramática que permita describir máquinas de estados utilizadas para bloquear / desbloquear “compartimentos secretos”
Permitirá:•Definir una serie de posibles eventos (cada uno asociado con un código)•Especificar qué eventos reiniciarán al sistema•Definir una serie de posibles órdenes o comandos (cada uno asociado con un código)•Definir los posibles estados
•Cada estado puede opcionalmente tener una serie de acciones asociadas•Cada evento producido en un estado conducirá al sistema a otro estado
Ejemplo de Martin Fowler
Ejercicio 3. Generador de código
Este ejercicio consiste en crear, mediante la previa creación de una gramática, un generador de código
Permitirá:•Definir las entidades de una aplicación y sus relaciones•Para cada entidad se generará una clase Java•También se generará un script SQL que permita crear una estructura de datos para almacenar la información de las entidades
Code
Ejercicio 4. Agenda de contactos
Este ejercicio consiste en crear un DSL textual para especificar la agenda de contactos (teléfono, mail, dirección, etc.)
Debería:•Utilizarse Eclipse como Rich Client Platform para crear una aplicación completa utilizando Eclipse como base
Permitirá:•Crear, eliminar y modificar listas de contactos•Exportar las listas de contactos a diferentes formatos (CSV, vCard, etc.)
Recursos
Eclipse Project http://www.eclipse.org/
Xtext Project http://www.eclipse.org/Xtext/
Eclipse Modeling Project: A Domain-Specific Language (DSL) Toolkit Richard C. Gronback Addison-Wesley. The Eclipse Series - 2009 http://www.eclipse.org/resources/resource.php?id=493