语法生成规则如何与 ECMAScript 中的解析相关

How grammar production rules relate to parsing in ECMAScript

Parsing 上的维基百科文章所述,该过程分为三个阶段:

  1. Lexical analysis(标记化):将 Unicode 代码点转换为标记
  2. 句法分析:验证令牌流形成有效的脚本/模块,并创建解析树
  3. 语义分析:令牌的额外验证(在创建解析树后发生?)

除了上面阶段 (3) 中的小混乱,我想验证我对过程的理解是否正确 ECMAScript

那么,下面的流程对吗?


词法分析阶段 (ECMAScript Clause 11)


语法分析阶段(ECMAScript 条款 12-15)

语法分析不遵守“最大匹配”规则(select最长匹配前缀)。事实上,据我所知,ECMA-262 没有指定解析算法,但确实提供了可以解析的明确的上下文无关语法,例如使用自下而上的 (LR(k)) 解析器,除了一些处理自动分号插入的问题以及对跨越换行符(不是语法标记)的产品的一些限制。

然而,正如§5.1.4中提到的,文法实际上识别语言的一个超集;附加限制以补充语法的形式提供。

一个澄清:与具有多个上下文相关的词汇目标符号相关的复杂性使得很难首先将输入划分为词素,然后才将词素组合成解析树。如果没有至少部分解析,就不可能知道每个点的正确词法目标符号,因此交错句法解析和词法解析很方便。实用的语法分析算法是从左到右运行的,基本按输入顺序处理词素,因此可以按需进行词法分析,只有在分析器需要更多输入时才找到词素才能继续。

但除此之外,您概述的整体结构是正确的。在词法分析中,终端(字符)的最长可能前缀被聚合成一个非终端以创建一个词素(根据关于需要哪个词法目标的稍微复杂的规则);在句法分析中,终结符(词素)被聚合成非终结符以生成与两个句法目标符号之一对应的单个分析树。

就像现实世界中的语言一样,现实并不像那样干净。除了需要解析器指出需要哪个词法目标外,还有换行规则和自动分号插入,两者都跨越了词法和句法解析之间的界限。


注:

“终端”和“非终端”这两个词的使用可能有点令人困惑,但我(和 ECMA 标准)在上下文无关语法中以标准含义使用它们。

上下文无关文法由产生式组成,每个产生式都具有以下形式:

N ⇒ S …

其中 N 是一个 非终结符 符号,而 S 是一个可能为空的终结符或非终结符序列。终端符号是要识别的字符串表示中的原子。

标准解析模型将解析分为词法和句法两个层次。原始输入是一个字符序列;词法分析将其转换为一系列词素,这些词素是句法分析的输入。

标准的上下文无关文法只有一个目标符号,它是文法定义的非终结符之一。如果可以将整个输入简化为这个非终结符,则解析成功。

词法扫描可以被视为具有目标符号有序列表的上下文无关文法。它依次尝试每个目标符号连续输入更长的前缀,并接受匹配最长前缀的第一个目标符号。 (在实践中,这一切都是并行完成的;我在这里从概念上讲。)当 ECMA-262 谈论不同的词法目标时,它实际上意味着可能的目标非终结符的不同列表。

用语义属性扩充符号也很有用;这些属性不影响解析,但一旦解析完成它们就很有用。特别是,解析树是通过将树节点作为属性附加到解析期间从产生式创建的每个非终结符来构建的,因此解析的最终结果不是非终结符本身(之前已知解析开始)而是附加到非终端的特定实例的语义属性,而每个点的词法扫描结果是一个非终端符号及其相关的语义属性;通常,语义属性将是关联的输入序列,或这些字符的某些功能。

无论如何,二级解析涉及将词法级别的输出非终结符作为句法级别的终结符。