【问题标题】:Domain Specific Language, Standard File Format领域特定语言,标准文件格式
【发布时间】:2012-06-11 22:33:32
【问题描述】:

XML 是一种用于存储文档的良好文件格式:带有元数据的内容。 JSON 是一种很好的数据存储文件格式。

是否有类似的文件格式标准擅长编码操作?换句话说,是否有一种标准文件格式可以很好地编码小型轻量级特定领域的语言?我想到的是仅由字符串数据和不超过十几个简单命令组成的简单 DSL。我的语言包括以非常简单的方式(没有条件或循环)调用一个又一个命令。

目前,我使用 XML 对一系列操作进行编码,其中每个标记代表不同的命令。 SAX 解析器将每个元素作为函数调用分派。很难看;只是感觉不是一个优雅的解决方案。

理想情况下,我会在 python 中工作,而不是编写自己的解析器...试图从使用已建立的标准文件格式中获益。一个后备方案是使用 python 本身,但如果要找到一个与语言无关的标准,我当然更喜欢它。

【问题讨论】:

  • 文本文件怎么样?
  • S 表达式最接近 DSL 的潜在通用格式。
  • 我想我想知道为什么你不能使用 JSON?层次结构可以是带有字符串数据的命令。你能告诉我们你是如何在 XML 中做到这一点的吗?
  • 带有一些非常基本的 Lisp 方言(带有宏!)的 S 表达式应该没问题。
  • 基本上你是在描述一种简单的脚本语言。有许多脚本语言可供选择,包括 Python。如果你想让它更通用,我不明白你为什么不能只使用 JSON 列表,约定列表中的第一个元素是函数,列表中的其他元素是参数。跨度>

标签: python xml json standards dsl


【解决方案1】:

最后,我使用 S 表达式在 Python 中实现了一个简单的解释器。解析器很容易在网上找到(大约半页代码),并且可以通过使用函数装饰器使该语言的函数实现变得简单。

【讨论】:

    【解决方案2】:

    Qt 的 QML 框架通过扩展 QML language 元素集以包含由 C++ 对象支持的自定义元素,提供了通往 DSL development 的替代路径。 Python 绑定可通过PySide 获得。

    尽管 QML 主要用于 UI 开发,但 QML 可以扩展为表示任意对象树。

    例如,snippet 定义了一个新的 QML 元素 (PieChart),然后将其注册到 QML 系统并在 QML 语言中使用。

    import sys
    from PySide.QtCore import *
    from PySide.QtGui import *
    from PySide.QtDeclarative import *
    
    class PieChart (QDeclarativeItem):
       ... 
    

    PieChart 已在 QML 系统中注册:

     qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart');
    

    QML(DSL)端,我们可以导入使用PieChart:

    import Charts 1.0
    import Qt 4.7
    
    Item {
        ...
    
        PieChart {
            id: aPieChart
            anchors.centerIn: parent
            width: 100; height: 100
            name: "A simple pie chart"
            color: "red"
        }
     ...
    

    【讨论】:

      【解决方案3】:

      如果 XML 可以完成这项工作,但可读性是一个问题,那么它很可能是 YAML 的一个很好的用例。 (Python support)。

      关于“XML 尖括号税”有一个很好的CodingHorror post

      【讨论】:

      • 是的,DSL 的部分用途是它应该非常易于阅读和理解; YAML 会朝着这个方向发展。这里的许多其他建议解决了编码问题,但并没有真正使语言更易于阅读。谢谢。
      猜你喜欢
      • 2019-01-05
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多