ECMAScript 2017:字符串文字、StringValue、String value 和 SV 之间的区别

Posted

技术标签:

【中文标题】ECMAScript 2017:字符串文字、StringValue、String value 和 SV 之间的区别【英文标题】:ECMAScript 2017: Difference between string literal, StringValue, String value, and SV 【发布时间】:2018-09-13 02:16:34 【问题描述】:

以下摘录参考ECMAScript 2017。

11.8.4.2 静态语义:StringValue

StringLiteral::
    "DoubleStringCharactersopt"
    'SingleStringCharactersopt'

1. Return the String value whose elements are the SV of this StringLiteral.

11.8.4.3 静态语义:SV

字符串文字代表字符串类型的值。字符串 文字的值 (SV) 用代码单元值来描述 由字符串文字的各个部分贡献。

问题

在上面的摘录中,出现了以下术语:

    string literal 非终结符StringLiteral String value SV

谁能帮助解释这些术语之间的区别?

另外,11.8.4.2 的最后一句是什么意思?

【问题讨论】:

在我看来,如括号所示,SV 是字符串值的缩写。 你的意思是非终结符StringLiteral 对吧? StringValue 不是语法的一部分,它是语义规则的一部分。 感谢@Pointy,修正了错字。 【参考方案1】:

字符串字面量是您(人类编写或阅读代码)可以识别为序列"..."'...'的东西

标记 StringLiteral 是 EMCAScript 正式语法中的 nonterminal,可以用作为实际字符串文字的终端替换。

字符串值是字符串文字的语义内容。规范说

文字的字符串值(SV)是...

因此,我们可以确定一个字符串字面量一个字符串值:某个字符串字面量的字符串值是一个代码单元值的集合。

标识符 SV 似乎是“字符串值”的简写(可互换使用)。


还有,11.8.4.2最后一句是什么意思?

每个非终结符在计算时都会“返回”一些值。线

返回其元素是此 StringLiteral 的 SV 的 String 值。

简单地说,当解析器在程序文本中找到一个 StringLiteral 时,解析该非终结符的结果是与刚刚解析的 StringLiteral 关联的字符串值(即代码单元值的集合)。

【讨论】:

啊,谢谢。这是对的吗:词法分析器使用指定的词法语法(通常用正则表达式表示)将源代码转换为有效的标记,这只是终端符号。然后,解析器评估这些标记并将它们转换为机器代码(或类似代码)? @Magnus 这可能是对的,但我不是解析专家。语法非常深入(逐个字符级别),但不处理空格(例如,1+11 + 1 相同)因此词法分析器可能会通过标记化消除空格问题第一的。是的,解析器会解析标记,有时会执行“静态语义”步骤,这些步骤由简单语法规则之外的操作和错误规则组成(参见ecma-international.org/ecma-262/8.0/…)【参考方案2】:

您正在查看的许多术语对于 javascript 平台维护者来说确实很有价值;实际上,您几乎可以肯定已经知道“字符串”是什么。其他术语对于阅读规范很有用。

StringLiteral 一词指的是一段 JavaScript 源代码,JavaScript 程序员会查看并称之为“字符串”;换句话说,在

let a = "hello world";

StringLiteral= 右侧从开始双引号到结束双引号的连续字符。它是“非终结符”,因为它不是语法定义中的“终结符”符号。语言语法是从最低级别的终结符号和非终结符号构建的,以描述程序的更高级别的子部分。您在双引号字符串的描述中看到的粗体双引号字符是终端符号的示例。

术语StringValue 指的是适用于语法的多个组件的内部操作;对于StringLiteral,它具有您发布的相当明显的定义。语义规则是根据构成某些语法概念的非终结符来编写的。

术语String valueSV 用于描述字符串的分段部分。

JavaScript 规范的术语特别古怪,因为语言委员会一直坚持描述在语言采用的早期随意演变的语义。发明具有明显冗余的术语层是一种应对创建明确描述代码应该做什么的困难的方法,直到最后的细节和奇怪的特殊情况。更复杂的是(出于我不知道的原因)词汇语法被分解为与高级构造一样多的令人痛苦的细节,所以这确实加剧了规范的挑剔感。

当知道术语的扩展会很有用时,一个例子可能是解释为什么在从字符串文字而不是正则表达式文字构建正则表达式时,为什么有必要在反斜杠上“加倍”。很明显,调用 RegExp 构造函数:

var r = new RegExp("foo\\.bar");

有一个只包含一个StringLiteral 的表达式。然后,为了调用构造函数,该操作的语义规则将在某些时候调用获取该文字的StringValue(以及因此SV),并且这些规则包含每个文字的详细信息.这就是您遇到的事实,即 SV 语义具有反斜杠规则,特别是一个说两个反斜杠折叠为一个的规则。

现在我并不是说这种解释会比简单的解释更好,但问题的每一个细节都非常清楚。

【讨论】:

以上是关于ECMAScript 2017:字符串文字、StringValue、String value 和 SV 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

ECMAScript6重复字符串方法repeat()

ECMAScript6面对大于0xFFFF的Unicode字符如何正确返回长度

将字符串缩小到字符串文字并集

ECMAScript 2017(ES8)特性概述

打字模块 - 字符串文字类型

连接字符串文字上的 c_str() 是不是安全?