运行顺序
- 读入第一个代码段(js执行引擎并非一行一行地执行程序,而是一段一段地分析执行的)
- 做词法分析和语法分析,没错则解析成语法树,有错则报语法错误并跳转到步骤5
- 对var变量和function定义做预解析
- 执行代码段,有错则报错(比如变量未定义)
- 如果还有下一个代码段,则读入下一个代码段,重复步骤2
- 结束
注: javascript是按块执行, 但是不同块属于同一个全局作用域, 即块之间的变量和函数是可以共享的;
词法分析
-
词法文法
-
tokens: 文法终结符, 空白和注释之外的输入元素,如:ECMAScript语言的保留字,标识符,字面量,标点符号等
-
行结束符虽然不被视为tokens,但会成为输入元素流的一部分,用于引导处理自动插入分号
-
空白和单行注释会被简单的丢弃,不会出现在语法文法的输入元素的流中
-
词法文法有两个目标符。InputElementDiv 目标符用在允许除法 (/) 或除赋值 (/=) 运算符开始的语法文法上下文中。InputElementRegExp 目标符用在其他语法文法上下文。
-
-
词法分析
当一个字符流被解析为 ECMAScript 程序,它首先通过词法文法应用程序反复转换为一个输入元素流;然后再用一个语法文法应用程序解析这个输入元素流。当输入元素流没有更多 tokens 时,如果 tokens 不能解析为 Program 目标非终结符的单一实例,那么程序在语法上存在错误。
-
目标非终结符: TODO
语法分析
将词法分析阶段产生的记号, 生成语法树,如果无法生成,则报错;
- 符号表:记录变量、函数、类
- 语法树:程序结构的树形表示,将此树形结构生成中间代码
待续...