xtext (lenguajes de dominio específico textuales)

Post on 30-Jun-2015

1.176 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

Xtext 1.0Creación de lenguajes textuales de dominio específico

Vicente García Díaz (garciavicente@uniovi.es)

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

top related