需要在 OR 赋值中的 yield 表达式周围加上括号的确切句法歧义是什么?
What is the exact syntactic ambiguity that requires parentheses around a yield expression in an OR assignment?
下面的代码...
假设 yield 在一个生成器函数中并且定义了 something
和 else
等
const value = something || yield else();
...在 V8(Chrome 或 Nodejs)中生成以下内容:
const start = initial || yield wait();
^^^^^
SyntaxError: Unexpected strict mode reserved word
...在 Firefox 中是这样的:
SyntaxError: yield is a reserved identifier
我在 bluebird coroutine 写作时第一次注意到了这一点。解决方法是将 yield wait()
括在括号中。
这个错误发生在解析时而不是执行时;所以,我的第一个假设是,这是因为这里存在句法歧义。我查看了 the yield keyword 并将其定义为:
[rv] = yield [expression];
yield
取一个表达式,returns 取一个值。如果没有 ||
(OR) 运算符 const value = yield else();
,这确实 not 发生;所以,我查看了 operator precedence。 ||
(OR) 运算符在 5 处计算,然后 yield
运算符在 2 处计算。优先级看起来不错。
看起来 ||
(OR) 运算符的两边都需要一个表达式,虽然我假设 yield [expression]
是 一个表达式,也许那是不对?为什么我需要将该部分括在括号中以使其 明确地 成为一个表达式? || yield
有什么含糊不清的地方?我确定我只是想念它;或者,这有什么 sneaky/deeper 原因吗?
这个问题也是出了名的难以搜索,所以希望我没有在这儿作弊。
(如果您愿意,可以使用这个 Plunker https://plnkr.co/edit/rNidnFuyIOFkRkkcyWRV 来使错误发生。)
谢谢!
要想搞清楚语法规则,就得look at the spec。
A LogicalOrExpression 定义为
LogicalANDExpression:
BitwiseORExpression
LogicalANDExpression && BitwiseORExpression
LogicalORExpression:
LogicalANDExpression
LogicalORExpression || LogicalANDExpression
A LogicalANDExpression 只能包含 BitwiseORExpression。但是 YieldExpression 不是 BitwiseORExpression,而是 AssignmentExpression:
AssignmentExpression:
ConditionalExpression
[+Yield] YieldExpression
ArrowFunction
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperatorAssignmentExpression
基本上它在表达式层次结构中更高:
+--------------------------+
| AssignmentExpression |
+--------------------------+
^
|
+----------------+---------------+
| |
| |
+--------------------------+ +--------------------------+
| ConditionalExpression | | YieldExpression |
+--------------------------+ +--------------------------+
^
|
|
+--------------------------+
| LogicalORExpression |
+--------------------------+
^
|
|
+--------------------------+
| LogicalANDExpression |
+--------------------------+
^
|
|
+--------------------------+
| BitwiseORExpression |
+--------------------------+
对于 为什么 语法结构如此的可能解释是 yield
也是一个有效的标识符名称(在生成器或 yield 表达式之外)。但有关更多详细信息,您可能想在 https://esdiscuss.org/.
上询问
下面的代码...
假设 yield 在一个生成器函数中并且定义了 something
和 else
等
const value = something || yield else();
...在 V8(Chrome 或 Nodejs)中生成以下内容:
const start = initial || yield wait();
^^^^^
SyntaxError: Unexpected strict mode reserved word
...在 Firefox 中是这样的:
SyntaxError: yield is a reserved identifier
我在 bluebird coroutine 写作时第一次注意到了这一点。解决方法是将 yield wait()
括在括号中。
这个错误发生在解析时而不是执行时;所以,我的第一个假设是,这是因为这里存在句法歧义。我查看了 the yield keyword 并将其定义为:
[rv] = yield [expression];
yield
取一个表达式,returns 取一个值。如果没有 ||
(OR) 运算符 const value = yield else();
,这确实 not 发生;所以,我查看了 operator precedence。 ||
(OR) 运算符在 5 处计算,然后 yield
运算符在 2 处计算。优先级看起来不错。
看起来 ||
(OR) 运算符的两边都需要一个表达式,虽然我假设 yield [expression]
是 一个表达式,也许那是不对?为什么我需要将该部分括在括号中以使其 明确地 成为一个表达式? || yield
有什么含糊不清的地方?我确定我只是想念它;或者,这有什么 sneaky/deeper 原因吗?
这个问题也是出了名的难以搜索,所以希望我没有在这儿作弊。
(如果您愿意,可以使用这个 Plunker https://plnkr.co/edit/rNidnFuyIOFkRkkcyWRV 来使错误发生。)
谢谢!
要想搞清楚语法规则,就得look at the spec。
A LogicalOrExpression 定义为
LogicalANDExpression:
BitwiseORExpression
LogicalANDExpression && BitwiseORExpression
LogicalORExpression:
LogicalANDExpression
LogicalORExpression || LogicalANDExpression
A LogicalANDExpression 只能包含 BitwiseORExpression。但是 YieldExpression 不是 BitwiseORExpression,而是 AssignmentExpression:
AssignmentExpression:
ConditionalExpression
[+Yield] YieldExpression
ArrowFunction
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperatorAssignmentExpression
基本上它在表达式层次结构中更高:
+--------------------------+
| AssignmentExpression |
+--------------------------+
^
|
+----------------+---------------+
| |
| |
+--------------------------+ +--------------------------+
| ConditionalExpression | | YieldExpression |
+--------------------------+ +--------------------------+
^
|
|
+--------------------------+
| LogicalORExpression |
+--------------------------+
^
|
|
+--------------------------+
| LogicalANDExpression |
+--------------------------+
^
|
|
+--------------------------+
| BitwiseORExpression |
+--------------------------+
对于 为什么 语法结构如此的可能解释是 yield
也是一个有效的标识符名称(在生成器或 yield 表达式之外)。但有关更多详细信息,您可能想在 https://esdiscuss.org/.