En mi anterior post describí mi trabajo inicial para Language Workbench Competition 2011, usando AjGenesis. Ahora, es hora de escribir sobre algunas tareas más que he escrito. Pueden leer la lista de tareas a cumplir en:
http://www.languageworkbenches.net/LWCTask-1.0.pdf
Primero, saltée la 0.3 (constraint checks such as name-uniqueness). Planeo completarla, pero no ahora. Escribí la tarea 0.4:
0.4 Show how to break down a (large) model into several parts, while still cross-referencing between the parts. For example, put the Car and Person entities into different files, while still having the Person -> Car reference work.
El código quedó en el repositorio de AjGenesis:
http://ajgenesis.codeplex.com/SourceControl/list/changesets
en el directorio examples/Lcw2011
Este paso fue fácil. El Project.txt es ahora:
Project Lwc2011 Entities Entity Person Source="Entities\Person.txt" Entity Car Source="Entities\Car.txt" End Entities End Project
El atributo Source es especial en AjGenesis durante la carga del modelo: indica que el objeto se completa desde un archivo separado a leer. Agregué esta característica desde el principio de AjGenesis: quiero tener archivos de modelos que sean manejables, y que no “duelan los ojos” al leerlos 😉
Esta es ahora Person.txt:
Entity Person Properties Property Name Type="Text" Property FirstName Type="Text" Property BirthDate Type="Date" Property OwnedCar Type="Car" End Properties End EntityComencé también a escribir la Fase 1, primer tarea:
1.1 Show the integration of several languages. Define a second language to define instances of the entities, including assignment of values to the properties. This should ideally really be a second language that integrates with the first one, not just "more syntax" in the same
grammar. We want to showcase language modularity and composition here.Este es el nuevo modelo:
Project Lwc2011 Description = "Lwc" Entities Entity Person Source="Entities\Person.txt" Entity Car Source="Entities\Car.txt" End Entities Instances Instance p Type = "Person" Properties Property Name Value = "Voelter" Property FirstName Value = "Markus" Property BirthDay Value = "14/02/1927" Property OwnedCar Value = "c" End Properties End Instance Instance c Type = "Car" Properties Property Make Value = "VW" Property Model Value = "Touran" End Properties End Instance End Instances End ProjectEs trabajo en progreso. Podría poner las instancias en un archivo independiente (Instances.txt) o podría poner cada instancia en un archivo separado, referenciado por el código de arriba usando el atribute Source. Debería completar la tarea con control de la existencia de cada propiedad, que exista en la entidad correspondiente. AjGenesis no soporta la definición de un Domain-Specific Language: el ejemplo de arriba es todavía un modelo libre. Podemos agregar una propiedad cualquiera a cualquier instancia, y la actual implementación no controla el uso apropiado del modelo de entidades. Este tipo de control es tarea pendiente: lo agregaré en la logica de las tasks que escribo, pero en general, no lo uso en los proyectos reales.
Hasta donde sé, esta tarea 1.1 no implica generación de código. En la próxima tarea, controlaré que los valores de las propiedades correspondan a los tipos declarados en los tipos.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com