用于上下文- OCL表达式将与一个"Ecore“文件一起提供,该文件包含与该表达式相关的信息。
作为我正在进行的研究的一部分,我正在尝试将一个OCL表达式解析为一个抽象语法树(AST),我希望它能够迭代、查看每个节点的信息并进行更改。问题是,我发现的所有与OCL有关的软件都不受现代应用程序的支持,因为它们太过时了,或者是为了验证表达式,或者为给定某个模型的实例返回一个布尔值。
我确实使用Eclipse查看了给定表达式的AST,但这只是通过UI,没有导出它的选项(据我注意到)。
我找到的最接近的解决方案是DresdenOCL (https://github.com/dresden-ocl/standalone),它在搜索代码很长时间之后找到了一个函数,该函数返回某个"OCLResource“对象的"TreeIterator”对象。问题是树上的节点是由仅供后端使用的类组成的,这意味着除了类名、内存位置和有时表示表达式一部分的字符串值之外,我无法从它们中获取任何真正的信息。事实上,除了打印的顺序之外,没有其他等级的指示,这也是一个大问题。我也尝试在这些节点上使用反射,但据我所见,这些类没有任何有用的函数或字段。
我还提供了一些照片作为例子,包括输入和输出。图片:
目前,我最好的选择是仔细研究这些DresdenOCL输出,直到我很好地理解了它们是如何构建的,然后自己编写一段代码,获取这些输出并构建一个我可以正确处理的AST,但这可能需要很长时间,这就是为什么我要把这个问题带到这里,希望一些漂亮的陌生人能够找到一个更好的解决方案。
如有任何建议,将不胜感激。
发布于 2020-11-13 16:58:26
你可能会有更多的运气使用-东方海外(由Uni不来梅,可在sourceforge)。它是开源的,在包src/main/org/tzi/解析器中,您可以找到一个AST表示及其节点元素,以及解析器/编译器类,用于从字符串输入创建AST。它看起来相当全面,可能适合集成到另一个工具中。
我本人还没有使用use的代码,但我在讲座中使用了这个工具。它是可靠、稳定和积极维护的。
编辑:下面的代码片段将OCL表达式转换为在包org.tzi.use.uml.ocl.expr中可以找到的已编译的内部表示形式。查看函数compileExpression,您可以找到如何将其转换为包org.tzi.use.parser.ocl的AST表示。任何最适合你的。使用的UML模型是空的,因此表达式中不使用上下文。但是,将模型转换为使用模型格式可能不会太费劲。
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());
}发布于 2020-11-13 18:46:15
使用Eclipse的完整OCL编辑器,您可以使用OCL ->保存抽象语法上下文菜单操作,或者实际上使用保存具体语法(Xtext)语法。如果需要编程保存,则底层功能是可调用的。
您应该知道,OCL规范定义的AST有许多不足之处,而基于Pivot的Eclipse原型解决方案就是针对这些缺陷。
https://stackoverflow.com/questions/64823155
复制相似问题