打开AST

时间:2015-01-02 12:09:08

标签: scala abstract-syntax-tree

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

我的AST,用Scala编写:

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是如何构建的)。 / p>

1 个答案:

答案 0 :(得分:0)

一种可能的方法如下。

model = <result of parsing input>
extractElements(model)

其中:

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
            ...
        }
    }

您可以修改此方法以满足您的需求。这就是你追求的目标吗?