gpt4 book ai didi

java - 将 OCL 表达式解析为 AST(抽象语法树)

转载 作者:行者123 更新时间:2023-12-04 08:35:24 26 4
gpt4 key购买 nike

用于上下文 - OCL 表达式将与“Ecore”文件一起提供,该文件包含有关与表达式关联的 UML 的信息。
作为我正在进行的研究的一部分,我试图将 OCL 表达式解析为抽象语法树 (AST),我希望能够对其进行迭代、查看每个节点的信息并进行更改。问题是我发现的所有软件都与 OCL 有任何关系 -
现代应用程序不支持它们,因为它们太过时了,或者用于验证表达式或为给定某个模型的实例的表达式返回 boolean 值。
我确实设法使用 Eclipse MDE 查看给定表达式的 AST,但这只是通过 UI 没有导出它的选项(据我所知)。
Screenshot
我找到的最接近的解决方案是 DresdenOCL ( https://github.com/dresden-ocl/standalone ),在搜索代码很长时间后,我找到了一个函数,该函数返回某个“OCLResource”对象的“TreeIterator”对象。问题是树上的节点由仅用于后端使用的类组成 - 这意味着除了类名、内存位置以及有时表示一部分的字符串值之外,我无法从中获取任何真实信息的表达式。除了打印顺序之外没有任何层次结构指示的事实也是一个大问题。我还尝试在这些节点上使用 Reflection,但从我所见,这些类没有任何可能有帮助的有用函数或字段。
我还提供了一些照片作为示例,包括输入和输出。
相片:
Input
Function
Output
目前我最好的选择是苦心研究这些 DresdenOCL 输出,直到我对它们的构建方式有了很好的理解,然后自己编写代码来获取这些输出并构建一个我可以正常使用的 AST,但这可能需要很长一段时间,这就是为什么我把这个问题带到这里希望一些美丽的陌生人可能会出现更好的解决方案。
任何建议将不胜感激,提前致谢。

最佳答案

使用 USE-OCL(Uni Bremen,可从 sourceforge 获得)可能会更幸运。它是开源的,在包 src/main/org/tzi/parser 中,您可以找到一个带有节点元素的 AST 表示,以及用于从字符串输入创建 AST 的解析器/编译器类。它看起来非常全面,可能适合集成到另一个工具中。
我自己还没有使用过 USE 的代码,但我在讲座中使用了该工具。它可靠、稳定且积极维护。
编辑:以下代码段将 OCL 表达式转换为编译后的内部表示,您可以在包 org.tzi.use.uml.ocl.expr 中找到.查看函数 compileExpression您可以找到如何转换为包的 AST 表示 org.tzi.use.parser.ocl .哪个更适合你。使用的 UML 模型是空的,因此表达式中没有要使用的上下文。但是,将模型转换为 USE 模型格式可能不会太费力。

    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());
}

关于java - 将 OCL 表达式解析为 AST(抽象语法树),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64823155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com