# 一.编译阶段
前言
词法分析是将字符流(char steam)转换为记号流(token stream)。把输入的字符串分解为一些对编程语言有意义的代码块(词法单元)
javaScript 代码运行前有一个类似编译的过程即词法分析,词法分析主要有三步:
分析参数
分析变量的声明
分析函数的声明
案例代码
var answer = 6 * 7
1
# 1.词法分析(分词)
将 js 代码中的字符串分割为有意义的代码块,这些代码块我们可以称为“词法单元”。案例 (opens new window)
;[
{
type: "Keyword",
value: "var",
},
{
type: "Identifier",
value: "answer",
},
{
type: "Punctuator",
value: "=",
},
{
type: "Numeric",
value: "6",
},
{
type: "Punctuator",
value: "*",
},
{
type: "Numeric",
value: "7",
},
{
type: "Punctuator",
value: ";",
},
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 2.语法分析(解析)
将词法单元流转换成一颗抽象语法树(AST)。案例 (opens new window)
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "answer"
},
"init": {
"type": "BinaryExpression",
"operator": "*",
"left": {
"type": "Literal",
"value": 6,
"raw": "6"
},
"right": {
"type": "Literal",
"value": 7,
"raw": "7"
}
}
}
],
"kind": "var"
}
],
"sourceType": "script"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 3.代码生成
将上述代码包装成可以运行的代码
总结
将上一步的词法单元集合分析合并,最终转换为一个由元素逐级嵌套所组成的代表了程序语法结构的树,即抽象语法树(AST)