表示和构建循环抽象语法树

时间:2013-10-13 13:11:33

标签: haskell data-structures typeclass

我是一位具有迫切背景的新手Haskell程序员。

我正在编写一个解析具有循环的抽象语法树(或更确切地说是图形)的程序。 (这实际上是GCC的通用AST)。我正在设计用于表示此图表的数据类型,但我遇到了困难:

首先,GCC AST中存在许多令人讨厌的循环。例如,类型声明引用实际类型描述符,它引用类型的声明(此声明有时可能与原始声明不同,有时它只是对标识符节点的引用)。所有树节点都引用所谓的上下文节点(父引用的一种形式)。但是,此上下文节点(对于某些节点X)通常与最初引用X的节点不同。例如,可以从C ++命名空间节点找到某个内置函数的声明,但函数声明的上下文指向a翻译单位申报。 Perhpas这使得拉链不可能?此外,我不能忽略这些上下文节点,因为它们对于找出声明的范围很有用。

因此,在设计数据结构时,我应该考虑到这样一个事实,即有时我不知道我将在运行时处理哪种节点。但是,当我确定一个节点将具有已知类型时,我希望能够在类型级别上反映这一点并利用静态类型检查(例如,函数的结果类型始终是类型,而不是整数常量,但它可能是整数或指针类型等。)。

其次,GCC树是面向对象意义上的分层数据类型。所有节点都有共同的信息,例如它们是什么类型的节点。所有声明都有一个名称和许多标志,而变量声明还有类型信息。许多节点拥有如此多的数据,仅通过模式匹配来访问此信息是不方便的。所以我很可能会使用访问器函数(和类型类来提供统一的接口,无论节点类型如何)。

第三,我希望我的图表纯粹是功能性的,但我不知道如何构建它。我的输入是文本,每个节点都有一个部分。节点由唯一ID标识,并且有许多前向和自引用。

所以,凭借我的背景,我意识到我正试图强迫我的Haskell界面成为命令式的形式。所以我要求你提供一些具体的建议来指导我设计我的数据类型,它们的界面以及如何构建图形。

到目前为止,我已经决定不打算打结。它会阻止我对树进行转换(IMHO值得进行一些转换)。如果有一天我想这样做,它也会很难把这棵树写回光盘。

编辑: 这是我输入的一个示例。它在YAML中,但格式还没有确定(我在GCC中生成这些数据)。 http://sange.fi/~aura/test.yaml该示例包含具有一个函数声明的全局命名空间(int main(int argc,char * argv []))。

提前致谢!

0 个答案:

没有答案