`yield`和`await`生产参数如何在标识符之前扩展为`*`和`async`

时间:2017-09-05 15:43:35

标签: parsing ecmascript-6 context-free-grammar compiler-construction

任何人都可以解释以下制作如何扩展为*async关键字:

BindingIdentifier[Yield, Await]:
   Identifier
   [~Yield]yield
   [~Await]await

根据TypeScript解析代码,我看到它会检查*async个关键字,因此我假设BindingIdentifier_Yield匹配*identifierBindingIdentifier_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_YieldBindingIdentifier_Await如何扩展为*async?我怀疑解释是在这里:

[~Yield]yield
[~Await]await

但我不确定。欢迎任何帮助!

1 个答案:

答案 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