为什么在 IdentifierName 的产生式中递归使用 IdentifierName 符号
Why use `IdentifierName` symbol recursively in the productions for the `IdentifierName`
我正在查看词汇 EcmaScript grammar 中 IdentifierName
符号的以下产生式:
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
我想知道为什么语法在第二行产生式中使用 IdentifierName
?
我首先想到的是 IdentifierName
可以扩展为 IdentifierStart
因此对于 IdentifierName
我们可以得到以下内容:
IdentifierName -> IdentifierStart IdentifierPart
可是这样不就可以这么说了吗?
IdentifierName ::
IdentifierStart
IdentifierStart IdentifierPart
^^^^
here `IdentifierStart` instead of `IdentifierName`
如何使用此语法为变量名构建解析树 git
?
IdentifierStart
和IdentifierPart
都只匹配一个字符。因此,如果规则是 IdentifierName -> IdentifierStart IdentifierPart
,它只会匹配长度恰好为 2 的标识符,而您的第二个建议将匹配长度为 1 或 2 的标识符。
递归是规则如何匹配任意长度的标识符。
以下是您的推导方式 "git":
IdentifierName
/ \
IdentifierName IdentifierPart
/ \ |
IdentifierName IdentifierPart 't'
| |
IdentiiferStart 'i'
|
'g'
我正在查看词汇 EcmaScript grammar 中 IdentifierName
符号的以下产生式:
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
我想知道为什么语法在第二行产生式中使用 IdentifierName
?
我首先想到的是 IdentifierName
可以扩展为 IdentifierStart
因此对于 IdentifierName
我们可以得到以下内容:
IdentifierName -> IdentifierStart IdentifierPart
可是这样不就可以这么说了吗?
IdentifierName ::
IdentifierStart
IdentifierStart IdentifierPart
^^^^
here `IdentifierStart` instead of `IdentifierName`
如何使用此语法为变量名构建解析树 git
?
IdentifierStart
和IdentifierPart
都只匹配一个字符。因此,如果规则是 IdentifierName -> IdentifierStart IdentifierPart
,它只会匹配长度恰好为 2 的标识符,而您的第二个建议将匹配长度为 1 或 2 的标识符。
递归是规则如何匹配任意长度的标识符。
以下是您的推导方式 "git":
IdentifierName
/ \
IdentifierName IdentifierPart
/ \ |
IdentifierName IdentifierPart 't'
| |
IdentiiferStart 'i'
|
'g'