我在理解ECMAScript 2017规范中Lexical Grammar
和Syntactic Grammar
之间的具体差异时遇到了一些困难。
5.1.2 Lexical和RegExp Grammars
ECMAScript的词汇语法在第11节中给出。这个语法 具有符合的终端符号Unicode代码点 10.1中定义的SourceCharacter规则。它定义了一组 制作,从目标符号InputElementDiv开始, InputElementTemplateTail,或InputElementRegExp,或 InputElementRegExpOrTemplateTail,描述如何序列 代码点被转换为一系列输入元素。
除了空格和注释之外的输入元素构成终端 ECMAScript语法语法的符号被称为 ECMAScript令牌。这些令牌是保留字,标识符, 文字和ECMAScript语言的标点符号。
5.1.4语法语法
当要将代码点流解析为ECMAScript脚本时 或模块,它首先被转换为输入元素流 重复应用词汇语法;这个输入流 然后,单个元素应用程序解析元素 语法。
Script
/ {{ 1}})答案 0 :(得分:2)
我认为你对terminal symbol的含义感到困惑。实际上它们是解析器的输入,而不是输出(这是一个解析树 - 包括列表的退化情况)。
另一方面,生产规则确实有终端符号作为输出,目标符号作为输入 - 它是向后的,这就是术语“终端”的来源。非终端可以扩展(以不同的方式,这是规则所描述的)到一系列终端符号。
示例:
Language:
S -> T | S '_' T
T -> D | T D
D -> '0' | '1' | '2' | … | '9'
String:
12_45
Production:
S // start: the goal
= S '_' T
= T '_' T
= T D ' ' T
= T '2 ' T
= D '2 ' T
= '12 ' T
= '12 ' T D
= '12 ' T '5'
= '12 ' D '5'
= '12_45' // end: the terminals
Parse tree:
S
S
T
T
D
'1'
D
'2'
' '
T
T
D
'4'
D
'5'
Parser output (generating a sequence of items from top-level Ts):
'12'
'45'
所以
答案 1 :(得分:1)
你最好的猜测"对于第一个近似是正确的。主要的修正是改变标记"到"输入元素"。也就是说,词汇级别产生输入元素(其中只有一些被指定为#39;令牌'),语法级别将输入元素作为输入。
语法级别几乎忽略不是令牌的输入元素,除了自动分号插入规则要求它注意空格和注释中的行终止符。
你的"这些如何可以调和?"问题似乎源于对"终端符号"的误解。或"产生",但我不清楚哪个。