【发布时间】:2018-09-16 15:19:53
【问题描述】:
我在理解ECMAScript 2017 规范中Lexical Grammar 和Syntactic Grammar 之间的具体区别时遇到了一些困难。
ECMAScript 2017 节选
5.1.2 词法和正则表达式语法
ECMAScript 的词汇语法在第 11 节中给出。这个语法 终结符 Unicode 代码点 符合 10.1 中定义的 SourceCharacter 规则。它定义了一组 产生式,从目标符号 InputElementDiv 开始, InputElementTemplateTail,或 InputElementRegExp,或 InputElementRegExpOrTemplateTail,描述这样的序列如何 代码点被转换为一系列输入元素。
除空格和 cmets 以外的输入元素构成终端 ECMAScript 句法文法的符号,被称为 ECMAScript 令牌。这些标记是保留字、标识符、 ECMAScript 语言的文字和标点符号。
5.1.4 句法语法
将代码点流解析为 ECMAScript 脚本时 或模块,它首先通过以下方式转换为输入元素流 词汇语法的重复应用;这个输入流 元素然后由句法的单个应用程序解析 语法。
问题
-
词汇语法
- 这里说终端符号是 Unicode 代码点(单个字符)
- 它还说它产生输入元素(又名令牌)
- 这些如何调和?终端符号要么是令牌,因此它会产生令牌。或者,终端符号是单独的代码点,这就是它产生的。
-
句法语法
- 我对这个语法和词汇语法有同样的问题
- 好像说这里的终端符号是记号
- 那么通过应用句法语法规则,产生了有效的标记,然后可以将其发送到解析器?或者,此语法是否接受令牌作为输入,然后测试整个令牌流的有效性?
我的最佳猜测
-
词法分析阶段
- 输入:代码点(源代码)
- 输出:应用词法产生式产生有效的标记(词位类型+值)作为输出
-
解析阶段
- 输入:令牌
-
输出:应用语法产生式 (CFG) 来确定所有标记是否一起表示有效流(即源代码作为一个整体是有效的
Script/Module)
【问题讨论】:
-
当它说 "... 以 Unicode 码点为终端符号..." 时,我认为它们的意思是传达一个或多个码点的“分组”如本段其余部分所述。它的编写方式有点令人困惑。
-
Crazy Train:不,每个终端符号都是一个 Unicode 代码点。
-
@Magnus 你真的应该接受Bergi的回答。它就在这个问题上,只是坐在这里,没有正确的答案被接受。
标签: parsing ecmascript-6 ecmascript-2017 ecma