JavaScript语法中,:、::和:::有什么区别?

11

在Javascript的ECMAScript语法规范中,有双冒号定义的块如下:

Literal ::
    NullLiteral
    BooleanLiteral
    NumericLiteral
    StringLiteral
    RegularExpressionLiteral

并且像这样只使用一个冒号定义的块:

PrimaryExpression :
    this
    Identifier
    Literal
    ArrayLiteral
    ObjectLiteral
    ( Expression )

而且,即使是带有三个冒号的块:

uriCharacter :::
    uriReserved
    uriUnescaped
    uriEscaped

单冒号、双冒号和三冒号有什么区别?


1
这在第5.1节:语法和词汇语法中有解释。 - Leonid Beschastny
@LeonidBeschastny - 我已经看过并阅读了那个部分,但不知道它是什么意思。 如果您能解释一下它的含义,请在答案中说明。 - jfriend00
1
@guest271314 - 我正在尝试理解JS语法的一些细节,并想到冒号的差异一定有意义。 - jfriend00
1
FYI,我研究JS语法的原因之一是这个问题和答案:https://dev59.com/1F4b5IYBdhLWcg3wXAZ1#29251025 - jfriend00
1
刚刚意识到还有三个冒号(已将其添加到问题中)。 - jfriend00
显示剩余8条评论
2个回答

3
JSON词法语法用于将字符序列转换为令牌,类似于ECMAScript词法语法的部分内容。JSON句法语法描述了如何从JSON词法语法中的令牌序列形成句法正确的JSON对象描述。
对于表达式的语法规则(“:”),表示“各个部分如何相互作用”。它定义了规则,例如“5.5 abc没有意义”。
三个冒号(“:::”)似乎专门用于定义将字符串转换为数字的规则。带有空格的字符串“ 0x1235 ”是一个有效的数。这些三重冒号规则定义了此类情况。
三个冒号(“:::”)似乎也用于uri字符串语法。最常见的用法是这样:"f%20o%20o" 解码为"f o o"。这些规则定义了字符串“数字”部分的结构。

4
我相信这是正确的,但不清楚这个区别如何适用于所给出的例子。你能澄清一下这些例子之间的区别吗? - Vitruvie
你能解释一下你所写的内容如何适用于我在问题中提到的三个例子吗?因为我并没有按照你的解释理解。例如,为什么Literal要使用::?在::后列出的项目并不涉及与部件的交互 - 它们是可以单独作为Literal的项目列表。 - jfriend00
@jfriend00,你解决了吗?我相信 : 表示在词法分析期间用于生成输入标记流的语法,而 :: 语法则用于在语法分析期间生成解析树。 - Max Koretskyi

1
请看标准 ECMA-262 5.1 版本 / 2011 年 6 月 /

5.1.1 上下文无关文法

上下文无关文法由多个产生式组成。每个产生式有一个抽象符号作为其左部,称为非终结符,并且有零个或多个非终结符和终结符构成的序列作为其右部。对于每个文法,终结符从特定字母表中选取。

从一个由单个显著的非终结符组成的句子开始,给定一个上下文无关文法指定了一种语言,即可能的终结符序列的(可能是无限的)集合,这些序列可以通过用任何以非终结符为左部的产生式的右部替换序列中的非终结符来得到。

5.1.6 文法符号表示法

词法和字符串文法的终结符以及语法文法的某些终结符以等宽字体显示,无论是在文法的产生式中还是在本规范中直接引用此类终结符的文本中都是如此。这些应该按照原样出现在程序中。以这种方式指定的所有终结符字符都应被理解为ASCII范围内的适当Unicode字符,而不是其他Unicode范围中看起来相似的字符。

非终结符以斜体显示。非终结符的定义由要定义的非终结符的名称后跟一个或多个冒号引入。(冒号的数量表示产生式属于哪个文法。)然后,在后续行中,一个或多个非终结符的备选右部跟随。例如,语法定义如下:

   WhileStatement :
     while(Expression) Statement

该定义说明非终结符WhileStatement表示令牌while,后跟左括号令牌,后跟表达式,后跟右括号令牌,最后跟语句。表达式和语句的出现本身就是非终结符。作为另一个例子,语法定义如下:

   ArgumentList :
     AssignmentExpression
     ArgumentList , AssignmentExpression

:::

生产数字字符串文法的过程使用三个冒号":::"作为标点符号进行区分。

::

词法和正则表达式语法的产生式由两个冒号 "::" 分隔,这是其区别之处。词法和正则表达式语法共享一些产生式。

:

语法语法的产生是通过只使用一个冒号“:”作为标点符号来区分的。
请注意,
JSON词法语法的产生是通过使用两个冒号“::”作为分隔符来区分的。 JSON词法语法使用了ECMAScript词法语法的一些产生式。 JSON语法语法类似于ECMAScript语法语法的某些部分。 JSON语法语法的产生是通过使用一个冒号“:”作为分隔符来区分的。

2
那么,“词法和RegExp语法的产生”,“语法语法的产生”和“数字字符串语法的产生”究竟是什么?我在规范中读到了这些内容,但不知道它们是什么。我正在寻找有人用英语解释这些内容。 - jfriend00
@jfriend00 如果正确解释规范,基本上似乎提供了编写 js 的指导;当实际语言或语言实现由特定实现的作者定义时。请参见符合性 “ECMAScript 的符合实现必须提供和支持本规范中描述的所有类型、值、对象、属性、函数和程序语法和语义。” 在答案中,Production 将是 WhileStatement : // 在此处使用语法定义内容 - guest271314
@jfriend00,我从未从头开始编写过js,如文件中所述;但我已经编写了http://www.w3.org/TR/html4/sgml/dtd.html中的`DTD`,并为在`HTML`,`XML`中使用的自定义标记进行了组合。 这是最接近实际构图的描述。然而,即使是在js中,我也可以“看到”如何编写js以创建自定义实现Production-> Grammar,利用文档中的模式。 在原始问题下方的最后评论中的链接似乎相当描述了这个过程,使用术语“宏”。 - guest271314

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接