需要在 OR 赋值中的 yield 表达式周围加上括号的确切句法歧义是什么?

What is the exact syntactic ambiguity that requires parentheses around a yield expression in an OR assignment?

下面的代码...
假设 yield 在一个生成器函数中并且定义了 somethingelse

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/.

上询问