ANTLR 树有必要吗?
在构建编译器(使用 ANTLR)时使用 AST 的目的是什么?有必要拥有一个吗?什么是所谓的 TreeParser 以及如何使用它?是否可以构建一个没有任何树的编译器?如果没有,有没有详细描述该主题的好的教程?
What is the purpose of using AST while building a compiler (with ANTLR). Is it necessary to have one? What is the so called TreeParser and how can one use it? Is it possible to build a compiler without any trees? If not, are there any good tutorials describing the topic in details?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
AST 可以让您将解析与其他编译器任务(名称绑定、类型检查、代码生成)分开——它比纯文本更方便地呈现程序的结构。当您进行绑定、类型检查或代码生成时,您关心的是结构而不是程序的文本布局。
对于非常简单的语言,可能可以在解析器操作中完成所有操作(ANTLR 参考有一个示例),但对于重要的编程语言,AST 是可行的方法。
(您不一定需要使用 ANTLR 树和树语法,在规则操作中您可以构建自己的数据结构)
如果您是 Java 人员,那么这篇关于 Eclipse 中的 Java AST 的教程可能会很有趣:
http://www.eclipse.org/articles/article .php?file=Article-JavaCodeManipulation_AST/index.html
AST lets you separate parsing from other compiler tasks (name binding, typechecking, code generation) -- it presents the structure of program more conveniently than plain text. When you do binding or typechecking or codegen then you care about structure not about textual layout of the program.
For really simple language it might be possible to do everyting in parser actions (ANTLR reference has an example), but for nontrivial programming languages, AST is the way to go.
(You don't necessarily need to use ANTLR trees and tree grammars, in rule actions you can construct and your own data structures)
If you're a Java guy, then this tutorial about Java AST in Eclipse might be interesting:
http://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation_AST/index.html