【问题标题】:Parse an OCL Expression into an AST (Abstract Syntax Tree)将 OCL 表达式解析为 AST(抽象语法树)
【发布时间】:2020-11-13 15:00:25
【问题描述】:

for context - OCL 表达式将与一个“Ecore”文件一起提供,该文件包含与表达式相关联的 UML 的信息。

作为我正在进行的研究的一部分,我正在尝试将 OCL 表达式解析为抽象语法树 (AST),我希望能够对其进行迭代、查看每个节点的信息并进行更改。问题是我发现的所有与 OCL 有任何关系的软件—— 现代应用程序不支持,因为它们太过时了,或者用于验证表达式或为给定模型实例的表达式返回布尔值。

我确实设法使用 Eclipse MDE 查看给定表达式的 AST,但这只是通过 UI 没有导出它的选项(据我所知)。

Screenshot

我找到的最接近的解决方案是 DresdenOCL (https://github.com/dresden-ocl/standalone),在对代码进行了很长时间的搜索后,我发现了一个函数,它为某个“OCLResource”对象返回一个“TreeIterator”对象。问题是树上的节点由仅供后端使用的类组成——这意味着除了类名、内存位置和有时代表一部分的字符串值之外,我无法从中获取任何真实信息的表达。除了打印的顺序之外,没有任何层次结构的迹象,这也是一个大问题。我也尝试在这些节点上使用反射,但据我所知,这些类没有任何有用的函数或字段可能会有所帮助。

我还提供了一些照片作为示例,包括输入和输出。 照片:

Input

Function

Output

目前我最好的选择是刻苦研究这些 DresdenOCL 输出,直到我很好地理解它们是如何构建的,然后自己编写一个代码来获取这些输出并构建一个我可以正常使用的 AST,但是可能需要很长时间,这就是为什么我在这里提出这个问题,希望一些漂亮的陌生人可能会出现更好的解决方案。

任何建议将不胜感激,在此先感谢。

【问题讨论】:

    标签: java eclipse parsing abstract-syntax-tree ocl


    【解决方案1】:

    使用 USE-OCL(由 Uni Bremen 提供,sourceforge 提供)您可能会更幸运。它是开源的,在 src/main/org/tzi/parser 包中,您可以找到一个带有节点元素的 AST 表示,以及用于从字符串输入创建 AST 的解析器/编译器类。它看起来很全面,可能适合集成到另一个工具中。

    我自己还没有使用过 USE 的代码,但我在讲座中使用了该工具。它可靠、稳定且积极维护。

    编辑:以下 sn-p 将 OCL 表达式转换为编译后的内部表示,您可以在包 org.tzi.use.uml.ocl.expr 中找到。查看函数compileExpression,您可以找到如何转换为包org.tzi.use.parser.ocl 的AST 表示。什么更适合你。使用的 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());
        }
    

    【讨论】:

    • 首先感谢您的快速回答,我确实尝试过 USE-OCL 但令人尴尬的是我真的不知道从哪里开始,程序看起来很大,每个课程都依赖于很多其他课程,你能指导我应该开始查找 src/main/org/tzi/parser 中的哪个文件?
    • src/main/org/tzi/use/parser/use/USECompiler.java::compilesSpecification(...) 编译整个模型(包括非 OCL 部分)。 src/main/org/tzi/use/parser/AST 是最顶层的 AST 结构。在子包 ocl 中,您可以找到与 OCL 相关的语法节点。
    • 再次感谢您的帮助,我在 Intellij 中打开了整个 Use 项目,我正在查看它,但目前我找不到一个获取字符串输入并开始解析它的 java 类,这一切非常复杂。除此之外,是否可以在模型上下文之外使用 USE 解析 OCL 表达式?因为似乎程序在模型方面有自己的格式,除非我可以轻松地从 Ecore 文件生成它,否则这也是一个问题。
    • 上面帖子中的编辑展示了如何使用空模型将 OCL 表达式解析/编译为两种不同的表示。
    • 非常感谢!从您的代码中,我设法拼凑出我事先不知道的过程。因为我有一个完整的带有表达式的模型数据集,所以我需要找到一种方法来自动化整个过程并动态构建模型。我确实设法更改了代码,以便 CompileExpression 函数返回一个 AST 表达式类型。我仍在尝试了解迭代对象的最佳方法,但您确实帮助我以正确的方式开始。附加请求 如果可以,您是否知道有关在 UI 之外使用 USE 的任何文档?泰!
    【解决方案2】:

    使用来自 Eclipse OCL 的 Complete OCL 编辑器,您可以使用 OCL -> Save Abstract Syntax 上下文菜单操作,或者实际上是 Save Concrete (Xtext) Syntax。如果您需要以编程方式保存,则底层功能是 Java 可调用的。

    您应该知道,由 OMG OCL 规范定义的 AST 有许多不足之处,而基于 Pivot 的 Eclipse OCL 原型解决方案正是针对这些不足之处。

    【讨论】:

    • 感谢您的建议,我确实尝试了 Eclipse OCL,但我没有设法保存 AST,单击 OCL 后出现的菜单仅允许验证表达式、导出文档(将其保存为 .ocl 格式)或显示打开空白控制台的 Xtext 控制台。
    • 似乎您正在使用 Ecore / OCLinEcore 编辑器,其中 AST 是 Ecore,OCL 嵌入为 EAnnotation 文本体。只有 Complete OCL 具有全面的 AST。您可以从 Ecore /OCLinEcore 导出文档,为您提供完整的 OCL 文档,然后可以对其进行编辑并保存为完整的 AST。您可以在 git.eclipse.org/r/plugins/gitiles/ocl/org.eclipse.ocl/+/refs/… 中查看完整 AST 的一些示例
    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多