para el contexto : las expresiones OCL se proporcionarán junto con un archivo "Ecore" que contiene información sobre el UML al que está asociada la expresión.
Como parte de una investigación que estoy realizando, estoy tratando de analizar una expresión OCL en un árbol de sintaxis abstracta (AST) que quiero poder iterar, ver información para cada nodo y realizar cambios. El problema es que todo el software que encontré que tiene algo que ver con OCL tampoco es compatible con las aplicaciones modernas porque están demasiado desactualizados o están destinados a validar una expresión o devolver un valor booleano para la expresión dada un ejemplo de un determinado modelo.
Logré ver un AST para una expresión determinada usando Eclipse MDE, pero eso fue solo a través de la interfaz de usuario sin opción para exportarlo (por lo que noté).
La solución más cercana que encontré fue DresdenOCL ( https://github.com/dresden-ocl/standalone ) que, después de explorar el código durante mucho tiempo, encontré una función que devuelve un objeto "TreeIterator" para un determinado objeto "OCLResource". El problema es que los nodos en el árbol están formados por clases que estaban destinadas solo para uso de back-end, lo que significa que no puedo obtener ninguna información real de ellos, excepto el nombre de la clase, la ubicación de la memoria y, a veces, un valor de cadena que representa una parte. de la Expresión. El hecho de que no haya ninguna indicación de jerarquía excepto el orden en que se imprimió también es un gran problema. También intenté usar Reflection en estos nodos, pero por lo que vi, esas clases no tienen funciones o campos útiles que puedan ayudar.
También proporcioné algunas fotos como ejemplo que incluyen entrada y salida. Fotos:
Mi mejor opción en este momento es estudiar minuciosamente estos resultados de DresdenOCL hasta que tenga una buena comprensión de cómo se construyen y luego escribir un código yo mismo que tome estos resultados y construya un AST con el que pueda trabajar correctamente, pero eso podría tomar un mucho tiempo, razón por la cual estoy trayendo el problema aquí con la esperanza de que algún hermoso extraño pueda aparecer con una mejor solución.
Cualquier consejo sería muy apreciado, gracias de antemano.
Es posible que tenga más suerte con USE-OCL (de Uni Bremen, disponible en sourceforge ). Es de código abierto y en el paquete src/main/org/tzi/parser encontrará una representación de AST con sus elementos de nodo, junto con clases de analizador/compilador para crear el AST a partir de una entrada de cadena. Parece bastante completo y podría ser adecuado para una integración en otra herramienta.
Todavía no he trabajado con el código de USE, pero uso la herramienta en conferencias. Es confiable, estable y mantenido activamente.
Editar: el siguiente fragmento transforma una expresión OCL en la representación interna compilada que puede encontrar en el paquete org.tzi.use.uml.ocl.expr . Mirando la función compileExpression puede encontrar cómo transformarse en la representación AST del paquete org.tzi.use.parser.ocl . Lo que más te convenga. El modelo UML usado está vacío, por lo que no hay contexto para usar en la expresión. Sin embargo, la transformación de un modelo al formato de modelo USE puede no ser demasiado esfuerzo.
public static void main(String args[]) { ModelFactory mFactory = new ModelFactory(); MModel mModel = mFactory.createModel("unnamed"); MSystem system = new MSystem(mModel); String input = "Set{1,2,3} ->collect(i|i*2)"; PrintWriter errorPrinter = new PrintWriter(new StringWriter(), true); Expression expr = OCLCompiler.compileExpression(mModel, input, "USE Api", errorPrinter, system.varBindings()); System.out.println(expr.toString()); }Usando el editor OCL completo de Eclipse OCL, puede usar la acción del menú contextual OCL -> Guardar sintaxis abstracta, o incluso Guardar sintaxis concreta (Xtext). La funcionalidad subyacente se puede llamar a Java si necesita guardar mediante programación.
Debe tener en cuenta que el AST definido por la especificación OMG OCL tiene muchas deficiencias para las cuales las soluciones de prototipos Eclipse OCL basadas en Pivot.