xtext (lenguajes de dominio específico textuales)

53
Xtext 1.0 Creación de lenguajes textuales de dominio específico Vicente García Díaz ([email protected]) Juan Manuel Cueva Lovelle MDE-OOTLAB Research Group Noviembre de 2010

Upload: vicente-garcia-diaz

Post on 30-Jun-2015

1.188 views

Category:

Documents


0 download

DESCRIPTION

Introducción a Xtext para el Máster en Ingeniería Web de la Universidad de Oviedo

TRANSCRIPT

Page 1: Xtext (Lenguajes de dominio específico textuales)

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

Page 2: Xtext (Lenguajes de dominio específico textuales)

Lenguajes textuales de dominio específicoUna breve introducción

Page 3: Xtext (Lenguajes de dominio específico textuales)

¿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

Page 4: Xtext (Lenguajes de dominio específico textuales)

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)

Page 5: Xtext (Lenguajes de dominio específico textuales)

XtextFramework para desarrollar lenguajes textuales

Page 6: Xtext (Lenguajes de dominio específico 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

Page 7: Xtext (Lenguajes de dominio específico textuales)

¿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

Page 8: Xtext (Lenguajes de dominio específico textuales)

Instalación

Lo más fácil es descargar un Eclipse con todo

http://xtext.itemis.com/xtext/language=en/23947/downloads

Page 9: Xtext (Lenguajes de dominio específico textuales)

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

Page 10: Xtext (Lenguajes de dominio específico textuales)

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

Page 11: Xtext (Lenguajes de dominio específico textuales)

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

Page 12: Xtext (Lenguajes de dominio específico textuales)

Gramática del lenguaje (2/6)

Page 13: Xtext (Lenguajes de dominio específico textuales)

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

Page 14: Xtext (Lenguajes de dominio específico textuales)

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”.

Page 15: Xtext (Lenguajes de dominio específico textuales)

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

Page 16: Xtext (Lenguajes de dominio específico textuales)

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

Page 17: Xtext (Lenguajes de dominio específico textuales)

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

Page 18: Xtext (Lenguajes de dominio específico textuales)

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

Page 19: Xtext (Lenguajes de dominio específico textuales)

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

Page 20: Xtext (Lenguajes de dominio específico textuales)

Metamodelo Ecore (2/2)

Page 21: Xtext (Lenguajes de dominio específico textuales)

Entorno de desarrollo (1/2)

Page 22: Xtext (Lenguajes de dominio específico textuales)

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

Page 23: Xtext (Lenguajes de dominio específico textuales)

Refinar la gramática (1/2)

Page 24: Xtext (Lenguajes de dominio específico textuales)

Refinar la gramática (2/2)

Page 25: Xtext (Lenguajes de dominio específico textuales)

Procesamiento dinámico del lenguaje

Page 26: Xtext (Lenguajes de dominio específico textuales)

Modelos en el contexto Xtext

Modelo semántico

Modelo de nodos

Modelo

Modelo de la gramática

Metamodelo Parser

Page 27: Xtext (Lenguajes de dominio específico textuales)

Modelo semántico (1/3)

EClass en el metamodelo

Elemento del modelo

(instancia del Eclass)

Page 28: Xtext (Lenguajes de dominio específico textuales)

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

Page 29: Xtext (Lenguajes de dominio específico textuales)

Modelo semántico (3/3)

Page 30: Xtext (Lenguajes de dominio específico textuales)

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

*

Page 31: Xtext (Lenguajes de dominio específico textuales)

Modelo de nodos (2/3)

Page 32: Xtext (Lenguajes de dominio específico textuales)

Modelo de nodos (3/3)

Page 33: Xtext (Lenguajes de dominio específico textuales)

Generación de artefactos a partir del lenguaje

Page 34: Xtext (Lenguajes de dominio específico textuales)

Proyecto de ejemplo

Ejemplo de modelo

Ejemplo de transformación

Ejemplo de plantilla

Ejemplo de flujo de trabajo

Page 35: Xtext (Lenguajes de dominio específico textuales)

Modeling Workflow Engine

Page 36: Xtext (Lenguajes de dominio específico textuales)

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

Page 37: Xtext (Lenguajes de dominio específico textuales)

Xpand (2/3)

Page 38: Xtext (Lenguajes de dominio específico textuales)

Xpand (3/3)Xtend

Template.xpt

Extensions.ext

JavaExtensions.javaEs válido features y

this.features

Page 39: Xtext (Lenguajes de dominio específico textuales)

Check (1/2)

Lenguaje muy similar a OCL GenerateDomainmodel.mwe2

DomainmodelChecks.chk DomainmodelFastChecks.chk DomainmodelExpensiveChecks.chk

Page 40: Xtext (Lenguajes de dominio específico textuales)

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

Page 41: Xtext (Lenguajes de dominio específico textuales)

Modeling Workflow Engine 2Ejecución de flujos de trabajo de forma declarativa

Page 42: Xtext (Lenguajes de dominio específico textuales)

¿Cómo funciona MWE2?

MWE

Page 43: Xtext (Lenguajes de dominio específico textuales)

Extendiendo MWE2Ejemplo 1. Hola mundo

¿Qué queremos?

¿Cómo?

Page 44: Xtext (Lenguajes de dominio específico textuales)

Extendiendo MWE2Ejemplo 2. Manipular modelos (1/4)

¿Qué queremos?

Page 45: Xtext (Lenguajes de dominio específico textuales)

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

Page 46: Xtext (Lenguajes de dominio específico textuales)

Extendiendo MWE2Ejemplo 2. Manipular modelos (3/4)

¿Cómo? ResourceWriter

Page 47: Xtext (Lenguajes de dominio específico textuales)

Extendiendo MWE2Ejemplo 2. Manipular modelos (4/4)

¿Cómo? RenamingTransformer

Page 48: Xtext (Lenguajes de dominio específico textuales)

PrácticoEjercicios

Page 49: Xtext (Lenguajes de dominio específico textuales)

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

Page 50: Xtext (Lenguajes de dominio específico textuales)

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

Page 51: Xtext (Lenguajes de dominio específico textuales)

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

Page 52: Xtext (Lenguajes de dominio específico textuales)

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.)

Page 53: Xtext (Lenguajes de dominio específico textuales)

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