- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如Wikipedia关于Parsing的文章所述,该过程分为三个阶段:
Lexical analysis(令牌化):将Unicode代码点转换为令牌
语法分析:验证令牌流形成有效的脚本/模块,并创建分析树
语义分析:令牌的其他验证(在创建“分析树”之后发生?
除了上面阶段(3)中的小混乱之外,我还想验证我对该过程的理解对ECMAScript是正确的。
因此,以下流程正确吗?
词法分析阶段(ECMAScript Clause 11)
输入:Unicode代码点流<-词汇语法中的终端符号
输出:有效记号<-词汇语法中的非终结符
语法应用
分析每个Unicode代码点(字符),一次
通过应用适当的生产规则,将尽可能长的终端符号序列替换为非终端符号
然后,再次应用生产规则,替换尽可能长的非终结符序列
以相同的方式,一次又一次地应用生产规则,一直到产生“目标符号”为止
目标符号是语法分析阶段(下一个阶段)的输入元素(也称为标记)
ECMAScript的词汇语法(spec states which to pick)存在多个“目标符号”
句法分析阶段(ECMAScript第12-15条)
输入:令牌流<-语法中的终端符号
输出:解析树,以脚本|模块作为根解析节点<-语法上的非终结符
语法应用
首先从输入元素流开始。代币
这些标记是语法中的终端符号
通过将最大符号流与合适的生产规则的RHS匹配来应用生产规则,然后用该规则的LHS非终端符号替换流
这一直持续到只剩下“目标符号”为止
ECMAScript:如果我们可以替换所有终端符号(标记)并以单个“目标符号”结尾(脚本|模块),则该程序有效
最佳答案
语法分析不遵循“最大修改”规则(选择最长匹配前缀)。实际上,据我所知,ECMA-262并未指定解析算法,但确实提供了明确的上下文无关文法,例如,除了某些语法外,还可以使用自底向上(LR(k))解析器进行解析自动分号插入的问题以及跨换行符(不是语法标记)的产品的一些限制。
但是,如§5.1.4中所述,语法实际上可以识别该语言的超集。其他限制以补充语法的形式提供。
一个澄清:与具有多个上下文相关的词汇目标符号相关的复杂性使得很难先将输入划分为词素,然后仅将词素组合为解析树。没有至少部分解析就不可能在每个点上都知道正确的词汇目标符号,因此可以方便地将句法和词汇解析交织在一起。实用的解析算法从左到右运行,基本上按输入顺序处理词素,因此可以按需进行词法分析,只有在解析器需要更多输入才能继续时才找到词素。
但是除此之外,您概述的总体结构是正确的。在词法分析中,将终端(字符)的尽可能长的前缀聚合到一个非终端中,以创建词素(根据关于哪个词法目标需要的稍微复杂的规则);在语法分析中,将终端(词汇)聚合为非终端,以生成与两个语法目标符号之一相对应的单个分析树。
就像现实世界中的语言经常出现的那样,现实并非如此干净。除了需要解析器指出需要哪个词汇目标外,还存在换行规则和自动分号插入,这两者都跨越了词汇和句法分析之间的边界。
注意:
单词“终端”和“非终端”的使用可能会有些混乱,但是我(和ECMA标准)在上下文无关的语法中将它们与标准含义一起使用。
上下文无关的语法由产生形式组成,每个产生形式具有:N ⇒ S …
其中,N
是非终结符,而S
是终结符或非终结符的可能为空的序列。终端符号是要识别的字符串表示形式中的原子。
标准的解析模型将解析分为两个级别:词法和句法。原始输入是一个字符序列;词法分析将其转换为一系列词素,这些词素是语法分析的输入。
标准的上下文无关文法只有一个目标符号,它是文法定义的非终结符之一。如果可以将整个输入减少到此非终端,则解析成功。
词法扫描可以看作是无上下文语法,带有目标符号的有序列表。它依次尝试每个输入目标的较长前缀的每个目标符号,并接受与最长前缀匹配的第一个目标符号。 (实际上,所有操作都是并行完成的;我在这里是从概念上讲的。)当ECMA-262讨论不同的词汇目标时,实际上意味着可能的目标非终结符的不同列表。
用语义属性扩展符号也很有用;这些属性不会影响解析,但是一旦解析完成,它们就很有用。特别是,解析树是通过将树节点作为属性附加到在解析过程中由生产创建的每个非终端而构建的,因此解析的最终结果不是非终端符号本身(之前知道解析开始),而是附加到非终结符的特定实例的语义属性,而每个点的词法扫描结果是非终结符及其相关的语义属性;通常,语义属性将是关联的输入序列或这些字符的某些功能。
无论如何,两级解析涉及将词法级的输出非终端作为句法级的终端。
关于javascript - 语法产生规则与ECMAScript中的解析如何相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51861736/
第一段代码工作正常,并给出了我需要的结果。我现在想做的是让它在 'as num' 上返回 3 个数字值对于“as num”上的 3 个不同值,对于同一列上的 3 个不同位置 SELEC
我想分析一些数据以编写定价算法。以下日期可用: 我需要三个变量/维度的函数/相关因子,它显示三个维度(pers_capacity、卧室数量、浴室数量)增长时中位数(价格)的变化。例如Y(#pers_c
正如标题所说 - 我的 Sprite Kit 游戏时不时地在后台崩溃,总是出现此错误 - Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Sub
假设我尝试保存以下数据,并且Songs模型的name属性上设置了Phalcon \ Mvc \ Model \ Validator \ PresenceOf验证器 // Get an existing
我有一个 if 控件,如下所示; if (Directory.Exists(System.IO.Path.Combine(systemPath, "Reports", companyName))
有人可以告诉我我们使用 ReadLine() 从文件 (.txt) 中读取特定行吗?现在我想读取文件的全部内容(不仅仅是第一行)。为此我需要使用什么方法。我用谷歌搜索了很多,但找不到解决方案。 我的代
我相信在大学时我用从 C 派生的语言为 FPGA 编写了一个程序。我了解 VHDL 和 verilog 等语言。但是,我不明白的是程序员在使用哪个方面有多少选择?它依赖于FPGA吗?我将使用 Xili
我有一个 if 控件,如下所示; if (Directory.Exists(System.IO.Path.Combine(systemPath, "Reports", companyName))
如何在运行时更改 Dashcode (Javascript) 中图像对象的源? 我试过: var image = document.getElementById("image").object;ima
我有几个相互关联的类,它们将被多种不同的算法使用 例子: struct B; struct A { B* parent; }; struct B { std::vector child
我正在开发一个网站,用户在客户收到的表中输入金额,如果任何客户没有提供分期付款(金额),则用户不会在表中输入任何金额,并且用户希望获取违约者的信息客户以10天为基础。所以我的问题是应该定义什么表和属性
我试图从上一个条目中选择一个值,并每次将该数字加一。我让它工作到选择当前条目值(默认 1000)并递增 1 并重新插入该值(因此每次最终都是 1001)。我需要它来选择该字段的最后一个条目,这样它将变
我不擅长“制作”查询。假设这是我的数据库: artist pics ------------------- -
最近,我要为我的网站做一个即时通知系统。我听说 COMET 在这种情况下必不可少。 我已经搜索 PHP 和 Comet 一段时间了,但是,我发现的指南和文章似乎只是循环中的 ajax 请求。例如,有一
我正在开发一款 iOS 游戏,我希望 clown 在场景外生成,然后向下移动。我的想法是全部创建它们,并将它们以 360 像素的距离放置在不可见的场景中。 像这样: SKSpriteNode *clo
我有以下子订单表。 mysql> select * from suborder; +-------------+------------------+ | order_state | bookin
这可能是一个有点初学者的问题,但考虑到在 Java 中调试编码是相当相关的:什么时候编码与 String 对象相关? 假设我有一个要保存到文件中的字符串对象。 String 对象本身是否使用某种我应该
首先我想说我是 CPP 的新手(我从 cpp11 开始):)考虑以下实体:学生(名字+姓氏)和组(描述+更多学生)。我在 C++ 中创建了以下 2 个类: class Student { privat
我正在尝试在单击该复选框时同步更新我的数据库。我决定使用 aJax,但它似乎无法识别 ajax。 代码:将成为 Switch_Active(this.id) 函数的元素 ... Deactivat
我正在创建一个菜单。菜单如下。 $('.category').mouseover(function() { $(this).removeClass('category').addClass('cate
我是一名优秀的程序员,十分优秀!