前言
一直想聊一聊抽象语法树,但一直不知道如何下手。最近随意google的时候,突然发现一篇相当不错的文章。一个国外哥们写的。
原文出自《ASTforJavaScriptdevelopers》
本着“学习”精神变把他的文章拜读一番,然后翻译了一下。希望这个外国小哥哥不要打我,哈哈。
正文
为什么要谈AST(抽象语法树)?
如果你查看目前任何主流的项目中的devDependencies,会发现前些年的不计其数的插件诞生。我们归纳一下有:javascript转译、代码压缩、css预处理器、elint、pretiier,等。有很多js模块我们不会在生产环境用到,但是它们在我们的开发过程中充当着重要的角色。所有的上述工具,不管怎样,都建立在了AST这个巨人的肩膀上。
所有的上述工具,不管怎样,都建立在了AST这个巨人的肩膀上
我们定一个小目标,从解释什么是AST开始,然后到怎么从一般代码开始去构建它。我们将简单地接触在AST处理基础上,一些最流行的使用例子和工具。并且,我计划谈下我的js2flowchart项目,它是一个不错的利用AST的demo。OK,让我们开始吧。
什么是AST(抽象语法树)?
Itisahierarchicalprogramrepresentationthatpresentssourcecodestructureaccordingtothegrammarofaprogramminglanguage,eachASTnodecorrespondstoanitemofasourcecode.
估计很多同学会和图中的喵一样,看完这段官方的定义一脸懵逼。OK,我们来看例子:
这很简化
实际上,正真AST每个节点会有更多的信息。但是,这是大体思想。从纯文纯中,我们将得到树形结构的数据。每个条目和树中的节点一一对应。
那怎么从纯文本中得到AST呢?哇哦,我们知道当下的编译器都做了这件事前。那我们就看看一般的编译器怎么做的就可以了。
想做一款编译器是个比较消耗发量的事情,但幸运的是,我们无需贯穿编译器的所有知识点,最后将高级语言转译为二进制代码。我们只需要