2

我想找到一个树解析器生成器来帮助我为用 C++ 编写的编译器转换 AST。

经过一些快速研究后,我发现了 ANTLR(可以针对使用 C 而不是 C++)。我还发现一个网站警告不要将 ANTLR 与 C++ 一起使用:http ://www.bearcave.com/software/antlr/antlr_treeparse.html 。这篇文章也有十年的历史了,所以它的抱怨可能已经过时了。

无论如何,我想知道是否有任何替代方案,或者我是否坚持使用 ANTLR 或自己编写?

4

8 回答 8

4

还有很多其他的解析器生成器,但我不得不说,在对 ANTLR 不满多年之后,最新版本似乎还不错。

于 2009-06-04T03:39:03.483 回答
3

解析器需要来自词法分析器的预定义方式的输入标记流。对于树解析器,它需要定义 AST“流”以便它可以理解它。因此,您的解析器和词法分析器必须在接口上达成一致,并且您的树解析器和解析器也必须达成一致。

树解析允许您对 AST 树进行转换——我相信您知道这非常有用。我听说过的唯一 c/c++ 树解析器是iBurg。我没用过,我觉得tree parser多用在学术界。对于我见过的大多数应用程序,它们有一个 AST,它们直接在树上完成所有工作。这意味着他们还必须制定自己的匹配规则。

于 2009-06-04T03:50:43.957 回答
3

查看Spirit boost库,尤其是关于Parse Trees 和 AST的章节。

于 2009-06-04T04:19:16.040 回答
2

您也许可以使用Prop。它是一个 C++ 扩展,支持类似 ML 的代数数据类型和模式匹配。它有许多特性,使得用它编写编译器非常有趣。

使用模式匹配进行树转换要容易得多。

不幸的是,开发似乎已经死了,但它运作良好。我用它做了一个类似于 Scheme 的玩具语言,它真的很棒。我真的没有任何问题。

于 2009-06-10T23:25:33.040 回答
1

我们还使用 ANTLR 为我们的编译器生成 C++ 代码,没有问题。当然,ANTLR 不直接支持 C++,但这并不妨碍您在 C++ 中使用它。

ANTLR 还具有 GUI ANTLRWorks 的另一个优势,它允许您以可见的方式查看您的语法。当您正在开发语法时,这可能是一个很大的帮助。

最棒的是:它是免费的。:)(也就是说,它确实有助于购买这本书

于 2009-06-04T05:56:35.323 回答
1

我刚刚找到了这篇题为“Language Translation Using PCCTS and C++ (A Reference Guide)”的论文:http ://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.2.9850

(它同时引用了 ANTLR 和 Sorcerer,这是 ANTLR 在成为 ANTLR 之前的树解析器的名称)。这可能正是我需要的。

于 2009-06-04T03:40:56.073 回答
1

如果您已经有一个编译器并且您想要做的是使用一个库来遍历/转换您的 AST,我不确定 Antlr 是否可以处理它或旨在执行此操作。

在 Antlr 的正常使用中,AST 的设置是使用 Antlr 通过定义 lexer 和 parser 来完成的。然后可以在这个 AST 上定义 tree walkers 和转换。

于 2009-06-10T23:09:00.937 回答
0

您可以使用 ANTLR 生成 C 代码,然后可以从 C++ 调用这些代码。我认为如果您使用它来生成 C++ 代码本身可能会出现问题。即使在那里我真的不知道任何特定问题,我们正在使用 ANTLR 生成 C++ 代码而没有任何问题。

于 2009-06-04T03:38:23.843 回答