AST抽象语法树(Abstract Syntax Tree)

AST抽象语法树(Abstract Syntax Tree)

一、AST抽象语法树是什么?

抽象语法树(Abstract Syntax Tree),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。抽象语法树并不依赖于源语言的语法,也就是说语法分析阶段所采用的上下文无文文法,因为在写文法时,经常会对文法进行等价的转换(消除左递归,回溯,二义性等),这样会给文法分析引入一些多余的成分,对后续阶段造成不利影响,甚至会使合个阶段变得混乱。因些,很多编译器经常要独立地构造语法分析树,为前端,后端建立一个清晰的接口

二、例子

工具https://astexplorer.net/

1、简单的定义一个变量
var a = 10;

抽象语法树

{
    
    
  "type": "Program",
  "start": 0,
  "end": 11,
  "body": [
    {
    
    
      "type": "VariableDeclaration",
      "start": 0,
      "end": 11,
      "declarations": [
        {
    
    
          "type": "VariableDeclarator",
          "start": 4,
          "end": 10,
          "id": {
    
    
            "type": "Identifier",
            "start": 4,
            "end": 5,
            "name": "a"
          },
          "init": {
    
    
            "type": "Literal",
            "start": 8,
            "end": 10,
            "value": 10,
            "raw": "10"
          }
        }
      ],
      "kind": "var"
    }
  ],
  "sourceType": "module"
}
2、四则运算
1+3*(4-1)+2

抽象语法树

{
    
    
  "type": "Program",
  "start": 0,
  "end": 11,
  "body": [
    {
    
    
      "type": "ExpressionStatement",
      "start": 0,
      "end": 11,
      "expression": {
    
    
        "type": "BinaryExpression",
        "start": 0,
        "end": 11,
        "left": {
    
    
          "type": "BinaryExpression",
          "start": 0,
          "end": 9,
          "left": {
    
    
            "type": "Literal",
            "start": 0,
            "end": 1,
            "value": 1,
            "raw": "1"
          },
          "operator": "+",
          "right": {
    
    
            "type": "BinaryExpression",
            "start": 2,
            "end": 9,
            "left": {
    
    
              "type": "Literal",
              "start": 2,
              "end": 3,
              "value": 3,
              "raw": "3"
            },
            "operator": "*",
            "right": {
    
    
              "type": "BinaryExpression",
              "start": 5,
              "end": 8,
              "left": {
    
    
                "type": "Literal",
                "start": 5,
                "end": 6,
                "value": 4,
                "raw": "4"
              },
              "operator": "-",
              "right": {
    
    
                "type": "Literal",
                "start": 7,
                "end": 8,
                "value": 1,
                "raw": "1"
              }
            }
          }
        },
        "operator": "+",
        "right": {
    
    
          "type": "Literal",
          "start": 10,
          "end": 11,
          "value": 2,
          "raw": "2"
        }
      }
    }
  ],
  "sourceType": "module"
}

三、作用

描述静态分析的程序语法(静态分析是在不需要执行代码的前提下对代码进行分析的处理过程 (执行代码的同时进行代码分析即是动态分析)。 静态分析的目的是多种多样的, 它可用于语法检查,编译,代码高亮,代码转换,优化,压缩等等场景。








坐得住板凳,耐得住寂寞,守得住初心!

猜你喜欢

转载自blog.csdn.net/weixin_40352715/article/details/109778211