语法生成规则如何与 ECMAScript 中的解析相关
How grammar production rules relate to parsing in ECMAScript
如 Parsing 上的维基百科文章所述,该过程分为三个阶段:
- Lexical analysis(标记化):将 Unicode 代码点转换为标记
- 句法分析:验证令牌流形成有效的脚本/模块,并创建解析树
- 语义分析:令牌的额外验证(在创建解析树后发生?)
除了上面阶段 (3) 中的小混乱,我想验证我对过程的理解是否正确 ECMAScript。
那么,下面的流程对吗?
词法分析阶段 (ECMAScript Clause 11)
- 输入:Unicode 代码点流 <-- 词法文法中的终结符号
- 输出:有效标记 <-- 词法文法中的非终结符号
- 语法的应用
- 分析每个 Unicode 代码点(字符),一次分析一个
- 通过应用合适的生产规则,可能的最长终止符号序列被替换为非终止符号
- 然后,再次通过应用生产规则替换最长可能的非终结符号序列
- 以同样的方式,一次又一次地应用生产规则,一直到生产出 "goal symbol(s)"
- 目标符号是句法分析阶段(下一阶段)的输入元素(又名标记)
- ECMAScript 的词法语法存在多个 "goal symbols" (spec states which to pick)
语法分析阶段(ECMAScript 条款 12-15)
- 输入:标记流 <-- 句法文法中的终结符号
- 输出:解析树,以脚本|模块为根解析节点 <-- 句法文法中的非终结符号
- 语法的应用
- 从输入元素流开始,又名。代币
- 这些标记是语法语法中的终结符号
- 通过将最大符号流与合适的产生式规则的 RHS 匹配来应用产生式规则,然后用该规则的 LHS 非终结符号替换流
- 这一直持续到只剩下 "goal symbol"
- ECMAScript:如果我们可以替换所有终端符号(令牌),程序是有效的,以单个 "goal symbol"(脚本 | 模块)
结束
语法分析不遵守“最大匹配”规则(select最长匹配前缀)。事实上,据我所知,ECMA-262 没有指定解析算法,但确实提供了可以解析的明确的上下文无关语法,例如使用自下而上的 (LR(k)) 解析器,除了一些处理自动分号插入的问题以及对跨越换行符(不是语法标记)的产品的一些限制。
然而,正如§5.1.4中提到的,文法实际上识别语言的一个超集;附加限制以补充语法的形式提供。
一个澄清:与具有多个上下文相关的词汇目标符号相关的复杂性使得很难首先将输入划分为词素,然后才将词素组合成解析树。如果没有至少部分解析,就不可能知道每个点的正确词法目标符号,因此交错句法解析和词法解析很方便。实用的语法分析算法是从左到右运行的,基本按输入顺序处理词素,因此可以按需进行词法分析,只有在分析器需要更多输入时才找到词素才能继续。
但除此之外,您概述的整体结构是正确的。在词法分析中,终端(字符)的最长可能前缀被聚合成一个非终端以创建一个词素(根据关于需要哪个词法目标的稍微复杂的规则);在句法分析中,终结符(词素)被聚合成非终结符以生成与两个句法目标符号之一对应的单个分析树。
就像现实世界中的语言一样,现实并不像那样干净。除了需要解析器指出需要哪个词法目标外,还有换行规则和自动分号插入,两者都跨越了词法和句法解析之间的界限。
注:
“终端”和“非终端”这两个词的使用可能有点令人困惑,但我(和 ECMA 标准)在上下文无关语法中以标准含义使用它们。
上下文无关文法由产生式组成,每个产生式都具有以下形式:
N ⇒ S …
其中 N
是一个 非终结符 符号,而 S
是一个可能为空的终结符或非终结符序列。终端符号是要识别的字符串表示中的原子。
标准解析模型将解析分为词法和句法两个层次。原始输入是一个字符序列;词法分析将其转换为一系列词素,这些词素是句法分析的输入。
标准的上下文无关文法只有一个目标符号,它是文法定义的非终结符之一。如果可以将整个输入简化为这个非终结符,则解析成功。
词法扫描可以被视为具有目标符号有序列表的上下文无关文法。它依次尝试每个目标符号连续输入更长的前缀,并接受匹配最长前缀的第一个目标符号。 (在实践中,这一切都是并行完成的;我在这里从概念上讲。)当 ECMA-262 谈论不同的词法目标时,它实际上意味着可能的目标非终结符的不同列表。
用语义属性扩充符号也很有用;这些属性不影响解析,但一旦解析完成它们就很有用。特别是,解析树是通过将树节点作为属性附加到解析期间从产生式创建的每个非终结符来构建的,因此解析的最终结果不是非终结符本身(之前已知解析开始)而是附加到非终端的特定实例的语义属性,而每个点的词法扫描结果是一个非终端符号及其相关的语义属性;通常,语义属性将是关联的输入序列,或这些字符的某些功能。
无论如何,二级解析涉及将词法级别的输出非终结符作为句法级别的终结符。
如 Parsing 上的维基百科文章所述,该过程分为三个阶段:
- Lexical analysis(标记化):将 Unicode 代码点转换为标记
- 句法分析:验证令牌流形成有效的脚本/模块,并创建解析树
- 语义分析:令牌的额外验证(在创建解析树后发生?)
除了上面阶段 (3) 中的小混乱,我想验证我对过程的理解是否正确 ECMAScript。
那么,下面的流程对吗?
词法分析阶段 (ECMAScript Clause 11)
- 输入:Unicode 代码点流 <-- 词法文法中的终结符号
- 输出:有效标记 <-- 词法文法中的非终结符号
- 语法的应用
- 分析每个 Unicode 代码点(字符),一次分析一个
- 通过应用合适的生产规则,可能的最长终止符号序列被替换为非终止符号
- 然后,再次通过应用生产规则替换最长可能的非终结符号序列
- 以同样的方式,一次又一次地应用生产规则,一直到生产出 "goal symbol(s)"
- 目标符号是句法分析阶段(下一阶段)的输入元素(又名标记)
- ECMAScript 的词法语法存在多个 "goal symbols" (spec states which to pick)
语法分析阶段(ECMAScript 条款 12-15)
- 输入:标记流 <-- 句法文法中的终结符号
- 输出:解析树,以脚本|模块为根解析节点 <-- 句法文法中的非终结符号
- 语法的应用
- 从输入元素流开始,又名。代币
- 这些标记是语法语法中的终结符号
- 通过将最大符号流与合适的产生式规则的 RHS 匹配来应用产生式规则,然后用该规则的 LHS 非终结符号替换流
- 这一直持续到只剩下 "goal symbol"
- ECMAScript:如果我们可以替换所有终端符号(令牌),程序是有效的,以单个 "goal symbol"(脚本 | 模块) 结束
语法分析不遵守“最大匹配”规则(select最长匹配前缀)。事实上,据我所知,ECMA-262 没有指定解析算法,但确实提供了可以解析的明确的上下文无关语法,例如使用自下而上的 (LR(k)) 解析器,除了一些处理自动分号插入的问题以及对跨越换行符(不是语法标记)的产品的一些限制。
然而,正如§5.1.4中提到的,文法实际上识别语言的一个超集;附加限制以补充语法的形式提供。
一个澄清:与具有多个上下文相关的词汇目标符号相关的复杂性使得很难首先将输入划分为词素,然后才将词素组合成解析树。如果没有至少部分解析,就不可能知道每个点的正确词法目标符号,因此交错句法解析和词法解析很方便。实用的语法分析算法是从左到右运行的,基本按输入顺序处理词素,因此可以按需进行词法分析,只有在分析器需要更多输入时才找到词素才能继续。
但除此之外,您概述的整体结构是正确的。在词法分析中,终端(字符)的最长可能前缀被聚合成一个非终端以创建一个词素(根据关于需要哪个词法目标的稍微复杂的规则);在句法分析中,终结符(词素)被聚合成非终结符以生成与两个句法目标符号之一对应的单个分析树。
就像现实世界中的语言一样,现实并不像那样干净。除了需要解析器指出需要哪个词法目标外,还有换行规则和自动分号插入,两者都跨越了词法和句法解析之间的界限。
注:
“终端”和“非终端”这两个词的使用可能有点令人困惑,但我(和 ECMA 标准)在上下文无关语法中以标准含义使用它们。
上下文无关文法由产生式组成,每个产生式都具有以下形式:
N ⇒ S …
其中 N
是一个 非终结符 符号,而 S
是一个可能为空的终结符或非终结符序列。终端符号是要识别的字符串表示中的原子。
标准解析模型将解析分为词法和句法两个层次。原始输入是一个字符序列;词法分析将其转换为一系列词素,这些词素是句法分析的输入。
标准的上下文无关文法只有一个目标符号,它是文法定义的非终结符之一。如果可以将整个输入简化为这个非终结符,则解析成功。
词法扫描可以被视为具有目标符号有序列表的上下文无关文法。它依次尝试每个目标符号连续输入更长的前缀,并接受匹配最长前缀的第一个目标符号。 (在实践中,这一切都是并行完成的;我在这里从概念上讲。)当 ECMA-262 谈论不同的词法目标时,它实际上意味着可能的目标非终结符的不同列表。
用语义属性扩充符号也很有用;这些属性不影响解析,但一旦解析完成它们就很有用。特别是,解析树是通过将树节点作为属性附加到解析期间从产生式创建的每个非终结符来构建的,因此解析的最终结果不是非终结符本身(之前已知解析开始)而是附加到非终端的特定实例的语义属性,而每个点的词法扫描结果是一个非终端符号及其相关的语义属性;通常,语义属性将是关联的输入序列,或这些字符的某些功能。
无论如何,二级解析涉及将词法级别的输出非终结符作为句法级别的终结符。