我是编译器设计的新手,一直在看youtube系列视频的Ravindrababu。
我为了好玩而创建我自己的语言,并将其解析为抽象语法树(AST)。我的理解是,这些树可以移植,因为它们遵循与其他语言相同的结构。
如何创建一个可移植的AST?
边注:
发布于 2017-05-26 16:12:43
可移植性(无论如何定义)不太可能是构建AST的主要目标。很少(如果有的话)编译器框架提供了一个清晰的接口,允许使用外部AST,而且特定的AST结构往往被记录得很糟糕,并且可能会在没有通知的情况下更改。(即使它们都有详细的文档,典型AST实现的复杂性也是具有挑战性的。)
AST与语言的语法细节以及所使用的特定解析策略密切相关。虽然能够为多个任务重新使用AST是有用的--编译、编线、漂亮打印、交互编辑、静态分析等等--但这些不同用例的相互冲突的需求往往会增加复杂性。特别是在语言开发的最初阶段,您需要给自己很大的快速原型开发的空间。
移植AST最诱人的理由是使用其他语言作为目标,从而节省了编写代码的成本,等等。然而,在实践中,从您自己的AST生成另一种语言的文本表示通常比强制您的解析器使用外部AST更容易。更好的方法是针对一个有良好文档的虚拟机(LLVM、.Net IL、JVM等),这通常并不比生成C代码多多少。
您可能想看看LLVM万花筒教程 (虽然是用C++实现的,但第二节介绍了AST)。此外,您可能会发现这个问题在姐妹网站上有趣的阅读。最后,如果您要在Javascript中执行您的实现,那么您至少应该看看jison解析器生成器,它需要花费大量的精力来维护解析器和扫描器(这样就可以更容易地进行实验)。
https://stackoverflow.com/questions/44195531
复制相似问题