当前位置: 首页 > 知识库问答 >
问题:

ECMAScript中语法产生式规则与语法分析的关系

拓拔弘厚
2023-03-14

正如维基百科关于解析的文章所指出的,这个过程有三个阶段:

    null

除了上面阶段(3)中的小困惑之外,我想验证我对ECMAScript过程的理解是否正确。

那么,下面的流程是正确的吗?

  • 输入:Unicode码点流<--词法中的终端符号
  • 输出:有效标记<--词法语法中的非终结符号
  • 语法应用
    1. 分析每个Unicode码点(字符),每次一个
    2. 通过应用适当的产生式规则,
    3. 将最长的终端符号序列替换为非终端符号
    4. 然后,使用产生式规则替换最长的非终端符号序列
    5. 以同样的方式,产生式规则被一次又一次地应用,直到产生“目标符号”
  • 输入:标记流<-句法语法中的终端符号
  • 输出:解析树,以ScriptModule为根解析节点<--syntactic语法中的非终端符号
  • 语法应用
    1. 从输入元素流开始。令牌
    2. 这些标记是句法语法中的终端符号
    3. 通过将最大码元流与合适产生式规则的RHS匹配来应用产生式规则,然后用该规则的LHS非终端码元替换码流
    4. 这将持续到只剩下“目标符号”

共有1个答案

管炳
2023-03-14

句法分析不遵守“最大蒙克”规则(选择最长的匹配前缀)。事实上,据我所知,ECMA-262没有指定解析算法,但提供了一个明确的上下文无关语法,可以通过自底向上(LR(k))解析器进行解析,除了处理自动分号插入的一些问题和对跨换行(不是语法标记)的产生的一些限制之外。

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

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

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

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

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

上下文无关文法由产生式组成,每个产生式的形式如下:

nâS…

其中n是非终端符号,s可能是终端符号或非终端符号的空序列。终端符号是待识别字符串表示中的原子。

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

一个标准的上下文无关文法有一个单一的目标符号,它是文法定义的非终端之一。如果整个输入可以减少到这个非终端,则解析成功。

一个词法扫描可以被看作是一个与上下文无关的文法,它有一个有序的目标符号列表。它依次在输入的较长前缀上尝试每个目标符号,并接受与最长前缀匹配的第一个目标符号。(实际上,这一切都是并行进行的;我在这里是从概念上说的。)当ECMA-262谈到不同的词汇目标时,它实际上意味着可能的目标非终端的不同列表。

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

在任何情况下,两级解析都涉及到将输出的词法级非终端作为句法级的终端提供给词法级的非终端。

 类似资料:
  • 样式规则是CSS的基本单位,每个样式规则由选择器(selector)和声明块(declaration block)两个基本部分构成。 选择器决定为哪些元素应用样式,声明块定义相应的样式。声明块包裹在一对花括号中。声明块由一条或多条声明(declaration)组成,每条声明由一个属性和一个值组成,属性和值之间用冒号隔开。属性是希望设置的样式属性,每个属性有一个值。 具体来讲,一个样式规则由选择器、

  • 主要内容:JSON 中的键,JSON 中的值,JSON 与 JavaScript 对象的区别JSON 的语法与 JavaScript 中的对象很像,在 JSON 中主要使用以下两种方式来表示数据: Object(对象):键/值对(名称/值)的集合,使用花括号定义。在每个键/值对中,以键开头,后跟一个冒号,最后是值。多个键/值对之间使用逗号分隔,例如; Array(数组):值的有序集合,使用方括号定义,数组中每个值之间使用逗号进行分隔。 下面展示了一个简单的 JSON 数据: 注意:所有

  • CSS 样式由一系列规则组成,这些规则由 Web 浏览器解析,然后应用于 HTML 文档相应的元素上。CSS 样式规则由三个部分组成,分别是选择器、属性和值: 选择器:由 HTML 元素的 id、class 属性或元素名本身以及一些特殊符号构成,用来指定要为哪个 HTML 元素定义样式,例如选择器就表示为页面中的所有标签定义样式; 属性:您希望给 HTML 元素设置的样式名称,由一系列关键词组成,

  • 主要内容:1.换行符和空格,2.严格模式,3.ES6和Hoisting语法是定义符号排列的一组规则,每种语言规范都有其语法。 语法适用于文档代表源代码的编程语言,也适用于文档描述数据的标记语言。 JavaScript中的程序包括: 文字:文字可以定义为表示源代码中的固定值的符号。 通常,文字用于初始化变量。 在下面的示例中,可以看到文字的使用,其中表示整数文字,而字符串 - 是字符串文字。 变量:变量是由内存地址标识的存储位置。 变量是存储程序值的存储块的名称。 变

  • 我面前有一项任务,它依赖于解释文本的结构——准确地说,是一本单语词典。该词典有相当复杂的条目:多达29个唯一元素,有些元素嵌套在其他元素中。我正在为字典设计我自己的XML模式,但是我想写一个程序来自动解析我所拥有的纯文本。 我有一些Ruby的基本技能,我是一个经验丰富的正则表达式用户,但我认为创建大量的if树和非常长的正则表达式可能不是最好的主意。我已经找到了一些关于解析表达式语法、巴科斯范式和W

  • 我的语法允许以下操作: 我从其他语法中抓了几个东西来玩。我的主要问题是我的expr规则。给定以下输入:,我期望解析树会找到..规则,但它将解释0。并不正确解析其余部分。 如果在我的0后面加上一个空格,就可以了: 谢了!