返回

用解析的语言:理解 ECMAScript 规范

前端

ECMAScript,它不是 JavaScript,然而却是 JavaScript 的基础,了解 JavaScript 就必须先弄懂 ECMAScript。想要深度理解 ECMAScript,就必须从它的规范入手。

ECMAScript 规范使用上下文无关文法(CFG)来定义语言,如果你还不熟悉,强烈建议在继续阅读本文之前先补习一下相关知识。规范中定义了四种文法:

  1. 词法文法:如何将 Unicode 码点(code points)转换为词法标记(lexical tokens)。
  2. 语法文法:定义了如何将词法标记组合成语法结构。
  3. 语义文法:规定了语法结构的含义。
  4. 模块文法:了如何将模块组合成更大的应用程序。

本文将重点介绍语法文法,因为它是理解 ECMAScript 规范的核心。

语法文法是一个递归文法,这意味着它引用了自己。这允许语言产生嵌套结构,例如函数调用和对象嵌套。文法由一系列产生式组成,每个产生式都有一个左部和一个右部。左部是一个非终结符,它表示语言中的一个语法结构。右部是一个符号序列,它可以是非终结符、终结符或两者兼有。

例如,以下是定义函数声明的产生式:

FunctionDeclaration :
  "function" Identifier "(" FormalParameterList? ")" "{" FunctionBody "}"

在这个产生式中,FunctionDeclaration 是左部,它表示一个函数声明。右部由几个符号组成:

  • "function" 是一个终结符,表示 function
  • Identifier 是一个非终结符,它表示函数名称。
  • "("")" 是终结符,表示圆括号。
  • FormalParameterList 是一个可选的非终结符,它表示函数的参数列表。
  • "{}" 是终结符,表示花括号。
  • FunctionBody 是一个非终结符,它表示函数的主体。

这个产生式告诉我们,一个函数声明由关键字 function、函数名称、可选的参数列表、花括号包围的函数主体组成。

通过使用产生式的递归应用,我们可以生成任意复杂的语法结构。这使得 ECMAScript 规范能够定义一门功能强大且表达丰富的语言。

理解 ECMAScript 规范的语法文法是理解 ECMAScript 语言的关键。如果你正在学习 ECMAScript,或者只是想加深对它的理解,我强烈建议你花时间研究规范。