【问题标题】:SVG parsing and data typeSVG解析和数据类型
【发布时间】:2016-01-19 08:25:56
【问题描述】:

我正在编写一个 SVG 解析器,主要是作为学习如何使用 Parsec 的练习。目前我正在使用以下数据类型来表示我的 SVG 文件:

data SVG = Element String [Attribute] [SVG]
         | SelfClosingTag [Attribute]
         | Body String
         | Comment String
         | XMLDecl String

这很好用,但是我不确定我的数据类型的 Element String [Attribute] [SVG] 部分。 由于 SVG 的潜在 tags 数量有限,因此我正在考虑使用类型来表示 SVG 元素而不是使用字符串。像这样的:

data SVG = Element TagName [Attribute] [SVG]
         | ...

data TagName = A
             | AltGlyph
             | AltGlyphDef
             ...
             | View
             | Vkern

这是个好主意吗?如果有的话,这样做有什么好处? 有没有更优雅的解决方案?

【问题讨论】:

    标签: parsing haskell types


    【解决方案1】:

    我个人更喜欢枚举所有可能的TagNames 的方法。这样,如果你犯了任何粗心的错误,编译器就会给你错误和警告。例如,如果我想编写一个涵盖Element 的所有可能类型的函数,那么如果在 ADT 中枚举了每种类型,编译器就会给你非详尽的匹配警告。如果将其表示为字符串,则这是不可能的。此外,如果我想匹配特定类型的Element,并且我不小心拼错了TagName,编译器会捕捉到它。第三个原因,可能在这里并不真正适用,但总的来说值得注意的是,如果我后来决定添加或删除TagName 的变体,那么编译器会告诉我每个需要修改的地方。我怀疑 SVG 标签名称会发生​​这种情况,但总的来说,这是需要牢记的。

    【讨论】:

      【解决方案2】:

      回答您的问题:

      您可以采用任何一种方式执行此操作,具体取决于您在创建解析树后要对其执行的操作。

      如果您对 SVG 解析器所做的只是描述 SGV 数据的形状,那么您只需使用字符串即可。

      另一方面,如果您想以某种方式将 SVG 数据转换为类似图形的东西(即您预期评估您的 AST),您会发现最好在类型系统中表示所有语义信息。这将使接下来的步骤变得更加容易。

      我心中的问题是解析过程是否正是实现这一目标的地方。 (完全公开,我对 SVG 只略知一二。)我怀疑,与其只是一个简单的标签列表,不如使用 Element 每个都有自己的一组必需和可选属性。如果这种转换“发生在程序的后面”,则无需创建 TagName 数据类型。您可以在将属性合并到Elements 的同时捕获所有类型错误。

      另一方面,可以提出一个很好的论据来直接解析成一个完整的元素树,在这种情况下,我将删除 Element 构造函数的通用 [Attribute][SVG] 字段,而是创建适当的字段在您的 TagName 构造函数中。


      你没有问的问题的另一个答案:

      尽早将源代码位置放入您的解析树中。根据个人经验,我可以告诉你,程序越大越难。

      【讨论】:

        猜你喜欢
        • 2018-02-04
        • 1970-01-01
        • 2020-01-12
        • 1970-01-01
        • 2020-10-16
        • 2010-12-21
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多