我想找一个树解析器生成器来帮助我转换用C ++编写的编译器的AST。
经过一些快速研究后,我发现了ANTLR(可以针对C而不是C ++)。我还发现一个网站警告不要使用带有C ++的ANTLR:http://www.bearcave.com/software/antlr/antlr_treeparse.html。这篇文章也已经十年了,所以也许它的抱怨已经过时了。
无论如何,我想知道的是,有没有其他选择,或者我是否坚持使用ANTLR或自己编写?
答案 0 :(得分:4)
有plenty of other parser generators,但我不得不说,多年来对ANTLR不满意后,最新版本似乎还不错。
答案 1 :(得分:3)
解析器需要来自词法分析器的预定义方式的输入令牌流。对于树解析器,它需要定义AST'stream'以便它能够理解它。因此,您的解析器和词法分析器必须在接口上达成一致,并且您的树解析器和解析器也必须同意。
树解析允许你对AST树进行转换 - 我相信你知道它非常有用。我听说过唯一的c / c ++树解析器是iBurg。我没有使用它,我认为树解析器主要用于学术界。对于我见过的大多数应用程序,他们有一个AST,他们直接在树上完成所有工作。这意味着他们还必须做自己的匹配规则。
答案 2 :(得分:3)
查看spirit boost库,尤其是关于Parse Trees and ASTs的章节。
答案 3 :(得分:2)
您可以使用Prop。它是一个C ++扩展,支持类似ML的代数数据类型和模式匹配。它具有许多功能,使编写编译器非常有趣。
使用模式匹配,树变换更容易。
不幸的是,开发似乎已经死了,但它的效果非常好。我用它做了一个类似玩具Scheme的语言,它真的很棒。我没有遇到任何问题。
答案 4 :(得分:1)
我刚发现这篇论文题为“使用PCCTS和C ++进行语言翻译(参考指南)”:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.2.9850
(它引用了ANTLR和Sorcerer,它是ANTLR之前ANTLR的树解析器的名称)。这可能正是我所需要的。
答案 5 :(得分:1)
我们还使用ANTLR为我们的编译器生成C ++代码,没有问题。当然,ANTLR不直接支持C ++,但从技术上讲,这并不妨碍你在C ++中使用它。
ANTLR还具有GUI ANTLRWorks的另一个优势,它允许您查看语法。在开发语法时,这可以提供很大的帮助。
最重要的是:它是免费的。 :)(说,它确实有助于购买book)
答案 6 :(得分:1)
如果你已经有了一个编译器,你想要做的就是使用一个库来遍历/转换你的AST我不确定Antlr是否可以处理它或者是为了这个而设计的。
在Antlr的正常使用中,通过定义词法分析器和解析器,使用Antlr完成AST的设置。然后可以在此AST上定义树行者和转换。
答案 7 :(得分:0)
您可以使用ANTLR生成C代码,然后可以从C ++调用它。我认为如果您使用它来生成C ++代码本身可能会出现问题。即便在那里我也不知道任何特定问题,我们使用ANTLR生成C ++代码而没有任何问题。