任何人都可以解释以下制作如何扩展为*
和async
关键字:
BindingIdentifier[Yield, Await]:
Identifier
[~Yield]yield
[~Await]await
根据TypeScript解析代码,我看到它会检查*
和async
个关键字,因此我假设BindingIdentifier_Yield
匹配*identifier
和BindingIdentifier_Await
匹配async identifier
,但我似乎无法使用上述语法跟踪扩展。
我知道我可以根据规范扩展标识符[Yield, Await]
:
可以通过下标的注释来参数化生产 form“[parameters]”...参数化生产是a的简写 定义参数名称的所有组合的一组产品, 前面加一个下划线,附加到参数化的非终结符号 符号
所以上面的内容扩展为:
BindingIdentifier:
Identifier
[~Yield]yield
[~Await]await
BindingIdentifier_Yield:
Identifier
[~Yield]yield
[~Await]await
BindingIdentifier_Await:
Identifier
[~Yield]yield
[~Await]await
但是,BindingIdentifier_Yield
和BindingIdentifier_Await
如何扩展为*
和async
?我怀疑解释是在这里:
[~Yield]yield
[~Await]await
但我不确定。欢迎任何帮助!
答案 0 :(得分:1)
检查*
令牌in Typescript是否存在以处理
14.1:
FunctionExpression[Yield, Await, Default]:
function BindingIdentifier[?Yield, ?Await]opt ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] }
VS
14.4:
GeneratorExpression[Yield, Await, Default]:
function* BindingIdentifier[?Yield, ?Await]opt ( FormalParameters[+Yield, ~Await] ) { GeneratorBody }
因为函数和生成器表达式都可以从PrimaryExpression扩展:
PrimaryExpression:
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression <---------
ClassExpression
GeneratorExpression <---------
AsyncFunctionExpression
RegularExpressionLiteral
TemplateLiteral
这些检查也与函数声明和方法语法重叠。
制作
BindingIdentifier [Yield, Await]:
Identifier
[~Yield] yield
[~Await] await
扩展为
BindingIdentifier:
Identifier
yield
await
BindingIdentifier_Yield:
Identifier
await
BindingIdentifier_Await:
Identifier
yield
BindingIdentifier_Yield_Await:
Identifier
因此,在语法中使用yield
和/或await
的情况下,不允许使用+Yield
和+Await
个标识符。您可以在上面的示例中看到,他们使用
FormalParameters[~Yield, ~Await]
FunctionBody[~Yield, ~Await]
而发电机使用
FormalParameters[+Yield, ~Await]
FunctionBody[+Yield, ~Await]
由于生成器代表+Yield
而不是~Yield
,因此意味着
function foo(){ var yield; } // works
function* foo(){ var yield; } // not allowed