ECMAScript | Помеченные операторы

ECMAScript | Помеченные операторы

Синтаксис помеченных операторов

LabelledStatement [Yield, Await, Return] :

LabelIdentifier [?Yield, ?Await] : LabelledItem [?Yield, ?Await, ?Return]

LabelledItem [Yield, Await, Return] :

Statement [?Yield, ?Await, ?Return]

FunctionDeclaration [?Yield, ?Await, ~Default]

 

Примечание

Заявление Statement может быть предварено меткой. Помеченные операторы используются только вместе с помеченными операторами break и continue. В ECMAScript нет оператора goto. Заявление Statement может быть частью LabelledStatement, который сам может быть частью LabelledStatement и т. д. Введённые таким образом метки вместе называются «текущим набором меток» (current label set) при описании семантики отдельных операторов.

 

14.13.1 Статическая семантика: ранние ошибки

LabelledItem : FunctionDeclaration

  • Если какой-либо исходный текст соответствует этому правилу, это является синтаксической ошибкой.
Примечание

Альтернативное определение этого правила приведено в разделе B.3.1.

 

14.13.2 Статическая семантика: IsLabelledFunction ( stmt )

Абстрактная операция IsLabelledFunction (Является Ли Помеченным Оператором) принимает аргумент stmt. При вызове она выполняет следующие шаги:

1. Если stmt не является LabelledStatement, верните false.
2. Пусть item будет LabelledItem для stmt.
3. Если item является LabelledItem : FunctionDeclaration, верните true.
4. Пусть subStmt будет выражением Statement элемента item.
5. Верните IsLabelledFunction(subStmt).

 

14.13.3 Семантика времени выполнения: оценка

LabelledStatement : LabelIdentifier : LabelledItem

1. Пусть newLabelSet будет новым пустым Списком.
2. Верните LabelledEvaluation этого LabelledStatement с аргументом newLabelSet.

 

14.13.4 Семантика времени выполнения: LabelledEvaluation

С параметром labelSet.

BreakableStatement : IterationStatement

1. Пусть stmtResult будет LoopEvaluation для IterationStatement с аргументом labelSet.
2. Если stmtResult.[[Type]] является break, то
  а. Если stmtResult.[[Target]] является empty, то
    i. Если stmtResult.[[Value]] является empty, установите для stmtResult значение NormalCompletion(undefined).
    ii. В противном случае установите для stmtResult значение NormalCompletion(stmtResult.[[Value]]).
3. Вернуть завершение Completion(stmtResult).

BreakableStatement : SwitchStatement

1. Пусть stmtResult будет результатом вычисления SwitchStatement.
2. Если stmtResult.[[Type]] является break, то
  а. Если stmtResult.[[Target]] является empty, то
    i. Если stmtResult.[[Value]] является empty, установите для stmtResult значение NormalCompletion(undefined).
    ii. В противном случае установите для stmtResult значение NormalCompletion(stmtResult.[[Value]]).
3. Вернуть завершение Completion(stmtResult).
Примечание 1

BreakableStatement — это оператор, из которого можно выйти с помощью безымянного BreakStatement.

LabelledStatement : LabelIdentifier : LabelledItem

1. Пусть label будет строковым значением StringValue для LabelIdentifier.
2. Пусть newLabelSet будет конкатенацией списка labelSet и «label».
3. Пусть stmtResult будет LabelledEvaluation для LabelledItem с аргументом newLabelSet.
4. Если stmtResult.[[Type]] является break, а SameValue(stmtResult.[[Target]], label) является true, то
  а. Установите для stmtResult значение NormalCompletion(stmtResult.[[Value]]).
5. Вернуть Завершение Completion(stmtResult).

LabelledItem : FunctionDeclaration

1. Верните результат вычисления FunctionDeclaration.

Statement :

BlockStatement

VariableStatement

EmptyStatement

ExpressionStatement

IfStatement

ContinueStatement

BreakStatement

ReturnStatement

WithStatement

ThrowStatement

TryStatement

DebuggerStatement

1. Верните результат оценки Statement.
Примечание 2

Только два производства заявления Statement, которые имеют особую семантику для LabelledEvaluation, — это BreakableStatement и LabelledStatement.

 

Информационные ссылки

Стандарт ECMAScript — Раздел «14.13 Labelled Statements» — https://tc39.es/ecma262/#sec-labelled-statements