如Parsing上的Wikipedia文章所述,该过程分为三个阶段:
除了上面阶段(3)中的小混乱之外,我想验证我对ECMAScript的理解是正确的。
因此,以下流程正确吗?
答案 0 :(得分:4)
语法分析不遵循“最大修改”规则(选择最长匹配前缀)。实际上,据我所知,ECMA-262没有指定解析算法,但是提供了明确的上下文无关文法,可以使用例如自下而上(LR(k))解析器进行解析,自动分号插入的问题以及跨换行符(不是语法标记)的产品的一些限制。
但是,正如§5.1.4中所述,语法实际上可以识别该语言的超集。其他限制以补充语法的形式提供。
一个澄清:与具有多个上下文相关的词汇目标符号相关的复杂性使得很难先将输入划分为词素,然后仅将词素组合为解析树。没有至少部分解析就不可能在每个点上知道正确的词汇目标符号,因此可以方便地将句法和词汇解析交织在一起。实用的解析算法从左到右运行,基本上按输入顺序处理词素,因此可以按需进行词法分析,只有在解析器需要更多输入才能继续时才找到词素。
但是除此之外,您概述的总体结构是正确的。在词法分析中,将终端(字符)的尽可能长的前缀聚合到一个非词库中以创建词素(根据关于哪个词法目标需要的稍微复杂的规则);在语法分析中,终端(词素)被聚合为非终端,以产生与两个语法目标符号之一相对应的单个分析树。
就像现实世界中的语言经常出现的那样,现实并不那么干净。除了需要解析器指出需要哪个词汇目标外,还存在换行规则和自动分号插入,这两者都跨越了词汇和句法分析之间的边界。
使用“终端”和“非终端”一词可能会造成混淆,但是我(和ECMA标准)在上下文无关的语法中将它们与标准含义一起使用。
与上下文无关的语法由产生式组成,每个产生式具有以下形式:
N ⇒ S …
其中N
是非终结符符号,而S
是终结符或非终结符的可能为空的序列。终端符号是要识别的字符串表示形式中的原子。
标准解析模型将解析分为两个级别:词法和句法。原始输入是一个字符序列;词法分析将其转化为一系列词素,这些词素是语法分析的输入。
标准的无上下文语法具有单个目标符号,这是语法定义的非终结符之一。如果可以将整个输入减少到此非终端,则解析成功。
词汇扫描可以看作是具有上下文顺序的目标符号列表的无上下文语法。它依次尝试依次输入每个较长的前缀的每个目标符号,并接受与最长前缀匹配的第一个目标符号。 (实际上,所有操作都是并行完成的;我在这里是从概念上讲的。)当ECMA-262讨论不同的词汇目标时,实际上意味着可能的目标非终结点的列表也不同。
用语义属性扩展符号也很有用;这些属性不会影响解析,但是一旦解析完成,它们就很有用。特别是,通过将树节点作为属性附加到在解析过程中从生产创建的每个非终端上,来构建解析树,因此解析的最终结果不是非终端符号本身(以前知道解析开始),而是附加到该非终结符的特定实例的语义属性,而每个点的词法扫描结果是一个非终结符及其关联的语义属性;通常,语义属性将是关联的输入序列或这些字符的某些功能。
无论如何,两级解析涉及将词法级的输出非终结符作为语法级的终结符馈入。