首页
学习
活动
专区
圈层
工具
发布

展开AST
EN

Stack Overflow用户
提问于 2015-01-02 12:09:07
回答 1查看 63关注 0票数 0

我正在设计一种保存文件格式,为了简单起见,它是YAML的一个子集,有3种基本类型,2种数据结构。

我的AST,用Scala写的:

代码语言:javascript
复制
sealed trait SaveElement

/**
 * Trait for save data primitives
 */
sealed trait SaveKey extends SaveElement
case class Integer(i: Long) extends SaveKey
case class FloatingPoint(f: Double) extends SaveKey
case class Str(s: String) extends SaveKey

case class SaveList(elems: SaveElement*) extends SaveElement
case class SaveHash(keyValuePairs: Map[SaveKey, SaveElement]) extends SaveElement

它是相当基本的,除了包装基本Scala类型之外,没有更多内容。考虑到我拥有的AST,我应该如何以一种希望简单的方式在我的程序中使用的具体类型和AST中的类型之间进行转换?

当然,我可能完全是错误的,在这种情况下,我也会感激任何指向正确方向的指示。

编辑了,在仔细考虑了我要问的内容之后,我得出了这样的结论:我想要做的是将AST解压缩为Scala类型。我想以一种不涉及将SaveElement类型转换到它们所必须的类的方式(因为首先就知道AST是如何构建的)来做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-02 16:51:30

一种可能的办法如下。

代码语言:javascript
复制
model = <result of parsing input>
extractElements(model)

其中:

代码语言:javascript
复制
def extractElements(mdl: Model): // or whatever your parser returns
    // Assuming the model contains a top-level collection of SaveElements
    // in a SaveList called 'elements'
    for (element <- mdl.elements.elems) {
        element match {
            case SaveMap(pairs) => // do something with the map
            case SaveList(elems) => // do something with the list
            ...
        }
    }

您可以修改此方法以满足您的需要。这就是你想要的吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27741989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档