1unitedpower: Wie leite ich (x => x) ab?

Lese ich die EcmaScript2016 Spezifikation falsch oder kann man den Ausdruck (x => x) tatsächlich nicht in der Syntax Ableiten? Mein Versuch scheitert sobald ich an der Position des Funktionskörpers das Nicht-Terminal AssignmentExpression abgeleitet habe. Alle modernen JavaScript-Engines mit Unterstützung für arrow functions akzeptieren den Ausdruck übrigens.

PrimaryExpression →
CoverParenthesizedExpressionAndArrowParameterList →
(Expression) →
(AssignmentExpression) →
(ArrowFunction) →
(ArrowParameters => ConciseBody) →
(ArrowParameters => AssignmentExpression) → ???

akzeptierte Antworten

  1. Je länger ich mich damit befasse, desto wahrscheinlicher erscheint es mir, dass es sich hierbei um einen Fehler in der Spezifikation handelt. Ich habe es vorsichtshalber als Bug bei GitHub gefilet. Das Problem ist meiner Ansicht nach, dass das Nicht-Terminal AssignmentExpression nicht genügend Produktionsregeln bietet. Wenn dem tatsächlich so ist, dann wäre auch var x = 42 kein gültiges Programm nach Ecma262.

    1. Dieses Problem besteht nur für die zusammengefasste Syntax aus Anhang A der Spezifikation. Die normative Syntax hat eine Produktionsregel PostfixExpression : LeftHandSideExpression die es ermöglicht den Term in folgender Weise abzuleiten:

      PrimaryExpression →
      CoverParenthesizedExpressionAndArrowParameterList →
      (Expression) →
      (AssignmentExpression) →
      (ArrowFunction) →
      (ArrowParameters => ConciseBody) →
      (ArrowParameters => AssignmentExpression)  →
      (ArrowParameters => ConditionalExpression)  →
      (ArrowParameters => LogicalORExpression)  →
      (ArrowParameters => LogicalANDExpression) →
      (ArrowParameters => BitwiseORExpression) →
      (ArrowParameters => BitwiseXORExpression) →
      (ArrowParameters => BitwiseANDExpression) →
      (ArrowParameters => EqualityExpression) →
      (ArrowParameters => RelationalExpression) →
      (ArrowParameters => ShiftExpression) →
      (ArrowParameters => AdditiveExpression) →
      (ArrowParameters => MultiplicativeExpression) →
      (ArrowParameters => UnaryExpression) →
      (ArrowParameters => PostfixExpression) →
      (ArrowParameters => LeftHandSideExpression) →
      (ArrowParameters => NewExpression) →
      (ArrowParameters => MemberExpression) →
      (ArrowParameters => PrimaryExpression) →
      (ArrowParameters => IdentifierReference) →
      (ArrowParameters => Identifier) →
      (ArrowParameters => IdentifierName) →
      (ArrowParameters => IdentifierStart) →
      (ArrowParameters => UnicodeIDStart) →
      (ArrowParameters => x) →
      (BindingIdentifier => x) →
      (Identifier => x) →
      (IdentifierName => x) →
      (IdentifierStart => x) →
      (UnicodeIDStart => x) →
      (x => x)