为什么在 IdentifierName 的产生式中递归使用 IdentifierName 符号

Why use `IdentifierName` symbol recursively in the productions for the `IdentifierName`

我正在查看词汇 EcmaScript grammarIdentifierName 符号的以下产生式:

IdentifierName ::
    IdentifierStart
    IdentifierName IdentifierPart

我想知道为什么语法在第二行产生式中使用 IdentifierName

我首先想到的是 IdentifierName 可以扩展为 IdentifierStart 因此对于 IdentifierName 我们可以得到以下内容:

IdentifierName -> IdentifierStart IdentifierPart

可是这样不就可以这么说了吗?

IdentifierName ::
    IdentifierStart
    IdentifierStart IdentifierPart

    ^^^^
    here `IdentifierStart` instead of `IdentifierName`

如何使用此语法为变量名构建解析树 git

IdentifierStartIdentifierPart都只匹配一个字符。因此,如果规则是 IdentifierName -> IdentifierStart IdentifierPart,它只会匹配长度恰好为 2 的标识符,而您的第二个建议将匹配长度为 1 或 2 的标识符。

递归是规则如何匹配任意长度的标识符。


以下是您的推导方式 "git":

                 IdentifierName
                /              \
        IdentifierName IdentifierPart
       /              \         |
IdentifierName IdentifierPart  't'
       |                |
IdentiiferStart        'i'
       |
      'g'