[英]What is the exact syntactic ambiguity that requires parentheses around a yield expression in an OR assignment?
以下代碼......
假設收益率是發電機的功能,並且里面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
我第一次注意到這是在我寫的藍鳥 協程中。 修復是將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來發生錯誤。)
謝謝!
如果你想弄清楚語法規則,你必須看看規范 。
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.