Skip to content

1.什么是AST?

在计算机科学中,抽象语法树(Abstract Syntax Tree)一般也被称之为语法树。是对源代码语法的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每一个节点都是源代码中的结构的抽象。

我们可以在astexploer这个工具网站上面,看到针对于每一种语言都有一个对应的解析器。我特意找看了一下没有单独为React准备一个解析器,但是在babel这种转换器中,我赫然发现了JSXElement这种结构类型。我终于认识到了Vue和React的深层次的差异。

Vue是走的模板语法,它不得不使用解析器将.vue文件转换为.js类型的文件。所以才会有vue-loader这种转换器。

image-20230401164048774

image-20230401164417532

javascript进行解析的解析器里面,我发现了一些老熟人。就是我们经常在博客里面看到的,出场率比较高的一些热词。

  1. acron
  2. @babel/eslint-parser
  3. @babel/parer
  4. typescript

为什么AST可以做一些比较高难度的东西,我觉得它是从javascript最底层的设计处出发,涉及到了执行环境、语法、词法、声明等一系列内容。它将人能看懂的代码翻译成为机器能看懂的TOKEN,并且在翻译的过程中,支持开发者做某一些操作的入口。

Acorn 具体有哪些应用?

  1. JavaScript静态分析:静态分析指在不运行代码的情况下分析程序,它可以帮助开发人员检测代码中的错误、优化代码,或者更好地理解代码的结构和执行过程。Acorn可以将JavaScript代码解析为抽象语法树(AST),开发人员可以利用AST进行静态分析。

  2. JavaScript转换器:在开发过程中,有时需要将JavaScript代码从一种形式转换为另一种形式,比如将ES6代码转换为ES5代码。Acorn在转换过程中可以将源代码解析为AST,然后对AST进行修改操作,最终将其转换为目标代码。这个过程在Babel等工具中得到广泛应用。

  3. 代码格式化:在项目中,不同的团队成员可能有着不同的代码风格,为了保证代码风格一致,可能需要进行代码格式化。在这个过程中,代码需要被解析为AST,然后进行修改以符合特定的代码风格要求。Acorn可以将代码解析为AST,然后结合工具比如Prettier来实现代码格式化。

  4. 漏洞检测:Web应用程序存在各种漏洞,如跨站脚本攻击、SQL注入等。通过使用Acorn从代码中提取数据流和控制流信息,开发人员可以实施静态分析和代码审查,自动地检测这些漏洞,并打上漏洞标记。

​ --- ChatGPT

js的节点类型

我试着对比了一下acorn与babel两个js解析器的节点类型,下面是列出来的节点对比,我猜想不同的解析器和版本之间可能会有一些细微的变化。

其中,有一个非常明显的差别,大家可以直接看出来,网站示例的第一段是一段注释,在babel中存在一个CommentBlock节点来表达注释,而在acorn中直接省略了注释。

类型AcornBabel
标识符(Identifier)IdentifierIdentifier
字面量(Literal)LiteralNumericLiteralStringLiteral RegExpLiteral
表达式语句(ExpressionStatement)ExpressionStatementExpressionStatement
块语句(BlockStatement)BlockStatementBlockStatement
函数声明(FunctionDeclaration)FunctionDeclarationFunctionDeclaration
函数表达式(FunctionExpression)FunctionExpressionFunctionExpression
二元表达式(BinaryExpression)BinaryExpressionBinaryExpression
变量声明(VariableDeclaration)VariableDeclarationVariableDeclaration
变量声明符(VariableDeclarator)VariableDeclaratorVariableDeclarator
运算符(UnaryExpression)UnaryExpressionUnaryExpression
箭头函数表达式(ArrowFunctionExpression)ArrowFunctionExpressionArrowFunctionExpression
对象表达式(ObjectExpression)ObjectExpressionObjectExpression
对象属性(Property)PropertyObjectProperty, ObjectMethod
数组表达式(ArrayExpression)ArrayExpressionArrayExpression
条件表达式(ConditionalExpression)ConditionalExpressionConditionalExpression
调用表达式(CallExpression)CallExpressionCallExpression
返回语句(ReturnStatement)ReturnStatementReturnStatement
if语句(IfStatement)IfStatementIfStatement
for循环语句 (ForStatement)ForStatementForStatement

MIT License.