Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

408
Views
Analizar una expresión OCL en un AST (Árbol de sintaxis abstracta)

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

Captura de pantalla

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:

Aporte

Función

Producción

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.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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()); }
over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!