gpt4 book ai didi

parsing - 解释器如何使用 DSL?

转载 作者:行者123 更新时间:2023-12-04 06:20:54 24 4
gpt4 key购买 nike

我正在为我的领域特定语言使用解释器而不是编译器(尽管性能如此)。我正在努力理解一些概念:

假设我有一个游戏的 DSL(XML 样式),以便开发人员可以轻松构建对象:

<building>
<name> hotel </name>
<capacity> 10 </capacity>
</building>

DSL 脚本被解析,然后会发生什么?

它是否执行用于创建新建筑物的现有方法?据我了解,它不是简单地将 DSL 转换为较低级别的语言(因为这需要编译)。

有人可以描述一下解释器会对生成的解析树做什么吗?

感谢您的帮助。

最佳答案

在很大程度上取决于您的特定应用程序详细信息。例如,是 namecapacity必需的?我将给出一个相当笼统的答案,这可能有点矫枉过正。

假设:

  • 所有嵌套属性都是可选的
  • 有许多嵌套属性,可能具有不同的深度

  • 这带来了 2 个想法:将您的解释器构建为递归下降解析器,并为您的对象使用某种构建器。在您的具体示例中,您将有一个 BuildingBuilder看起来像(在 Java 中):
    public class BuildingBuilder {
    public BuildingBuilder() { ... }
    public BuildingBuilder setName(String name) { ... return this; }
    public BuildingBuilder setCapacity(int capacity) { ... return this; }
    ...
    public Building build() { ... }
    }

    现在,当您的解析器遇到 building元素,使用 BuildingBuilder build 建筑物。然后将该对象添加到 DSL 适用的任何上下文( city.addBuilding(building) )。

    注意,如果 namecapacity是详尽的并且总是需要的,您可以通过直接传递两个参数来创建建筑物。您还可以构建建筑物并直接设置所遇到的属性,而不是使用构建器(当您有许多属性并且所述属性既不可变又可选时,构建器模式非常好)。

    如果这是在非面向对象的上下文中,您将最终实现某种 buildBuilding 函数,该函数采用当前上下文和构建元素的内部 xml。实际上,您正在使用 xml 库手动构建递归下降解析器,该库提供对单个元素的实际解析。

    不管你如何实现它,你可能会喜欢在 DSL 中的 xml 元素和解释器中的方法/对象之间有直接的语义映射。

    关于parsing - 解释器如何使用 DSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6586230/

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