我在理解ECMAScript 2017Lexical Grammar
规范之间Syntactic Grammar
的具体区别时遇到了一些困难。
ECMAScript 2017 节选
5.1.2 词法和正则表达式文法
第 11 节给出了 ECMAScript 的词法文法。该文法的终端符号是符合 10.1 中定义的 SourceCharacter 规则的 Unicode 代码点。它定义了一组产生式,从目标符号 InputElementDiv、InputElementTemplateTail 或 InputElementRegExp 或 InputElementRegExpOrTemplateTail 开始,描述如何将这些代码点序列转换为输入元素序列。
除空格和注释之外的输入元素构成 ECMAScript 句法语法的终端符号,称为 ECMAScript 标记。这些标记是 ECMAScript 语言的保留字、标识符、文字和标点符号。
5.1.4 句法文法
当一个码位流被解析为一个ECMAScript Script或Module时,首先通过词法文法的重复应用将其转换为输入元素流;然后,该输入元素流由句法语法的单个应用程序解析。
问题
- 词汇语法
- 这里它说终端符号是Unicode代码点(单个字符)
- 它还说它产生输入元素(又名令牌)
- 这些如何调和?终端符号要么是令牌,因此它会产生令牌。或者,终端符号是单独的代码点,这就是它产生的。
- 句法语法
- 我对这个语法和词汇语法有同样的问题
- 好像说这里的终端符号是token
- 那么通过应用句法语法规则,产生了有效的标记,然后可以将其发送到解析器?或者,这个语法是否接受令牌作为输入,然后测试整个令牌流的有效性?
我最好的猜测
- 词法阶段
- 输入:代码点(源代码)
- 输出:应用词法产生式产生有效的记号(词位类型+值)作为输出
- 解析阶段
- 输入:代币
- 输出:应用句法文法产生 (CFG) 来确定所有标记是否一起表示一个有效的流(即源代码作为一个整体是一个有效的
Script
/Module
)