簡體   English   中英

在OR賦值中圍繞yield表達式的括號需要括號的確切語法歧義是什么?

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

以下代碼......
假設收益率是發電機的功能,並且里面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

我第一次注意到這是在我寫的藍鳥 協程中。 修復是將yield wait()包裝在括號中。

此錯誤發生在分析時而不是執行時; 所以,我的第一個假設是,這是因為這里存在語法歧義。 我查看了yield關鍵字 ,它將其定義為:

[rv] = yield [expression];

yield接受一個表達式並返回一個值。 沒有||不會發生這種情況 (OR)operator as const value = yield else(); ; 所以,我查看了運算符優先級 || (OR)運算符在yield運算符2之前的5處進行評估。 優先級看起來不錯。

看起來像是|| (OR)運算符需要在任何一方使用表達式,而我假設yield [expression] 一個表達式,也許這不是真的嗎? 為什么我需要將該部分包含在括號中以使其明確表達式? 什么可以|| yield || yield與曖昧? 我確定我只是錯過了它; 或者,是否有一些偷偷摸摸/更深層次的原因?

這個問題也很難找到,所以希望我不會在這里重復。

(如果您想看到它,可以使用此Plunker https://plnkr.co/edit/rNidnFuyIOFkRkkcyWRV來發生錯誤。)

謝謝!

如果你想弄清楚語法規則,你必須看看規范

LogicalOrExpression定義為

LogicalANDExpression:
  BitwiseORExpression
  LogicalANDExpression && BitwiseORExpression

LogicalORExpression:
  LogicalANDExpression
  LogicalORExpression || LogicalANDExpression

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/上詢問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM